diff options
author | Dan Winship <danw@gnome.org> | 2014-11-04 15:48:48 -0500 |
---|---|---|
committer | Dan Winship <danw@gnome.org> | 2014-11-06 16:59:18 -0500 |
commit | 4cc45c312bad63f8e769412a6ee664a8ca31a91c (patch) | |
tree | 3df68488e62a76baae2a54a5fe138c4e3a299bcb | |
parent | 4efa495b80dbe6694534ee1838424358c6e9d41f (diff) | |
download | NetworkManager-danw/addressdata-bgo682946.tar.gz |
all: allow route metrics to be "0"danw/addressdata-bgo682946
Change NMIPRoute to use "-1" for "default", so that "0" is a valid
metric. Update everything for that.
-rw-r--r-- | callouts/nm-dispatcher-utils.c | 8 | ||||
-rw-r--r-- | clients/cli/common.c | 12 | ||||
-rw-r--r-- | clients/cli/settings.c | 12 | ||||
-rw-r--r-- | clients/tui/nm-editor-bindings.c | 9 | ||||
-rw-r--r-- | libnm-core/nm-setting-ip-config.c | 41 | ||||
-rw-r--r-- | libnm-core/nm-setting-ip-config.h | 8 | ||||
-rw-r--r-- | libnm-core/nm-utils.c | 30 | ||||
-rw-r--r-- | src/nm-ip4-config.c | 11 | ||||
-rw-r--r-- | src/nm-ip6-config.c | 11 | ||||
-rw-r--r-- | src/settings/plugins/ifcfg-rh/reader.c | 12 | ||||
-rw-r--r-- | src/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh.c | 4 | ||||
-rw-r--r-- | src/settings/plugins/ifcfg-rh/writer.c | 33 | ||||
-rw-r--r-- | src/settings/plugins/ifnet/connection_parser.c | 21 | ||||
-rw-r--r-- | src/settings/plugins/keyfile/reader.c | 4 | ||||
-rw-r--r-- | src/settings/plugins/keyfile/tests/test-keyfile.c | 34 | ||||
-rw-r--r-- | src/settings/plugins/keyfile/writer.c | 2 |
16 files changed, 153 insertions, 99 deletions
diff --git a/callouts/nm-dispatcher-utils.c b/callouts/nm-dispatcher-utils.c index 8feec72d25..8d7274329c 100644 --- a/callouts/nm-dispatcher-utils.c +++ b/callouts/nm-dispatcher-utils.c @@ -185,11 +185,11 @@ construct_ip4_items (GSList *items, GVariant *ip4_config, const char *prefix) if (!next_hop) next_hop = "0.0.0.0"; - routetmp = g_strdup_printf ("%sIP4_ROUTE_%d=%s/%d %s %d", prefix, i, + routetmp = g_strdup_printf ("%sIP4_ROUTE_%d=%s/%d %s %u", prefix, i, nm_ip_route_get_dest (route), nm_ip_route_get_prefix (route), next_hop, - nm_ip_route_get_metric (route)); + (guint32) MAX (0, nm_ip_route_get_metric (route))); items = g_slist_prepend (items, routetmp); } items = g_slist_prepend (items, g_strdup_printf ("%sIP4_NUM_ROUTES=%d", prefix, routes->len)); @@ -299,11 +299,11 @@ construct_ip6_items (GSList *items, GVariant *ip6_config, const char *prefix) if (!next_hop) next_hop = "::"; - routetmp = g_strdup_printf ("%sIP6_ROUTE_%d=%s/%d %s %d", prefix, i, + routetmp = g_strdup_printf ("%sIP6_ROUTE_%d=%s/%d %s %u", prefix, i, nm_ip_route_get_dest (route), nm_ip_route_get_prefix (route), next_hop, - nm_ip_route_get_metric (route)); + (guint32) MAX (0, nm_ip_route_get_metric (route))); items = g_slist_prepend (items, routetmp); } if (routes->len) diff --git a/clients/cli/common.c b/clients/cli/common.c index 2003934993..8539af28d8 100644 --- a/clients/cli/common.c +++ b/clients/cli/common.c @@ -130,11 +130,12 @@ print_ip4_config (NMIPConfig *cfg4, if (!next_hop) next_hop = "0.0.0.0"; - route_arr[i] = g_strdup_printf ("dst = %s/%u, nh = %s, mt = %u", + route_arr[i] = g_strdup_printf ("dst = %s/%u, nh = %s%c mt = %u", nm_ip_route_get_dest (route), nm_ip_route_get_prefix (route), next_hop, - nm_ip_route_get_metric (route)); + nm_ip_route_get_metric (route) == -1 ? '\0' : ',', + (guint32) nm_ip_route_get_metric (route)); } route_arr[i] = NULL; } @@ -219,11 +220,12 @@ print_ip6_config (NMIPConfig *cfg6, if (!next_hop) next_hop = "::"; - route_arr[i] = g_strdup_printf ("dst = %s/%u, nh = %s, mt = %u", + route_arr[i] = g_strdup_printf ("dst = %s/%u, nh = %s%c mt = %u", nm_ip_route_get_dest (route), nm_ip_route_get_prefix (route), next_hop, - nm_ip_route_get_metric (route)); + nm_ip_route_get_metric (route) == -1 ? '\0' : ',', + (guint32) nm_ip_route_get_metric (route)); } route_arr[i] = NULL; } @@ -417,7 +419,7 @@ nmc_parse_and_build_route (int family, char *dest = NULL, *plen = NULL; const char *next_hop = NULL; const char *canon_dest; - long int prefix = max_prefix, metric = 0; + long int prefix = max_prefix, metric = -1; NMIPRoute *route = NULL; gboolean success = FALSE; GError *local = NULL; diff --git a/clients/cli/settings.c b/clients/cli/settings.c index 292a09b52a..e4d7589385 100644 --- a/clients/cli/settings.c +++ b/clients/cli/settings.c @@ -1263,8 +1263,8 @@ nmc_property_ipv4_get_routes (NMSetting *setting) nm_ip_route_get_next_hop (route)); } - if (nm_ip_route_get_metric (route)) - g_string_append_printf (printable, ", mt = %u", nm_ip_route_get_metric (route)); + if (nm_ip_route_get_metric (route) != -1) + g_string_append_printf (printable, ", mt = %u", (guint32) nm_ip_route_get_metric (route)); g_string_append (printable, " }"); } @@ -1314,8 +1314,8 @@ nmc_property_ipv6_get_routes (NMSetting *setting) nm_ip_route_get_next_hop (route)); } - if (nm_ip_route_get_metric (route)) - g_string_append_printf (printable, ", mt = %u", nm_ip_route_get_metric (route)); + if (nm_ip_route_get_metric (route) != -1) + g_string_append_printf (printable, ", mt = %u", (guint32) nm_ip_route_get_metric (route)); g_string_append (printable, " }"); } @@ -3332,7 +3332,7 @@ nmc_property_ipv4_describe_routes (NMSetting *setting, const char *prop) " ip[/prefix] [next-hop] [metric],...\n\n" "Missing prefix is regarded as a prefix of 32.\n" "Missing next-hop is regarded as 0.0.0.0.\n" - "Missing metric or 0 means a default metric (NM/kernel will set a default value).\n\n" + "Missing metric means default (NM/kernel will set a default value).\n\n" "Examples: 192.168.2.0/24 192.168.2.1 3, 10.1.0.0/16 10.0.0.254\n" " 10.1.2.0/24\n"); } @@ -3638,7 +3638,7 @@ nmc_property_ipv6_describe_routes (NMSetting *setting, const char *prop) " ip[/prefix] [next-hop] [metric],...\n\n" "Missing prefix is regarded as a prefix of 128.\n" "Missing next-hop is regarded as \"::\".\n" - "Missing metric or 0 means a default metric (NM/kernel will set a default value).\n\n" + "Missing metric means default (NM/kernel will set a default value).\n\n" "Examples: 2001:db8:beef:2::/64 2001:db8:beef::2, 2001:db8:beef:3::/64 2001:db8:beef::3 2\n" " abbe::/64 55\n"); } diff --git a/clients/tui/nm-editor-bindings.c b/clients/tui/nm-editor-bindings.c index 9db44c9d80..5560f83ca6 100644 --- a/clients/tui/nm-editor-bindings.c +++ b/clients/tui/nm-editor-bindings.c @@ -327,7 +327,7 @@ ip_route_transform_to_metric_string (GBinding *binding, char *string; route = g_value_get_boxed (source_value); - if (route && nm_ip_route_get_dest (route)) { + if (route && nm_ip_route_get_dest (route) && nm_ip_route_get_metric (route) != -1) { string = g_strdup_printf ("%lu", (gulong) nm_ip_route_get_metric (route)); g_value_take_string (target_value, string); } else @@ -400,10 +400,13 @@ ip_route_transform_from_metric_string (GBinding *binding, { NMIPRoute *route; const char *text; - guint32 metric; + gint64 metric; text = g_value_get_string (source_value); - metric = strtoul (text, NULL, 10); + if (*text) + metric = strtoul (text, NULL, 10); + else + metric = -1; /* Fetch the original property value */ g_object_get (g_binding_get_source (binding), diff --git a/libnm-core/nm-setting-ip-config.c b/libnm-core/nm-setting-ip-config.c index e7f2eb7408..7da0e19efa 100644 --- a/libnm-core/nm-setting-ip-config.c +++ b/libnm-core/nm-setting-ip-config.c @@ -96,6 +96,24 @@ valid_prefix (int family, guint prefix, GError **error) return TRUE; } +static gboolean +valid_metric (gint64 metric, GError **error) +{ + if (metric < -1 || metric > G_MAXUINT32) { + if (error) { + char buf[64]; + + /* We can't concatenate G_GINT64_FORMAT into a translatable string */ + g_snprintf (buf, sizeof (buf), "%" G_GINT64_FORMAT, metric); + g_set_error (error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_FAILED, + _("Invalid routing metric '%s'"), buf); + } + return FALSE; + } + + return TRUE; +} + G_DEFINE_BOXED_TYPE (NMIPAddress, nm_ip_address, nm_ip_address_dup, nm_ip_address_unref) @@ -496,7 +514,7 @@ struct NMIPRoute { char *dest; guint prefix; char *next_hop; - guint32 metric; + gint64 metric; GHashTable *attributes; }; @@ -507,7 +525,7 @@ struct NMIPRoute { * @dest: the IP address of the route's destination * @prefix: the address prefix length * @next_hop: (allow-none): the IP address of the next hop (or %NULL) - * @metric: the route metric (or 0 for "default") + * @metric: the route metric (or -1 for "default") * @error: location to store error, or %NULL * * Creates a new #NMIPRoute object. @@ -519,7 +537,7 @@ nm_ip_route_new (int family, const char *dest, guint prefix, const char *next_hop, - guint metric, + gint64 metric, GError **error) { NMIPRoute *route; @@ -532,6 +550,8 @@ nm_ip_route_new (int family, return NULL; if (next_hop && !valid_ip (family, next_hop, error)) return NULL; + if (!valid_metric (metric, error)) + return NULL; route = g_slice_new0 (NMIPRoute); route->refcount = 1; @@ -551,7 +571,7 @@ nm_ip_route_new (int family, * @dest: the IP address of the route's destination * @prefix: the address prefix length * @next_hop: (allow-none): the IP address of the next hop (or %NULL) - * @metric: the route metric (or 0 for "default") + * @metric: the route metric (or -1 for "default") * @error: location to store error, or %NULL * * Creates a new #NMIPRoute object. @dest and @next_hop (if non-%NULL) must @@ -564,7 +584,7 @@ nm_ip_route_new_binary (int family, gconstpointer dest, guint prefix, gconstpointer next_hop, - guint metric, + gint64 metric, GError **error) { NMIPRoute *route; @@ -574,6 +594,8 @@ nm_ip_route_new_binary (int family, if (!valid_prefix (family, prefix, error)) return NULL; + if (!valid_metric (metric, error)) + return NULL; route = g_slice_new0 (NMIPRoute); route->refcount = 1; @@ -917,12 +939,12 @@ nm_ip_route_set_next_hop_binary (NMIPRoute *route, * @route: the #NMIPRoute * * Gets the route metric property of this route object; lower values - * indicate "better" or more preferred routes; 0 indicates "default" + * indicate "better" or more preferred routes; -1 indicates "default" * (meaning NetworkManager will set it appropriately). * * Returns: the route metric **/ -guint32 +gint64 nm_ip_route_get_metric (NMIPRoute *route) { g_return_val_if_fail (route != NULL, 0); @@ -934,15 +956,16 @@ nm_ip_route_get_metric (NMIPRoute *route) /** * nm_ip_route_set_metric: * @route: the #NMIPRoute - * @metric: the route metric + * @metric: the route metric (or -1 for "default") * * Sets the metric property of this route object. **/ void nm_ip_route_set_metric (NMIPRoute *route, - guint32 metric) + gint64 metric) { g_return_if_fail (route != NULL); + g_return_if_fail (valid_metric (metric, NULL)); route->metric = metric; } diff --git a/libnm-core/nm-setting-ip-config.h b/libnm-core/nm-setting-ip-config.h index 37437761c4..fba226c331 100644 --- a/libnm-core/nm-setting-ip-config.h +++ b/libnm-core/nm-setting-ip-config.h @@ -78,13 +78,13 @@ NMIPRoute *nm_ip_route_new (int family, const char *dest, guint prefix, const char *next_hop, - guint metric, + gint64 metric, GError **error); NMIPRoute *nm_ip_route_new_binary (int family, gconstpointer dest, guint prefix, gconstpointer next_hop, - guint metric, + gint64 metric, GError **error); void nm_ip_route_ref (NMIPRoute *route); @@ -111,9 +111,9 @@ gboolean nm_ip_route_get_next_hop_binary (NMIPRoute *route, gpointer next_hop); void nm_ip_route_set_next_hop_binary (NMIPRoute *route, gconstpointer next_hop); -guint32 nm_ip_route_get_metric (NMIPRoute *route); +gint64 nm_ip_route_get_metric (NMIPRoute *route); void nm_ip_route_set_metric (NMIPRoute *route, - guint32 metric); + gint64 metric); char **nm_ip_route_get_attribute_names (NMIPRoute *route); GVariant *nm_ip_route_get_attribute (NMIPRoute *route, diff --git a/libnm-core/nm-utils.c b/libnm-core/nm-utils.c index b2570b66ef..756081ff6e 100644 --- a/libnm-core/nm-utils.c +++ b/libnm-core/nm-utils.c @@ -1269,7 +1269,8 @@ nm_utils_ip4_routes_to_variant (GPtrArray *routes) nm_ip_route_get_dest_binary (route, &array[0]); array[1] = nm_ip_route_get_prefix (route); nm_ip_route_get_next_hop_binary (route, &array[2]); - array[3] = nm_ip_route_get_metric (route); + /* The old routes format uses "0" for default, not "-1" */ + array[3] = MAX (0, nm_ip_route_get_metric (route)); g_variant_builder_add (&builder, "@au", g_variant_new_fixed_array (G_VARIANT_TYPE_UINT32, @@ -1317,8 +1318,11 @@ nm_utils_ip4_routes_from_variant (GVariant *value) } route = nm_ip_route_new_binary (AF_INET, - &route_array[0], route_array[1], - &route_array[2], route_array[3], + &route_array[0], + route_array[1], + &route_array[2], + /* The old routes format uses "0" for default, not "-1" */ + route_array[3] ? (gint64) route_array[3] : -1, &error); if (route) g_ptr_array_add (routes, route); @@ -1636,7 +1640,8 @@ nm_utils_ip6_routes_to_variant (GPtrArray *routes) prefix = nm_ip_route_get_prefix (route); nm_ip_route_get_next_hop_binary (route, &next_hop_bytes); next_hop = g_variant_new_fixed_array (G_VARIANT_TYPE_BYTE, &next_hop_bytes, 16, 1); - metric = nm_ip_route_get_metric (route); + /* The old routes format uses "0" for default, not "-1" */ + metric = MAX (0, nm_ip_route_get_metric (route)); g_variant_builder_add (&builder, "(@ayu@ayu)", dest, prefix, next_hop, metric); } @@ -1695,7 +1700,9 @@ nm_utils_ip6_routes_from_variant (GVariant *value) goto next; } - route = nm_ip_route_new_binary (AF_INET6, dest, prefix, next_hop, metric, &error); + route = nm_ip_route_new_binary (AF_INET6, dest, prefix, next_hop, + metric ? (gint64) metric : -1, + &error); if (route) g_ptr_array_add (routes, route); else { @@ -1860,10 +1867,10 @@ nm_utils_ip_routes_to_variant (GPtrArray *routes) "next-hop", g_variant_new_string (nm_ip_route_get_next_hop (route))); } - if (nm_ip_route_get_metric (route)) { + if (nm_ip_route_get_metric (route) != -1) { g_variant_builder_add (&route_builder, "{sv}", "metric", - g_variant_new_uint32 (nm_ip_route_get_metric (route))); + g_variant_new_uint32 ((guint32) nm_ip_route_get_metric (route))); } names = nm_ip_route_get_attribute_names (route); @@ -1902,7 +1909,8 @@ nm_utils_ip_routes_from_variant (GVariant *value, GVariantIter iter, attrs_iter; GVariant *route_var; const char *dest, *next_hop; - guint32 prefix, metric; + guint32 prefix, metric32; + gint64 metric; const char *attr_name; GVariant *attr_val; NMIPRoute *route; @@ -1922,8 +1930,10 @@ nm_utils_ip_routes_from_variant (GVariant *value, } if (!g_variant_lookup (route_var, "next-hop", "&s", &next_hop)) next_hop = NULL; - if (!g_variant_lookup (route_var, "metric", "u", &metric)) - metric = 0; + if (g_variant_lookup (route_var, "metric", "u", &metric32)) + metric = metric32; + else + metric = -1; route = nm_ip_route_new (family, dest, prefix, next_hop, metric, &error); if (!route) { diff --git a/src/nm-ip4-config.c b/src/nm-ip4-config.c index 74a7556f38..604d627f52 100644 --- a/src/nm-ip4-config.c +++ b/src/nm-ip4-config.c @@ -178,7 +178,7 @@ nm_ip4_config_capture (int ifindex, gboolean capture_resolv_conf) NMIP4Config *config; NMIP4ConfigPrivate *priv; guint i; - guint lowest_metric = G_MAXUINT; + guint32 lowest_metric = G_MAXUINT32; guint32 old_gateway = 0; gboolean has_gateway = FALSE; @@ -361,9 +361,10 @@ nm_ip4_config_merge_setting (NMIP4Config *config, NMSettingIPConfig *setting, in nm_ip_route_get_dest_binary (s_route, &route.network); route.plen = nm_ip_route_get_prefix (s_route); nm_ip_route_get_next_hop_binary (s_route, &route.gateway); - route.metric = nm_ip_route_get_metric (s_route); - if (!route.metric) + if (nm_ip_route_get_metric (s_route) == -1) route.metric = default_route_metric; + else + route.metric = nm_ip_route_get_metric (s_route); route.source = NM_IP_CONFIG_SOURCE_USER; nm_ip4_config_add_route (config, &route); @@ -1802,8 +1803,8 @@ get_property (GObject *object, guint prop_id, g_value_array_append (array, &val); g_value_unset (&val); - g_value_init (&val, G_TYPE_UINT); - g_value_set_uint (&val, route->metric); + g_value_init (&val, G_TYPE_INT64); + g_value_set_int64 (&val, route->metric); g_value_array_append (array, &val); g_value_unset (&val); diff --git a/src/nm-ip6-config.c b/src/nm-ip6-config.c index 19552e0339..13db237cc6 100644 --- a/src/nm-ip6-config.c +++ b/src/nm-ip6-config.c @@ -287,7 +287,7 @@ nm_ip6_config_capture (int ifindex, gboolean capture_resolv_conf, NMSettingIP6Co NMIP6Config *config; NMIP6ConfigPrivate *priv; guint i; - guint lowest_metric = G_MAXUINT; + guint32 lowest_metric = G_MAXUINT32; struct in6_addr old_gateway = IN6ADDR_ANY_INIT; gboolean has_gateway = FALSE; gboolean notify_nameservers = FALSE; @@ -463,9 +463,10 @@ nm_ip6_config_merge_setting (NMIP6Config *config, NMSettingIPConfig *setting, in nm_ip_route_get_dest_binary (s_route, &route.network); route.plen = nm_ip_route_get_prefix (s_route); nm_ip_route_get_next_hop_binary (s_route, &route.gateway); - route.metric = nm_ip_route_get_metric (s_route); - if (!route.metric) + if (nm_ip_route_get_metric (s_route) == -1) route.metric = default_route_metric; + else + route.metric = nm_ip_route_get_metric (s_route); route.source = NM_IP_CONFIG_SOURCE_USER; nm_ip6_config_add_route (config, &route); @@ -1695,8 +1696,8 @@ get_property (GObject *object, guint prop_id, g_value_array_append (array, &val); g_value_unset (&val); - g_value_init (&val, G_TYPE_UINT); - g_value_set_uint (&val, route->metric); + g_value_init (&val, G_TYPE_INT64); + g_value_set_int64 (&val, route->metric); g_value_array_append (array, &val); g_value_unset (&val); diff --git a/src/settings/plugins/ifcfg-rh/reader.c b/src/settings/plugins/ifcfg-rh/reader.c index 9c3e9b0d2d..5243d77f18 100644 --- a/src/settings/plugins/ifcfg-rh/reader.c +++ b/src/settings/plugins/ifcfg-rh/reader.c @@ -443,7 +443,7 @@ read_one_ip4_route (shvarFile *ifcfg, { char *ip_tag, *netmask_tag, *gw_tag, *metric_tag, *value; char *dest = NULL, *next_hop = NULL; - long prefix, metric; + gint64 prefix, metric; gboolean success = FALSE; g_return_val_if_fail (ifcfg != NULL, FALSE); @@ -510,7 +510,7 @@ read_one_ip4_route (shvarFile *ifcfg, } g_free (value); } else - metric = 0; + metric = -1; *out_route = nm_ip_route_new (AF_INET, dest, prefix, next_hop, metric, error); if (*out_route) @@ -536,7 +536,7 @@ read_route_file_legacy (const char *filename, NMSettingIPConfig *s_ip4, GError * GMatchInfo *match_info; NMIPRoute *route = NULL; char *dest = NULL, *prefix = NULL, *next_hop = NULL, *metric = NULL; - long int prefix_int, metric_int; + gint64 prefix_int, metric_int; gboolean success = FALSE; const char *pattern_empty = "^\\s*(\\#.*)?$"; @@ -633,7 +633,7 @@ read_route_file_legacy (const char *filename, NMSettingIPConfig *s_ip4, GError * /* Metric */ g_regex_match (regex_metric, *iter, 0, &match_info); - metric_int = 0; + metric_int = -1; if (g_match_info_matches (match_info)) { metric = g_match_info_fetch (match_info, 1); errno = 0; @@ -745,7 +745,7 @@ read_route6_file (const char *filename, NMSettingIPConfig *s_ip6, GError **error GMatchInfo *match_info; NMIPRoute *route = NULL; char *dest = NULL, *prefix = NULL, *next_hop = NULL, *metric = NULL; - long int prefix_int, metric_int; + gint64 prefix_int, metric_int; gboolean success = FALSE; const char *pattern_empty = "^\\s*(\\#.*)?$"; @@ -840,7 +840,7 @@ read_route6_file (const char *filename, NMSettingIPConfig *s_ip6, GError **error /* Metric */ g_regex_match (regex_metric, *iter, 0, &match_info); - metric_int = 0; + metric_int = -1; if (g_match_info_matches (match_info)) { metric = g_match_info_fetch (match_info, 1); errno = 0; diff --git a/src/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh.c b/src/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh.c index e7f5b51961..82f0a020a9 100644 --- a/src/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh.c +++ b/src/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh.c @@ -1158,7 +1158,7 @@ test_read_wired_static_routes (void) g_assert_cmpstr (nm_ip_route_get_dest (ip4_route), ==, "11.22.33.0"); g_assert_cmpint (nm_ip_route_get_prefix (ip4_route), ==, 24); g_assert_cmpstr (nm_ip_route_get_next_hop (ip4_route), ==, "192.168.1.5"); - g_assert_cmpint (nm_ip_route_get_metric (ip4_route), ==, 0); + g_assert_cmpint (nm_ip_route_get_metric (ip4_route), ==, -1); ip4_route = nm_setting_ip_config_get_route (s_ip4, 1); g_assert (ip4_route); @@ -1279,7 +1279,7 @@ test_read_wired_static_routes_legacy (void) g_assert_cmpstr (nm_ip_route_get_dest (ip4_route), ==, "32.42.52.62"); g_assert_cmpint (nm_ip_route_get_prefix (ip4_route), ==, 32); g_assert_cmpstr (nm_ip_route_get_next_hop (ip4_route), ==, "8.8.8.8"); - g_assert_cmpint (nm_ip_route_get_metric (ip4_route), ==, 0); + g_assert_cmpint (nm_ip_route_get_metric (ip4_route), ==, -1); /* Route #3 */ ip4_route = nm_setting_ip_config_get_route (s_ip4, 2); diff --git a/src/settings/plugins/ifcfg-rh/writer.c b/src/settings/plugins/ifcfg-rh/writer.c index 559342d4cd..6857c1f70a 100644 --- a/src/settings/plugins/ifcfg-rh/writer.c +++ b/src/settings/plugins/ifcfg-rh/writer.c @@ -1747,7 +1747,8 @@ write_route_file_legacy (const char *filename, NMSettingIPConfig *s_ip4, GError char **route_items; char *route_contents; NMIPRoute *route; - guint32 prefix, metric; + guint32 prefix; + gint64 metric; guint32 i, num; gboolean success = FALSE; @@ -1771,7 +1772,10 @@ write_route_file_legacy (const char *filename, NMSettingIPConfig *s_ip4, GError next_hop = nm_ip_route_get_next_hop (route); metric = nm_ip_route_get_metric (route); - route_items[i] = g_strdup_printf ("%s/%u via %s metric %u\n", dest, prefix, next_hop, metric); + if (metric == -1) + route_items[i] = g_strdup_printf ("%s/%u via %s\n", dest, prefix, next_hop); + else + route_items[i] = g_strdup_printf ("%s/%u via %s metric %u\n", dest, prefix, next_hop, (guint32) metric); } route_items[num] = NULL; route_contents = g_strjoinv (NULL, route_items); @@ -2033,7 +2037,8 @@ write_ip4_setting (NMConnection *connection, shvarFile *ifcfg, GError **error) for (i = 0; i < 256; i++) { char buf[INET_ADDRSTRLEN]; NMIPRoute *route; - guint32 netmask, metric; + guint32 netmask; + gint64 metric; addr_key = g_strdup_printf ("ADDRESS%d", i); netmask_key = g_strdup_printf ("NETMASK%d", i); @@ -2059,10 +2064,10 @@ write_ip4_setting (NMConnection *connection, shvarFile *ifcfg, GError **error) memset (buf, 0, sizeof (buf)); metric = nm_ip_route_get_metric (route); - if (metric == 0) + if (metric == -1) svSetValue (routefile, metric_key, NULL, FALSE); else { - tmp = g_strdup_printf ("%u", metric); + tmp = g_strdup_printf ("%u", (guint32) metric); svSetValue (routefile, metric_key, tmp, FALSE); g_free (tmp); } @@ -2204,11 +2209,19 @@ write_route6_file (const char *filename, NMSettingIPConfig *s_ip6, GError **erro route_items = g_malloc0 (sizeof (char*) * (num + 1)); for (i = 0; i < num; i++) { route = nm_setting_ip_config_get_route (s_ip6, i); - route_items[i] = g_strdup_printf ("%s/%u via %s metric %u\n", - nm_ip_route_get_dest (route), - nm_ip_route_get_prefix (route), - nm_ip_route_get_next_hop (route), - nm_ip_route_get_metric (route)); + + if (nm_ip_route_get_metric (route) == -1) { + route_items[i] = g_strdup_printf ("%s/%u via %s\n", + nm_ip_route_get_dest (route), + nm_ip_route_get_prefix (route), + nm_ip_route_get_next_hop (route)); + } else { + route_items[i] = g_strdup_printf ("%s/%u via %s metric %u\n", + nm_ip_route_get_dest (route), + nm_ip_route_get_prefix (route), + nm_ip_route_get_next_hop (route), + (guint32) nm_ip_route_get_metric (route)); + } } route_items[num] = NULL; route_contents = g_strjoinv (NULL, route_items); diff --git a/src/settings/plugins/ifnet/connection_parser.c b/src/settings/plugins/ifnet/connection_parser.c index 3880e8f274..5ffc0605e1 100644 --- a/src/settings/plugins/ifnet/connection_parser.c +++ b/src/settings/plugins/ifnet/connection_parser.c @@ -30,6 +30,7 @@ #include "nm-system-config-interface.h" #include "nm-logging.h" #include "nm-core-internal.h" +#include "NetworkManagerUtils.h" #include "net_utils.h" #include "wpa_parser.h" @@ -692,21 +693,21 @@ make_ip4_setting (NMConnection *connection, ip_block *current_iblock = iblock; const char *metric_str; char *stripped; - long int metric; + gint64 metric; NMIPRoute *route; GError *local = NULL; if ((metric_str = ifnet_get_data (conn_name, "metric")) != NULL) { - metric = strtol (metric_str, NULL, 10); + metric = nm_utils_ascii_str_to_int64 (metric_str, 10, 0, G_MAXUINT32, -1); } else { metric_str = ifnet_get_global_data ("metric"); if (metric_str) { stripped = g_strdup (metric_str); strip_string (stripped, '"'); - metric = strtol (metric_str, NULL, 10); + metric = nm_utils_ascii_str_to_int64 (metric_str, 10, 0, G_MAXUINT32, -1); g_free (stripped); } else - metric = 0; + metric = -1; } route = nm_ip_route_new (AF_INET, iblock->ip, iblock->prefix, iblock->next_hop, metric, &local); @@ -830,22 +831,20 @@ make_ip6_setting (NMConnection *connection, ip_block *current_iblock = iblock; const char *metric_str; char *stripped; - long int metric; + gint64 metric; NMIPRoute *route; GError *local = NULL; /* metric is not per routes configuration right now * global metric is also supported (metric="x") */ - if ((metric_str = ifnet_get_data (conn_name, "metric")) != NULL) { - metric = strtol (metric_str, NULL, 10); - nm_ip_route_set_metric (route, (guint32) metric); - } else { + if ((metric_str = ifnet_get_data (conn_name, "metric")) != NULL) + metric = nm_utils_ascii_str_to_int64 (metric_str, 10, 0, G_MAXUINT32, -1); + else { metric_str = ifnet_get_global_data ("metric"); if (metric_str) { stripped = g_strdup (metric_str); strip_string (stripped, '"'); - metric = strtol (metric_str, NULL, 10); - nm_ip_route_set_metric (route, (guint32) metric); + metric = nm_utils_ascii_str_to_int64 (metric_str, 10, 0, G_MAXUINT32, -1); g_free (stripped); } else metric = 1; diff --git a/src/settings/plugins/keyfile/reader.c b/src/settings/plugins/keyfile/reader.c index cab7591f4e..d750af8da9 100644 --- a/src/settings/plugins/keyfile/reader.c +++ b/src/settings/plugins/keyfile/reader.c @@ -166,7 +166,9 @@ build_route (int family, return NULL; } - route = nm_ip_route_new (family, dest_str, plen, gateway_str, metric, &error); + route = nm_ip_route_new (family, dest_str, plen, gateway_str, + metric ? (gint64) metric : -1, + &error); if (!route) { nm_log_warn (LOGD_SETTINGS, "%s: ignoring invalid %s route: %s", __func__, family == AF_INET ? "IPv4" : "IPv6", diff --git a/src/settings/plugins/keyfile/tests/test-keyfile.c b/src/settings/plugins/keyfile/tests/test-keyfile.c index 2e0b619dad..a38a3bd0f0 100644 --- a/src/settings/plugins/keyfile/tests/test-keyfile.c +++ b/src/settings/plugins/keyfile/tests/test-keyfile.c @@ -49,7 +49,7 @@ check_ip_address (NMSettingIPConfig *config, int idx, const char *address, int p static void check_ip_route (NMSettingIPConfig *config, int idx, const char *destination, int plen, - const char *next_hop, int metric) + const char *next_hop, gint64 metric) { NMIPRoute *route = nm_setting_ip_config_get_route (config, idx); @@ -261,17 +261,17 @@ test_read_valid_wired_connection (void) /* IPv4 routes */ g_assert (nm_setting_ip_config_get_num_routes (s_ip4) == 12); - check_ip_route (s_ip4, 0, "5.6.7.8", 32, NULL, 0); + check_ip_route (s_ip4, 0, "5.6.7.8", 32, NULL, -1); check_ip_route (s_ip4, 1, "1.2.3.0", 24, "2.3.4.8", 99); - check_ip_route (s_ip4, 2, "1.1.1.2", 12, NULL, 0); - check_ip_route (s_ip4, 3, "1.1.1.3", 13, NULL, 0); - check_ip_route (s_ip4, 4, "1.1.1.4", 14, "2.2.2.4", 0); - check_ip_route (s_ip4, 5, "1.1.1.5", 15, "2.2.2.5", 0); - check_ip_route (s_ip4, 6, "1.1.1.6", 16, "2.2.2.6", 0); - check_ip_route (s_ip4, 7, "1.1.1.7", 17, NULL, 0); - check_ip_route (s_ip4, 8, "1.1.1.8", 18, NULL, 0); - check_ip_route (s_ip4, 9, "1.1.1.9", 19, NULL, 0); - check_ip_route (s_ip4, 10, "1.1.1.10", 20, NULL, 0); + check_ip_route (s_ip4, 2, "1.1.1.2", 12, NULL, -1); + check_ip_route (s_ip4, 3, "1.1.1.3", 13, NULL, -1); + check_ip_route (s_ip4, 4, "1.1.1.4", 14, "2.2.2.4", -1); + check_ip_route (s_ip4, 5, "1.1.1.5", 15, "2.2.2.5", -1); + check_ip_route (s_ip4, 6, "1.1.1.6", 16, "2.2.2.6", -1); + check_ip_route (s_ip4, 7, "1.1.1.7", 17, NULL, -1); + check_ip_route (s_ip4, 8, "1.1.1.8", 18, NULL, -1); + check_ip_route (s_ip4, 9, "1.1.1.9", 19, NULL, -1); + check_ip_route (s_ip4, 10, "1.1.1.10", 20, NULL, -1); check_ip_route (s_ip4, 11, "1.1.1.11", 21, NULL, 21); /* ===== IPv6 SETTING ===== */ @@ -354,13 +354,13 @@ test_read_valid_wired_connection (void) /* Route #1 */ g_assert (nm_setting_ip_config_get_num_routes (s_ip6) == 7); - check_ip_route (s_ip6, 0, "d:e:f:0:1:2:3:4", 64, "f:e:d:c:1:2:3:4", 0); + check_ip_route (s_ip6, 0, "d:e:f:0:1:2:3:4", 64, "f:e:d:c:1:2:3:4", -1); check_ip_route (s_ip6, 1, "a:b:c:d::", 64, "f:e:d:c:1:2:3:4", 99); - check_ip_route (s_ip6, 2, "8:7:6:5:4:3:2:1", 128, NULL, 0); + check_ip_route (s_ip6, 2, "8:7:6:5:4:3:2:1", 128, NULL, -1); check_ip_route (s_ip6, 3, "6:7:8:9:0:1:2:3", 126, NULL, 1); check_ip_route (s_ip6, 4, "7:8:9:0:1:2:3:4", 125, NULL, 5); check_ip_route (s_ip6, 5, "8:9:0:1:2:3:4:5", 124, NULL, 6); - check_ip_route (s_ip6, 6, "8:9:0:1:2:3:4:6", 123, NULL, 0); + check_ip_route (s_ip6, 6, "8:9:0:1:2:3:4:6", 123, NULL, -1); g_object_unref (connection); } @@ -384,7 +384,7 @@ add_one_ip_route (NMSettingIPConfig *s_ip, const char *dest, const char *nh, guint32 prefix, - guint32 metric) + gint64 metric) { NMIPRoute *route; GError *error = NULL; @@ -484,7 +484,7 @@ test_write_wired_connection (void) /* Routes */ add_one_ip_route (s_ip4, route1, route1_nh, 24, 3); add_one_ip_route (s_ip4, route2, route2_nh, 8, 1); - add_one_ip_route (s_ip4, route3, route3_nh, 7, 0); + add_one_ip_route (s_ip4, route3, route3_nh, 7, -1); add_one_ip_route (s_ip4, route4, route4_nh, 6, 4); /* DNS servers */ @@ -508,7 +508,7 @@ test_write_wired_connection (void) add_one_ip_route (s_ip6, route6_1, route6_1_nh, 64, 3); add_one_ip_route (s_ip6, route6_2, route6_2_nh, 56, 1); add_one_ip_route (s_ip6, route6_3, route6_3_nh, 63, 5); - add_one_ip_route (s_ip6, route6_4, route6_4_nh, 62, 0); + add_one_ip_route (s_ip6, route6_4, route6_4_nh, 62, -1); /* DNS servers */ nm_setting_ip_config_add_dns (s_ip6, dns6_1); diff --git a/src/settings/plugins/keyfile/writer.c b/src/settings/plugins/keyfile/writer.c index 24d7aba991..77c996095b 100644 --- a/src/settings/plugins/keyfile/writer.c +++ b/src/settings/plugins/keyfile/writer.c @@ -142,7 +142,7 @@ write_ip_values (GKeyFile *file, addr = nm_ip_route_get_dest (route); plen = nm_ip_route_get_prefix (route); gw = nm_ip_route_get_next_hop (route); - metric = nm_ip_route_get_metric (route); + metric = MAX (0, nm_ip_route_get_metric (route)); } else { NMIPAddress *address = array->pdata[i]; |