summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2017-12-05 16:32:04 +0100
committerThomas Haller <thaller@redhat.com>2017-12-06 13:16:49 +0100
commita2cd0e6c33c89b8227cc0e27b5690f31d6981966 (patch)
tree19fb84ce069f83c7a307ed124dbc0a0700f8b948
parent5e80bf05575474c2ccf58d061dc26a3914ff63de (diff)
downloadNetworkManager-th/device-route-metric.tar.gz
-rw-r--r--src/devices/nm-device.c55
-rw-r--r--src/devices/nm-device.h12
-rw-r--r--src/nm-config.c61
-rw-r--r--src/nm-config.h15
-rw-r--r--src/nm-manager.c22
5 files changed, 155 insertions, 10 deletions
diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c
index b71f9c2c26..f7f436df98 100644
--- a/src/devices/nm-device.c
+++ b/src/devices/nm-device.c
@@ -279,6 +279,9 @@ typedef struct _NMDevicePrivate {
bool nm_plugin_missing:1;
bool hw_addr_perm_fake:1; /* whether the permanent HW address could not be read and is a fake */
+ bool route_metric_default_has_v4:1;
+ bool route_metric_default_has_v6:1;
+
NMUtilsStableType current_stable_id_type:3;
bool nm_owned:1; /* whether the device is a device owned and created by NM */
@@ -301,6 +304,9 @@ typedef struct _NMDevicePrivate {
guint32 ip4_address;
+ guint32 route_metric_default_val_v4;
+ guint32 route_metric_default_val_v6;
+
NMActRequest * queued_act_request;
bool queued_act_request_is_waiting_for_carrier:1;
bool act_request_public:1;
@@ -1828,14 +1834,46 @@ default_route_metric_penalty_get (NMDevice *self, int addr_family)
return 0;
}
+void
+nm_device_route_metric_default_get (NMDevice *self,
+ gboolean *out_route_metric_default_has_v4,
+ guint32 *out_route_metric_default_val_v4,
+ gboolean *out_route_metric_default_has_v6,
+ guint32 *out_route_metric_default_val_v6)
+{
+ NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
+
+ *out_route_metric_default_has_v4 = priv->route_metric_default_has_v4;
+ *out_route_metric_default_val_v6 = priv->route_metric_default_val_v4;
+ *out_route_metric_default_has_v6 = priv->route_metric_default_has_v6;
+ *out_route_metric_default_val_v6 = priv->route_metric_default_val_v6;
+}
+
+void
+nm_device_route_metric_default_set (NMDevice *self,
+ gboolean route_metric_default_has_v4,
+ guint32 route_metric_default_val_v4,
+ gboolean route_metric_default_has_v6,
+ guint32 route_metric_default_val_v6)
+{
+ NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
+
+ priv->route_metric_default_has_v4 = route_metric_default_has_v4;
+ priv->route_metric_default_val_v4 = route_metric_default_val_v4;
+ priv->route_metric_default_has_v6 = route_metric_default_has_v6;
+ priv->route_metric_default_val_v6 = route_metric_default_val_v6;
+}
+
guint32
nm_device_get_route_metric (NMDevice *self,
int addr_family)
{
+ NMDevicePrivate *priv;
char *value;
gint64 route_metric;
NMSettingIPConfig *s_ip;
NMConnection *connection;
+ gboolean has_metric;
g_return_val_if_fail (NM_IS_DEVICE (self), G_MAXUINT32);
g_return_val_if_fail (NM_IN_SET (addr_family, AF_INET, AF_INET6), G_MAXUINT32);
@@ -1869,7 +1907,22 @@ nm_device_get_route_metric (NMDevice *self,
if (route_metric >= 0)
goto out;
}
- route_metric = nm_device_get_route_metric_default (nm_device_get_device_type (self));
+
+ priv = NM_DEVICE_GET_PRIVATE (self);
+
+ has_metric = (addr_family == AF_INET) ? priv->route_metric_default_has_v4 : priv->route_metric_default_has_v6;
+ if (!has_metric) {
+ route_metric = nm_device_get_route_metric_default (nm_device_get_device_type (self));
+ if (addr_family == AF_INET) {
+ priv->route_metric_default_has_v4 = TRUE;
+ priv->route_metric_default_val_v4 = route_metric;
+ } else {
+ priv->route_metric_default_has_v6 = TRUE;
+ priv->route_metric_default_val_v6 = route_metric;
+ }
+ } else
+ route_metric = (addr_family == AF_INET) ? priv->route_metric_default_val_v4 : priv->route_metric_default_val_v6;
+
out:
return nm_utils_ip_route_metric_normalize (addr_family, route_metric);
}
diff --git a/src/devices/nm-device.h b/src/devices/nm-device.h
index abb2420c14..95581babd6 100644
--- a/src/devices/nm-device.h
+++ b/src/devices/nm-device.h
@@ -452,6 +452,18 @@ guint32 nm_device_get_route_metric (NMDevice *dev, int addr_family)
guint32 nm_device_get_route_metric_default (NMDeviceType device_type);
+void nm_device_route_metric_default_get (NMDevice *self,
+ gboolean *out_route_metric_default_has_v4,
+ guint32 *out_route_metric_default_val_v4,
+ gboolean *out_route_metric_default_has_v6,
+ guint32 *out_route_metric_default_val_v6);
+
+void nm_device_route_metric_default_set (NMDevice *self,
+ gboolean route_metric_default_has_v4,
+ guint32 route_metric_default_val_v4,
+ gboolean route_metric_default_has_v6,
+ guint32 route_metric_default_val_v6);
+
const char * nm_device_get_hw_address (NMDevice *dev);
const char * nm_device_get_permanent_hw_address (NMDevice *self);
const char * nm_device_get_permanent_hw_address_full (NMDevice *self,
diff --git a/src/nm-config.c b/src/nm-config.c
index 3a4572b574..cead84e86d 100644
--- a/src/nm-config.c
+++ b/src/nm-config.c
@@ -1923,6 +1923,8 @@ _nm_config_state_set (NMConfig *self,
#define DEVICE_RUN_STATE_KEYFILE_KEY_DEVICE_PERM_HW_ADDR_FAKE "perm-hw-addr-fake"
#define DEVICE_RUN_STATE_KEYFILE_KEY_DEVICE_CONNECTION_UUID "connection-uuid"
#define DEVICE_RUN_STATE_KEYFILE_KEY_DEVICE_NM_OWNED "nm-owned"
+#define DEVICE_RUN_STATE_KEYFILE_KEY_DEVICE_ROUTE_METRIC_DEFAULT_V4 "route-metric-default-v4"
+#define DEVICE_RUN_STATE_KEYFILE_KEY_DEVICE_ROUTE_METRIC_DEFAULT_V6 "route-metric-default-v6"
NM_UTILS_LOOKUP_STR_DEFINE_STATIC (_device_state_managed_type_to_str, NMConfigDeviceStateManagedType,
NM_UTILS_LOOKUP_DEFAULT_NM_ASSERT ("unknown"),
@@ -1942,6 +1944,11 @@ _config_device_state_data_new (int ifindex, GKeyFile *kf)
gsize perm_hw_addr_fake_len;
gint nm_owned = -1;
char *p;
+ gint64 v_int64;
+ gboolean route_metric_default_has_v4 = FALSE;
+ gboolean route_metric_default_has_v6 = FALSE;
+ guint32 route_metric_default_val_v4 = 0;
+ guint32 route_metric_default_val_v6 = 0;
nm_assert (ifindex > 0);
@@ -1981,6 +1988,24 @@ _config_device_state_data_new (int ifindex, GKeyFile *kf)
DEVICE_RUN_STATE_KEYFILE_GROUP_DEVICE,
DEVICE_RUN_STATE_KEYFILE_KEY_DEVICE_NM_OWNED,
-1);
+
+ v_int64 = nm_config_keyfile_get_int64 (kf,
+ DEVICE_RUN_STATE_KEYFILE_GROUP_DEVICE,
+ DEVICE_RUN_STATE_KEYFILE_KEY_DEVICE_ROUTE_METRIC_DEFAULT_V4,
+ 10, 0, G_MAXINT32, -1);
+ if (v_int64 != -1) {
+ route_metric_default_has_v4 = TRUE;
+ route_metric_default_val_v4 = v_int64;
+ }
+
+ v_int64 = nm_config_keyfile_get_int64 (kf,
+ DEVICE_RUN_STATE_KEYFILE_GROUP_DEVICE,
+ DEVICE_RUN_STATE_KEYFILE_KEY_DEVICE_ROUTE_METRIC_DEFAULT_V6,
+ 10, 0, G_MAXINT32, -1);
+ if (v_int64 != -1) {
+ route_metric_default_has_v6 = TRUE;
+ route_metric_default_val_v6 = v_int64;
+ }
}
connection_uuid_len = connection_uuid ? strlen (connection_uuid) + 1 : 0;
@@ -1995,6 +2020,10 @@ _config_device_state_data_new (int ifindex, GKeyFile *kf)
device_state->connection_uuid = NULL;
device_state->perm_hw_addr_fake = NULL;
device_state->nm_owned = nm_owned;
+ device_state->route_metric_default_has_v4 = route_metric_default_has_v4;
+ device_state->route_metric_default_has_v6 = route_metric_default_has_v6;
+ device_state->route_metric_default_val_v4 = route_metric_default_val_v4;
+ device_state->route_metric_default_val_v6 = route_metric_default_val_v6;
p = (char *) (&device_state[1]);
if (connection_uuid) {
@@ -2039,14 +2068,15 @@ nm_config_device_state_load (int ifindex)
", nm-owned=1" :
(device_state->nm_owned == FALSE ? ", nm-owned=0" : "");
-
- _LOGT ("device-state: %s #%d (%s); managed=%s%s%s%s%s%s%s%s",
+ _LOGT ("device-state: %s #%d (%s); managed=%s%s%s%s%s%s%s%s, route-metric-default-v4=%"G_GINT64_FORMAT", , route-metric-default-v6=%"G_GINT64_FORMAT,
kf ? "read" : "miss",
ifindex, path,
_device_state_managed_type_to_str (device_state->managed),
NM_PRINT_FMT_QUOTED (device_state->connection_uuid, ", connection-uuid=", device_state->connection_uuid, "", ""),
NM_PRINT_FMT_QUOTED (device_state->perm_hw_addr_fake, ", perm-hw-addr-fake=", device_state->perm_hw_addr_fake, "", ""),
- nm_owned_str);
+ nm_owned_str,
+ device_state->route_metric_default_has_v4 ? (gint64) device_state->route_metric_default_val_v4 : (gint64) -1,
+ device_state->route_metric_default_has_v6 ? (gint64) device_state->route_metric_default_val_v6 : (gint64) -1);
return device_state;
}
@@ -2101,7 +2131,11 @@ nm_config_device_state_write (int ifindex,
NMConfigDeviceStateManagedType managed,
const char *perm_hw_addr_fake,
const char *connection_uuid,
- gint nm_owned)
+ gint nm_owned,
+ gboolean route_metric_default_has_v4,
+ guint32 route_metric_default_val_v4,
+ gboolean route_metric_default_has_v6,
+ guint32 route_metric_default_val_v6)
{
char path[NM_STRLEN (NM_CONFIG_DEVICE_STATE_DIR) + 60];
GError *local = NULL;
@@ -2143,17 +2177,32 @@ nm_config_device_state_write (int ifindex,
nm_owned);
}
+ if (route_metric_default_has_v4) {
+ g_key_file_set_int64 (kf,
+ DEVICE_RUN_STATE_KEYFILE_GROUP_DEVICE,
+ DEVICE_RUN_STATE_KEYFILE_KEY_DEVICE_ROUTE_METRIC_DEFAULT_V4,
+ route_metric_default_val_v4);
+ }
+
+ if (route_metric_default_has_v6) {
+ g_key_file_set_int64 (kf,
+ DEVICE_RUN_STATE_KEYFILE_GROUP_DEVICE,
+ DEVICE_RUN_STATE_KEYFILE_KEY_DEVICE_ROUTE_METRIC_DEFAULT_V6,
+ route_metric_default_val_v6);
+ }
if (!g_key_file_save_to_file (kf, path, &local)) {
_LOGW ("device-state: write #%d (%s) failed: %s", ifindex, path, local->message);
g_error_free (local);
return FALSE;
}
- _LOGT ("device-state: write #%d (%s); managed=%s%s%s%s%s%s%s",
+ _LOGT ("device-state: write #%d (%s); managed=%s%s%s%s%s%s%s, route-metric-default-v4=%"G_GINT64_FORMAT", , route-metric-default-v6=%"G_GINT64_FORMAT,
ifindex, path,
_device_state_managed_type_to_str (managed),
NM_PRINT_FMT_QUOTED (connection_uuid, ", connection-uuid=", connection_uuid, "", ""),
- NM_PRINT_FMT_QUOTED (perm_hw_addr_fake, ", perm-hw-addr-fake=", perm_hw_addr_fake, "", ""));
+ NM_PRINT_FMT_QUOTED (perm_hw_addr_fake, ", perm-hw-addr-fake=", perm_hw_addr_fake, "", ""),
+ route_metric_default_has_v4 ? (gint64) route_metric_default_val_v4 : (gint64) -1,
+ route_metric_default_has_v6 ? (gint64) route_metric_default_val_v6 : (gint64) -1);
return TRUE;
}
diff --git a/src/nm-config.h b/src/nm-config.h
index d2bb8394f4..f6a5bf7dae 100644
--- a/src/nm-config.h
+++ b/src/nm-config.h
@@ -212,6 +212,9 @@ struct _NMConfigDeviceStateData {
int ifindex;
NMConfigDeviceStateManagedType managed;
+ guint32 route_metric_default_val_v4;
+ guint32 route_metric_default_val_v6;
+
/* the UUID of the last settings-connection active
* on the device. */
const char *connection_uuid;
@@ -220,7 +223,10 @@ struct _NMConfigDeviceStateData {
/* whether the device was nm-owned (0/1) or -1 for
* non-software devices. */
- gint nm_owned;
+ int nm_owned:3;
+
+ bool route_metric_default_has_v4:1;
+ bool route_metric_default_has_v6:1;
};
NMConfigDeviceStateData *nm_config_device_state_load (int ifindex);
@@ -229,7 +235,12 @@ gboolean nm_config_device_state_write (int ifindex,
NMConfigDeviceStateManagedType managed,
const char *perm_hw_addr_fake,
const char *connection_uuid,
- gint nm_owned);
+ gint nm_owned,
+ gboolean route_metric_default_has_v4,
+ guint32 route_metric_default_val_v4,
+ gboolean route_metric_default_has_v6,
+ guint32 route_metric_default_val_v6);
+
void nm_config_device_state_prune_unseen (GHashTable *seen_ifindexes);
/*****************************************************************************/
diff --git a/src/nm-manager.c b/src/nm-manager.c
index 04d17f9b23..b2f6d0c140 100644
--- a/src/nm-manager.c
+++ b/src/nm-manager.c
@@ -2523,6 +2523,12 @@ platform_link_added (NMManager *self,
}
}
+ nm_device_route_metric_default_set (device,
+ dev_state ? dev_state->route_metric_default_has_v4 : FALSE,
+ dev_state ? dev_state->route_metric_default_val_v4 : (guint32) 0,
+ dev_state ? dev_state->route_metric_default_has_v6 : FALSE,
+ dev_state ? dev_state->route_metric_default_val_v6 : (guint32) 0);
+
if (nm_device_realize_start (device,
plink,
guess_assume,
@@ -5200,6 +5206,10 @@ nm_manager_write_device_state (NMManager *self)
const char *uuid = NULL;
const char *perm_hw_addr_fake = NULL;
gboolean perm_hw_addr_is_fake;
+ gboolean route_metric_default_has_v4 = FALSE;
+ gboolean route_metric_default_has_v6 = FALSE;
+ guint32 route_metric_default_val_v4 = 0;
+ guint32 route_metric_default_val_v6 = 0;
ifindex = nm_device_get_ip_ifindex (device);
if (ifindex <= 0)
@@ -5229,11 +5239,21 @@ nm_manager_write_device_state (NMManager *self)
nm_owned = nm_device_is_software (device) ? nm_device_is_nm_owned (device) : -1;
+ nm_device_route_metric_default_get (device,
+ &route_metric_default_has_v4,
+ &route_metric_default_val_v4,
+ &route_metric_default_has_v6,
+ &route_metric_default_val_v6);
+
if (nm_config_device_state_write (ifindex,
managed_type,
perm_hw_addr_fake,
uuid,
- nm_owned))
+ nm_owned,
+ route_metric_default_has_v4,
+ route_metric_default_val_v6,
+ route_metric_default_has_v6,
+ route_metric_default_val_v6))
g_hash_table_add (seen_ifindexes, GINT_TO_POINTER (ifindex));
}