diff options
author | Thomas Haller <thaller@redhat.com> | 2017-09-28 18:48:39 +0200 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2017-10-09 22:06:25 +0200 |
commit | 2e146148702615f31209f6ccc07ca02663eddb7b (patch) | |
tree | 98c7d5a1739491ac0745a16b5d5162206bfe5700 | |
parent | 01930c96b853f2fc776a02cd394167b99ab6a8ea (diff) | |
download | NetworkManager-2e146148702615f31209f6ccc07ca02663eddb7b.tar.gz |
core: use ipv6.route-table setting for other IPv6 routes
Including device-routes, default-route, SLAAC.
-rw-r--r-- | src/devices/nm-device.c | 3 | ||||
-rw-r--r-- | src/nm-iface-helper.c | 2 | ||||
-rw-r--r-- | src/nm-ip6-config.c | 8 | ||||
-rw-r--r-- | src/nm-ip6-config.h | 4 | ||||
-rw-r--r-- | src/vpn/nm-vpn-connection.c | 14 |
5 files changed, 24 insertions, 7 deletions
diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c index d5307377da..67f87adb7f 100644 --- a/src/devices/nm-device.c +++ b/src/devices/nm-device.c @@ -6607,6 +6607,7 @@ ip6_config_merge_and_apply (NMDevice *self, memset (&default_route, 0, sizeof (default_route)); default_route.rt_source = NM_IP_CONFIG_SOURCE_USER; default_route.gateway = *gateway; + default_route.table_coerced = nm_platform_route_table_coerce (nm_device_get_route_table (self, AF_INET6, TRUE)); default_route.metric = route_metric_with_penalty (self, default_route_metric); default_route.mss = nm_ip6_config_get_mss (composite); nm_clear_nmp_object (&priv->default_route6); @@ -6632,6 +6633,7 @@ END_ADD_DEFAULT_ROUTE: if (commit) { nm_ip6_config_add_device_routes (composite, + nm_device_get_route_table (self, AF_INET6, TRUE), default_route_metric); } @@ -7514,6 +7516,7 @@ ndisc_config_changed (NMNDisc *ndisc, const NMNDiscData *rdata, guint changed_in nm_ip6_config_reset_routes_ndisc (priv->ac_ip6_config, rdata->routes, rdata->routes_n, + nm_device_get_route_table (self, AF_INET6, TRUE), nm_device_get_route_metric (self, AF_INET6)); } diff --git a/src/nm-iface-helper.c b/src/nm-iface-helper.c index 66bebbbc6f..4c21f40e12 100644 --- a/src/nm-iface-helper.c +++ b/src/nm-iface-helper.c @@ -211,6 +211,7 @@ ndisc_config_changed (NMNDisc *ndisc, const NMNDiscData *rdata, guint changed_in nm_ip6_config_reset_routes_ndisc (ndisc_config, rdata->routes, rdata->routes_n, + RT_TABLE_MAIN, global_opt.priority_v6); } @@ -230,6 +231,7 @@ ndisc_config_changed (NMNDisc *ndisc, const NMNDiscData *rdata, guint changed_in nm_ip6_config_merge (existing, ndisc_config, NM_IP_CONFIG_MERGE_DEFAULT); nm_ip6_config_add_device_routes (existing, + RT_TABLE_MAIN, global_opt.priority_v6); if (!nm_ip6_config_commit (existing, NM_PLATFORM_GET, diff --git a/src/nm-ip6-config.c b/src/nm-ip6-config.c index a5fb3a3c23..480465e5b9 100644 --- a/src/nm-ip6-config.c +++ b/src/nm-ip6-config.c @@ -470,6 +470,7 @@ nm_ip6_config_capture (NMDedupMultiIndex *multi_idx, NMPlatform *platform, int i void nm_ip6_config_add_device_routes (NMIP6Config *self, + guint32 route_table, guint32 route_metric) { const NMIP6ConfigPrivate *priv; @@ -513,6 +514,7 @@ nm_ip6_config_add_device_routes (NMIP6Config *self, route->ifindex = ifindex; route->rt_source = NM_IP_CONFIG_SOURCE_KERNEL; + route->table_coerced = nm_platform_route_table_coerce (route_table); route->metric = route_metric; if (has_peer) { @@ -1855,7 +1857,8 @@ void nm_ip6_config_reset_routes_ndisc (NMIP6Config *self, const NMNDiscRoute *routes, guint routes_n, - guint32 metric) + guint32 route_table, + guint32 route_metric) { NMIP6ConfigPrivate *priv; guint i; @@ -1884,7 +1887,8 @@ nm_ip6_config_reset_routes_ndisc (NMIP6Config *self, r->plen = ndisc_route->plen; r->gateway = ndisc_route->gateway; r->rt_source = NM_IP_CONFIG_SOURCE_NDISC; - r->metric = metric; + r->table_coerced = nm_platform_route_table_coerce (route_table); + r->metric = route_metric; if (_nm_ip_config_add_obj (priv->multi_idx, &priv->idx_ip6_routes_, diff --git a/src/nm-ip6-config.h b/src/nm-ip6-config.h index 25868fb74b..8b738331f7 100644 --- a/src/nm-ip6-config.h +++ b/src/nm-ip6-config.h @@ -109,6 +109,7 @@ NMIP6Config *nm_ip6_config_capture (struct _NMDedupMultiIndex *multi_idx, NMPlat gboolean capture_resolv_conf, NMSettingIP6ConfigPrivacy use_temporary); void nm_ip6_config_add_device_routes (NMIP6Config *self, + guint32 route_table, guint32 route_metric); gboolean nm_ip6_config_commit (const NMIP6Config *self, @@ -216,6 +217,7 @@ struct _NMNDiscRoute; void nm_ip6_config_reset_routes_ndisc (NMIP6Config *self, const struct _NMNDiscRoute *routes, guint routes_n, - guint32 metric); + guint32 route_table, + guint32 route_metric); #endif /* __NETWORKMANAGER_IP6_CONFIG_H__ */ diff --git a/src/vpn/nm-vpn-connection.c b/src/vpn/nm-vpn-connection.c index 1ace03ae35..893033e431 100644 --- a/src/vpn/nm-vpn-connection.c +++ b/src/vpn/nm-vpn-connection.c @@ -815,8 +815,9 @@ add_ip6_vpn_gateway_route (NMIP6Config *config, * In which case, it pretends the destination is directly reachable. * * So, only accept direct routes, if @vpn_gw is a private network. */ - if ( !IN6_IS_ADDR_UNSPECIFIED (&r->gateway) - || nm_utils_ip_is_site_local (AF_INET6, &vpn_gw)) { + if ( nm_platform_route_table_is_main (r->table_coerced) + && ( !IN6_IS_ADDR_UNSPECIFIED (&r->gateway) + || nm_utils_ip_is_site_local (AF_INET6, &vpn_gw))) { parent_gw = &r->gateway; has_parent_gw = TRUE; } @@ -1671,6 +1672,7 @@ nm_vpn_connection_ip6_config_get (NMVpnConnection *self, GVariant *dict) NMVpnConnectionPrivate *priv = NM_VPN_CONNECTION_GET_PRIVATE (self); NMPlatformIP6Address address; guint32 u32, route_metric; + guint32 route_table; NMIP6Config *config; GVariantIter *iter; const char *str; @@ -1761,6 +1763,7 @@ nm_vpn_connection_ip6_config_get (NMVpnConnection *self, GVariant *dict) g_variant_iter_free (iter); } + route_table = get_route_table (self, AF_INET6, TRUE); route_metric = nm_vpn_connection_get_ip6_route_metric (self); if ( g_variant_lookup (dict, NM_VPN_PLUGIN_IP6_CONFIG_PRESERVE_ROUTES, "b", &b) @@ -1789,6 +1792,7 @@ nm_vpn_connection_ip6_config_get (NMVpnConnection *self, GVariant *dict) route.plen = prefix; ip6_addr_from_variant (next_hop, &route.gateway); + route.table_coerced = nm_platform_route_table_coerce (route_table); route.metric = route_metric; route.rt_source = NM_IP_CONFIG_SOURCE_VPN; @@ -1813,7 +1817,7 @@ next: /* Merge in user overrides from the NMConnection's IPv6 setting */ nm_ip6_config_merge_setting (config, nm_connection_get_setting_ip6_config (_get_applied_connection (self)), - get_route_table (self, AF_INET6, TRUE), + route_table, route_metric); if (!nm_ip6_config_get_never_default (config)) { @@ -1821,6 +1825,7 @@ next: .ifindex = ip_ifindex, .rt_source = NM_IP_CONFIG_SOURCE_VPN, .gateway = *(nm_ip6_config_get_gateway (config) ?: &in6addr_any), + .table_coerced = nm_platform_route_table_coerce (route_table), .metric = route_metric, .mss = nm_ip6_config_get_mss (config), }; @@ -1829,7 +1834,8 @@ next: } nm_ip6_config_add_device_routes (config, - nm_vpn_connection_get_ip6_route_metric (self)); + route_table, + route_metric); if (priv->ip6_config) { nm_ip6_config_replace (priv->ip6_config, config, NULL); |