diff options
author | Thomas Haller <thaller@redhat.com> | 2017-12-05 16:32:04 +0100 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2017-12-06 13:16:49 +0100 |
commit | a2cd0e6c33c89b8227cc0e27b5690f31d6981966 (patch) | |
tree | 19fb84ce069f83c7a307ed124dbc0a0700f8b948 | |
parent | 5e80bf05575474c2ccf58d061dc26a3914ff63de (diff) | |
download | NetworkManager-th/device-route-metric.tar.gz |
device: xxxxth/device-route-metric
-rw-r--r-- | src/devices/nm-device.c | 55 | ||||
-rw-r--r-- | src/devices/nm-device.h | 12 | ||||
-rw-r--r-- | src/nm-config.c | 61 | ||||
-rw-r--r-- | src/nm-config.h | 15 | ||||
-rw-r--r-- | src/nm-manager.c | 22 |
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)); } |