From 223a0dde1a3ceb44f50c4b03b2017176f3878056 Mon Sep 17 00:00:00 2001 From: Dan Winship Date: Mon, 9 Jun 2014 09:36:01 -0400 Subject: [PATCH] core: fix metrics of user-added routes Adding a route with a metric of 0 to an IP4 or IP6 setting used to implicitly mean "use the default metric for the device", but this got broken by 722c9034. Fix that. https://bugzilla.gnome.org/show_bug.cgi?id=731402 (cherry picked from commit cdd09286d73919d64f0f9481821a6f5185f7876b) --- src/devices/nm-device.c | 14 ++++++++++---- src/nm-ip4-config.c | 4 +++- src/nm-ip4-config.h | 2 +- src/nm-ip6-config.c | 4 +++- src/nm-ip6-config.h | 2 +- src/vpn-manager/nm-vpn-connection.c | 8 ++++++-- 6 files changed, 24 insertions(+), 10 deletions(-) diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c index a6b4b548f0..b1bf887ebf 100644 --- a/src/devices/nm-device.c +++ b/src/devices/nm-device.c @@ -2629,8 +2629,11 @@ ip4_config_merge_and_apply (NMDevice *self, /* Merge user overrides into the composite config */ connection = nm_device_get_connection (self); - if (connection) - nm_ip4_config_merge_setting (composite, nm_connection_get_setting_ip4_config (connection)); + if (connection) { + nm_ip4_config_merge_setting (composite, + nm_connection_get_setting_ip4_config (connection), + nm_device_get_priority (self)); + } /* Allow setting MTU etc */ if (commit) { @@ -3071,8 +3074,11 @@ ip6_config_merge_and_apply (NMDevice *self, /* Merge user overrides into the composite config */ connection = nm_device_get_connection (self); - if (connection) - nm_ip6_config_merge_setting (composite, nm_connection_get_setting_ip6_config (connection)); + if (connection) { + nm_ip6_config_merge_setting (composite, + nm_connection_get_setting_ip6_config (connection), + nm_device_get_priority (self)); + } nm_ip6_config_addresses_sort (composite, priv->rdisc ? priv->rdisc_use_tempaddr : NM_SETTING_IP6_CONFIG_PRIVACY_UNKNOWN); diff --git a/src/nm-ip4-config.c b/src/nm-ip4-config.c index 6a7904328a..87f3761a68 100644 --- a/src/nm-ip4-config.c +++ b/src/nm-ip4-config.c @@ -296,7 +296,7 @@ nm_ip4_config_commit (const NMIP4Config *config, int ifindex) } void -nm_ip4_config_merge_setting (NMIP4Config *config, NMSettingIP4Config *setting) +nm_ip4_config_merge_setting (NMIP4Config *config, NMSettingIP4Config *setting, int default_route_metric) { guint naddresses, nroutes, nnameservers, nsearches; int i; @@ -355,6 +355,8 @@ nm_ip4_config_merge_setting (NMIP4Config *config, NMSettingIP4Config *setting) route.plen = nm_ip4_route_get_prefix (s_route); route.gateway = nm_ip4_route_get_next_hop (s_route); route.metric = nm_ip4_route_get_metric (s_route); + if (!route.metric) + route.metric = default_route_metric; route.source = NM_PLATFORM_SOURCE_USER; nm_ip4_config_add_route (config, &route); diff --git a/src/nm-ip4-config.h b/src/nm-ip4-config.h index d0e0df028e..c9096bb389 100644 --- a/src/nm-ip4-config.h +++ b/src/nm-ip4-config.h @@ -61,7 +61,7 @@ const char * nm_ip4_config_get_dbus_path (const NMIP4Config *config); /* Integration with nm-platform and nm-setting */ NMIP4Config *nm_ip4_config_capture (int ifindex, gboolean capture_resolv_conf); gboolean nm_ip4_config_commit (const NMIP4Config *config, int ifindex); -void nm_ip4_config_merge_setting (NMIP4Config *config, NMSettingIP4Config *setting); +void nm_ip4_config_merge_setting (NMIP4Config *config, NMSettingIP4Config *setting, int default_route_metric); NMSetting *nm_ip4_config_create_setting (const NMIP4Config *config); /* Utility functions */ diff --git a/src/nm-ip6-config.c b/src/nm-ip6-config.c index 66fa395352..aaf5e70163 100644 --- a/src/nm-ip6-config.c +++ b/src/nm-ip6-config.c @@ -401,7 +401,7 @@ nm_ip6_config_commit (const NMIP6Config *config, int ifindex) } void -nm_ip6_config_merge_setting (NMIP6Config *config, NMSettingIP6Config *setting) +nm_ip6_config_merge_setting (NMIP6Config *config, NMSettingIP6Config *setting, int default_route_metric) { guint naddresses, nroutes, nnameservers, nsearches; int i; @@ -457,6 +457,8 @@ nm_ip6_config_merge_setting (NMIP6Config *config, NMSettingIP6Config *setting) route.plen = nm_ip6_route_get_prefix (s_route); route.gateway = *nm_ip6_route_get_next_hop (s_route); route.metric = nm_ip6_route_get_metric (s_route); + if (!route.metric) + route.metric = default_route_metric; route.source = NM_PLATFORM_SOURCE_USER; nm_ip6_config_add_route (config, &route); diff --git a/src/nm-ip6-config.h b/src/nm-ip6-config.h index 8fb03e2014..b7b9d83ec7 100644 --- a/src/nm-ip6-config.h +++ b/src/nm-ip6-config.h @@ -60,7 +60,7 @@ const char * nm_ip6_config_get_dbus_path (const NMIP6Config *config); /* Integration with nm-platform and nm-setting */ NMIP6Config *nm_ip6_config_capture (int ifindex, gboolean capture_resolv_conf, NMSettingIP6ConfigPrivacy use_temporary); gboolean nm_ip6_config_commit (const NMIP6Config *config, int ifindex); -void nm_ip6_config_merge_setting (NMIP6Config *config, NMSettingIP6Config *setting); +void nm_ip6_config_merge_setting (NMIP6Config *config, NMSettingIP6Config *setting, int default_route_metric); NMSetting *nm_ip6_config_create_setting (const NMIP6Config *config); /* Utility functions */ diff --git a/src/vpn-manager/nm-vpn-connection.c b/src/vpn-manager/nm-vpn-connection.c index f7476b411a..d66dcfdb73 100644 --- a/src/vpn-manager/nm-vpn-connection.c +++ b/src/vpn-manager/nm-vpn-connection.c @@ -1208,7 +1208,9 @@ nm_vpn_connection_ip4_config_get (DBusGProxy *proxy, nm_ip4_config_set_never_default (config, g_value_get_boolean (val)); /* Merge in user overrides from the NMConnection's IPv4 setting */ - nm_ip4_config_merge_setting (config, nm_connection_get_setting_ip4_config (priv->connection)); + nm_ip4_config_merge_setting (config, + nm_connection_get_setting_ip4_config (priv->connection), + vpn_routing_metric (connection)); priv->ip4_config = config; nm_ip4_config_export (config); @@ -1352,7 +1354,9 @@ nm_vpn_connection_ip6_config_get (DBusGProxy *proxy, nm_ip6_config_set_never_default (config, g_value_get_boolean (val)); /* Merge in user overrides from the NMConnection's IPv6 setting */ - nm_ip6_config_merge_setting (config, nm_connection_get_setting_ip6_config (priv->connection)); + nm_ip6_config_merge_setting (config, + nm_connection_get_setting_ip6_config (priv->connection), + vpn_routing_metric (connection)); priv->ip6_config = config; nm_ip6_config_export (config);