import patches from rhel-7.4

Let's keep rhel-7.4 and Fedora package in sync, so Fedora benefits
from bugfixes during rhel-7.4 development and RHEL benefits from
additional testing by the community.

These are all upstream patches originally cherry-picked from
nm-1-8 branch.
This commit is contained in:
Thomas Haller 2017-05-20 11:01:15 +02:00
parent 085f84674b
commit 5ac481bbc0
9 changed files with 2956 additions and 4 deletions

View File

@ -1,4 +1,4 @@
From bf2a90588410a7d81ff86a6dcf09521316f23ffb Mon Sep 17 00:00:00 2001
From 1ea56b82121d3f024859da41337cf2406e7f2e61 Mon Sep 17 00:00:00 2001
From: Thomas Haller <thaller@redhat.com>
Date: Wed, 10 May 2017 15:31:15 +0200
Subject: [PATCH 1/1] utils: fix maybe-uninitialized in "nm-udev-utils.c"

View File

@ -0,0 +1,140 @@
From f2d099c8c534ee426dbc31a3a61fcf27c18b92d8 Mon Sep 17 00:00:00 2001
From: Thomas Haller <thaller@redhat.com>
Date: Thu, 11 May 2017 19:26:28 +0200
Subject: [PATCH 1/2] core: cleanup logging reading device-state
- print string value instead of numerical "managed"
- for missing state, print the same format. After all,
some defaults apply and it is interesting to know what
they are.
(cherry picked from commit 81008c90ac9832ade1c9783078823fdd45221225)
(cherry picked from commit 8da225283b9977554a6b78e73dc03d22b8703027)
---
src/nm-config.c | 30 +++++++++++++-----------------
1 file changed, 13 insertions(+), 17 deletions(-)
diff --git a/src/nm-config.c b/src/nm-config.c
index 2cdf855..954cad7 100644
--- a/src/nm-config.c
+++ b/src/nm-config.c
@@ -1873,6 +1873,13 @@ _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"
+NM_UTILS_LOOKUP_STR_DEFINE_STATIC (_device_state_managed_type_to_str, NMConfigDeviceStateManagedType,
+ NM_UTILS_LOOKUP_DEFAULT_NM_ASSERT ("unknown"),
+ NM_UTILS_LOOKUP_STR_ITEM (NM_CONFIG_DEVICE_STATE_MANAGED_TYPE_UNKNOWN, "unknown"),
+ NM_UTILS_LOOKUP_STR_ITEM (NM_CONFIG_DEVICE_STATE_MANAGED_TYPE_UNMANAGED, "unmanaged"),
+ NM_UTILS_LOOKUP_STR_ITEM (NM_CONFIG_DEVICE_STATE_MANAGED_TYPE_MANAGED, "managed"),
+);
+
static NMConfigDeviceStateData *
_config_device_state_data_new (int ifindex, GKeyFile *kf)
{
@@ -1968,27 +1975,16 @@ nm_config_device_state_load (int ifindex)
device_state = _config_device_state_data_new (ifindex, kf);
- if (kf) {
- _LOGT ("device-state: read #%d (%s); managed=%d%s%s%s%s%s%s",
- ifindex, path,
- 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, "", ""));
- } else {
- _LOGT ("device-state: read #%d (%s); no persistent state",
- ifindex, path);
- }
+ _LOGT ("device-state: %s #%d (%s); managed=%s%s%s%s%s%s%s",
+ 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, "", ""));
return device_state;
}
-NM_UTILS_LOOKUP_STR_DEFINE_STATIC (_device_state_managed_type_to_str, NMConfigDeviceStateManagedType,
- NM_UTILS_LOOKUP_DEFAULT_NM_ASSERT ("unknown"),
- NM_UTILS_LOOKUP_STR_ITEM (NM_CONFIG_DEVICE_STATE_MANAGED_TYPE_UNKNOWN, "unknown"),
- NM_UTILS_LOOKUP_STR_ITEM (NM_CONFIG_DEVICE_STATE_MANAGED_TYPE_UNMANAGED, "unmanaged"),
- NM_UTILS_LOOKUP_STR_ITEM (NM_CONFIG_DEVICE_STATE_MANAGED_TYPE_MANAGED, "managed"),
-);
-
gboolean
nm_config_device_state_write (int ifindex,
NMConfigDeviceStateManagedType managed,
--
2.9.3
From 41ff1247a2dcfd6c781cbce2fac12ab6ae657727 Mon Sep 17 00:00:00 2001
From: Thomas Haller <thaller@redhat.com>
Date: Thu, 11 May 2017 19:40:55 +0200
Subject: [PATCH 2/2] core: fix reading device state file
For manged=unknown, we don't write the value to the
device state keyfile. The results in an empty file,
or at least, a keyfile that doesn't have device.managed
set.
On read, we must treat a missing device.managed flag as
unknown, and not as unmanaged. Otherwise, on restart
a device becomes marked as explicitly unmanaged.
This was broken by commit 142ebb1 "core: only persist explicit managed
state in device's state file", where we started conditionally
to no longer write the managed state.
Reported-by: Michael Biebl <mbiebl@debian.org>
Fixes: 142ebb10376ec592593f15b0359f38be89c97620
(cherry picked from commit 348ffdec183ee198499dad1365906e8d16ff4122)
(cherry picked from commit 33d3ec3b3e5d2e737afc8db6c64850e67db5c12d)
---
src/nm-config.c | 24 +++++++++++++-----------
1 file changed, 13 insertions(+), 11 deletions(-)
diff --git a/src/nm-config.c b/src/nm-config.c
index 954cad7..54ccf9a 100644
--- a/src/nm-config.c
+++ b/src/nm-config.c
@@ -1894,21 +1894,23 @@ _config_device_state_data_new (int ifindex, GKeyFile *kf)
nm_assert (ifindex > 0);
if (kf) {
- gboolean managed;
-
- managed = nm_config_keyfile_get_boolean (kf,
- DEVICE_RUN_STATE_KEYFILE_GROUP_DEVICE,
- DEVICE_RUN_STATE_KEYFILE_KEY_DEVICE_MANAGED,
- FALSE);
- managed_type = managed
- ? NM_CONFIG_DEVICE_STATE_MANAGED_TYPE_MANAGED
- : NM_CONFIG_DEVICE_STATE_MANAGED_TYPE_UNMANAGED;
-
- if (managed) {
+ switch (nm_config_keyfile_get_boolean (kf,
+ DEVICE_RUN_STATE_KEYFILE_GROUP_DEVICE,
+ DEVICE_RUN_STATE_KEYFILE_KEY_DEVICE_MANAGED,
+ -1)) {
+ case TRUE:
+ managed_type = NM_CONFIG_DEVICE_STATE_MANAGED_TYPE_MANAGED;
connection_uuid = nm_config_keyfile_get_value (kf,
DEVICE_RUN_STATE_KEYFILE_GROUP_DEVICE,
DEVICE_RUN_STATE_KEYFILE_KEY_DEVICE_CONNECTION_UUID,
NM_CONFIG_GET_VALUE_STRIP | NM_CONFIG_GET_VALUE_NO_EMPTY);
+ break;
+ case FALSE:
+ managed_type = NM_CONFIG_DEVICE_STATE_MANAGED_TYPE_UNMANAGED;
+ break;
+ case -1:
+ /* missing property in keyfile. */
+ break;
}
perm_hw_addr_fake = nm_config_keyfile_get_value (kf,
--
2.9.3

View File

@ -0,0 +1,65 @@
From 4bf6a4dd5b73fcea36fcfa4a97091665b233bc15 Mon Sep 17 00:00:00 2001
From: Thomas Haller <thaller@redhat.com>
Date: Thu, 11 May 2017 12:09:45 +0200
Subject: [PATCH 1/2] proxy: fix refcount handing for DestroyProxyConfiguration
operation
Fixes: e895beb0da38fc87ce93fe7403a6b50e92f0dd82
(cherry picked from commit df137fdf9a7077c20d8923f068568c22fb479e5a)
(cherry picked from commit 10373de9072f0318ea1150c85fd7b7ebfa5a9655)
---
src/nm-pacrunner-manager.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/nm-pacrunner-manager.c b/src/nm-pacrunner-manager.c
index cfc028c..fd3d1f8 100644
--- a/src/nm-pacrunner-manager.c
+++ b/src/nm-pacrunner-manager.c
@@ -250,6 +250,7 @@ pacrunner_send_done (GDBusProxy *proxy, GAsyncResult *res, gpointer user_data)
_LOG2D (config, "sent");
if (config->removed) {
+ config_ref (config);
g_dbus_proxy_call (priv->pacrunner,
"DestroyProxyConfiguration",
g_variant_new ("(o)", config->path),
--
2.9.3
From 617aa8fd2fccbd8a8cb76fbf9bce3e74eac78f8c Mon Sep 17 00:00:00 2001
From: Thomas Haller <thaller@redhat.com>
Date: Thu, 11 May 2017 12:32:22 +0200
Subject: [PATCH 2/2] proxy: fix passing cancellable to async D-Bus operations
We must not cancel pacrunner_cancellable when the D-Bus proxy is
created. Instead, keep it around and use it later for the asynchronous
D-Bus operations.
This doesn't really matter at the moment, because the pacrunner manager
is only destroyed when NetworkManager is about to terminated. That is
the only time when we actually cancel the asynchronous request. Also,
at that time we no longer iterate the mainloop, so the pending requests
are never completed anyway.
(cherry picked from commit a08540d967812457af192ebd34497412da5d143e)
(cherry picked from commit 6cfd9279625366c24808d86e1c3b04a18a036eb6)
---
src/nm-pacrunner-manager.c | 1 -
1 file changed, 1 deletion(-)
diff --git a/src/nm-pacrunner-manager.c b/src/nm-pacrunner-manager.c
index fd3d1f8..87e0a36 100644
--- a/src/nm-pacrunner-manager.c
+++ b/src/nm-pacrunner-manager.c
@@ -330,7 +330,6 @@ pacrunner_proxy_cb (GObject *source, GAsyncResult *res, gpointer user_data)
priv = NM_PACRUNNER_MANAGER_GET_PRIVATE (self);
priv->pacrunner = proxy;
- nm_clear_g_cancellable (&priv->pacrunner_cancellable);
g_signal_connect (priv->pacrunner, "notify::g-name-owner",
G_CALLBACK (name_owner_changed_cb), self);
--
2.9.3

View File

@ -0,0 +1,586 @@
From fde61a81ee3ff70c85aed230bcfda79f2fb70ea8 Mon Sep 17 00:00:00 2001
From: Thomas Haller <thaller@redhat.com>
Date: Fri, 12 May 2017 16:17:18 +0200
Subject: [PATCH 1/7] device: don't call virtual function carrier_changed()
directly
Don't give the subclass the ability to override the parents
behavior. The parent implementation is not intended to allow
for that. Instead, restrict the flexibility of how the virtual
function integrates with the larger picture. That means, the
virtual function is only called at one place, and there is only
one implementation in NMDeviceEthernet (and it doesn't really
matter whether the implementation chains up the parent implementation
or not).
(cherry picked from commit 5a7374d8be33086a5c00a450a472069595ba1734)
(cherry picked from commit e9aa3cc3575b8456eb712c0e06dc815940b49cbc)
---
src/devices/nm-device-ethernet.c | 7 +++----
src/devices/nm-device.c | 17 ++++++++++++-----
src/devices/nm-device.h | 2 +-
3 files changed, 16 insertions(+), 10 deletions(-)
diff --git a/src/devices/nm-device-ethernet.c b/src/devices/nm-device-ethernet.c
index 4c5aeb5..8a04d40 100644
--- a/src/devices/nm-device-ethernet.c
+++ b/src/devices/nm-device-ethernet.c
@@ -1597,12 +1597,11 @@ get_link_speed (NMDevice *device)
}
static void
-carrier_changed (NMDevice *device, gboolean carrier)
+carrier_changed_notify (NMDevice *device, gboolean carrier)
{
if (carrier)
get_link_speed (device);
-
- NM_DEVICE_CLASS (nm_device_ethernet_parent_class)->carrier_changed (device, carrier);
+ NM_DEVICE_CLASS (nm_device_ethernet_parent_class)->carrier_changed_notify (device, carrier);
}
static void
@@ -1764,7 +1763,7 @@ nm_device_ethernet_class_init (NMDeviceEthernetClass *klass)
parent_class->deactivate = deactivate;
parent_class->get_s390_subchannels = get_s390_subchannels;
parent_class->update_connection = update_connection;
- parent_class->carrier_changed = carrier_changed;
+ parent_class->carrier_changed_notify = carrier_changed_notify;
parent_class->link_changed = link_changed;
parent_class->is_available = is_available;
parent_class->can_reapply_change = can_reapply_change;
diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c
index 9c30790..652bede 100644
--- a/src/devices/nm-device.c
+++ b/src/devices/nm-device.c
@@ -2168,10 +2168,18 @@ nm_device_update_dynamic_ip_setup (NMDevice *self)
}
static void
+carrier_changed_notify (NMDevice *self, gboolean carrier)
+{
+ /* stub */
+}
+
+static void
carrier_changed (NMDevice *self, gboolean carrier)
{
NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
+ NM_DEVICE_GET_CLASS (self)->carrier_changed_notify (self, carrier);
+
if (priv->state <= NM_DEVICE_STATE_UNMANAGED)
return;
@@ -2245,7 +2253,7 @@ link_disconnect_action_cb (gpointer user_data)
priv->carrier_defer_id = 0;
- NM_DEVICE_GET_CLASS (self)->carrier_changed (self, FALSE);
+ carrier_changed (self, FALSE);
return FALSE;
}
@@ -2266,7 +2274,6 @@ void
nm_device_set_carrier (NMDevice *self, gboolean carrier)
{
NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
- NMDeviceClass *klass = NM_DEVICE_GET_CLASS (self);
NMDeviceState state = nm_device_get_state (self);
if (priv->carrier == carrier)
@@ -2278,7 +2285,7 @@ nm_device_set_carrier (NMDevice *self, gboolean carrier)
if (priv->carrier) {
_LOGI (LOGD_DEVICE, "link connected");
link_disconnect_action_cancel (self);
- klass->carrier_changed (self, TRUE);
+ carrier_changed (self, TRUE);
if (nm_clear_g_source (&priv->carrier_wait_id)) {
nm_device_remove_pending_action (self, NM_PENDING_ACTION_CARRIER_WAIT, TRUE);
@@ -2287,7 +2294,7 @@ nm_device_set_carrier (NMDevice *self, gboolean carrier)
} else if ( state <= NM_DEVICE_STATE_DISCONNECTED
&& !priv->queued_act_request) {
_LOGD (LOGD_DEVICE, "link disconnected");
- klass->carrier_changed (self, FALSE);
+ carrier_changed (self, FALSE);
} else {
priv->carrier_defer_id = g_timeout_add_seconds (LINK_DISCONNECT_DELAY,
link_disconnect_action_cb, self);
@@ -14162,7 +14169,7 @@ nm_device_class_init (NMDeviceClass *klass)
klass->can_unmanaged_external_down = can_unmanaged_external_down;
klass->realize_start_notify = realize_start_notify;
klass->unrealize_notify = unrealize_notify;
- klass->carrier_changed = carrier_changed;
+ klass->carrier_changed_notify = carrier_changed_notify;
klass->get_ip_iface_identifier = get_ip_iface_identifier;
klass->unmanaged_on_quit = unmanaged_on_quit;
klass->deactivate_reset_hw_addr = deactivate_reset_hw_addr;
diff --git a/src/devices/nm-device.h b/src/devices/nm-device.h
index be328eb..5e6abb4 100644
--- a/src/devices/nm-device.h
+++ b/src/devices/nm-device.h
@@ -261,7 +261,7 @@ typedef struct {
gboolean (*can_unmanaged_external_down) (NMDevice *self);
/* Carrier state (IFF_LOWER_UP) */
- void (*carrier_changed) (NMDevice *, gboolean carrier);
+ void (*carrier_changed_notify) (NMDevice *, gboolean carrier);
gboolean (* get_ip_iface_identifier) (NMDevice *self, NMUtilsIPv6IfaceId *out_iid);
--
2.9.4
From 02daf0bdd66115456c6d9ccbf99909996013239d Mon Sep 17 00:00:00 2001
From: Thomas Haller <thaller@redhat.com>
Date: Fri, 12 May 2017 16:21:55 +0200
Subject: [PATCH 2/7] device/trivial: rename functions related to "carrier"
(cherry picked from commit a07c6255a02e098dae934ee0e6765e1ce5b927ae)
(cherry picked from commit 0ed6b5bfff4d8a915e69866d15027d26e3785271)
---
src/devices/nm-device.c | 14 +++++++++-----
1 file changed, 9 insertions(+), 5 deletions(-)
diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c
index 652bede..e615f32 100644
--- a/src/devices/nm-device.c
+++ b/src/devices/nm-device.c
@@ -2167,6 +2167,8 @@ nm_device_update_dynamic_ip_setup (NMDevice *self)
}
}
+/*****************************************************************************/
+
static void
carrier_changed_notify (NMDevice *self, gboolean carrier)
{
@@ -2244,7 +2246,7 @@ carrier_changed (NMDevice *self, gboolean carrier)
#define LINK_DISCONNECT_DELAY 4
static gboolean
-link_disconnect_action_cb (gpointer user_data)
+carrier_disconnected_action_cb (gpointer user_data)
{
NMDevice *self = NM_DEVICE (user_data);
NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
@@ -2259,7 +2261,7 @@ link_disconnect_action_cb (gpointer user_data)
}
static void
-link_disconnect_action_cancel (NMDevice *self)
+carrier_disconnected_action_cancel (NMDevice *self)
{
NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
@@ -2284,7 +2286,7 @@ nm_device_set_carrier (NMDevice *self, gboolean carrier)
if (priv->carrier) {
_LOGI (LOGD_DEVICE, "link connected");
- link_disconnect_action_cancel (self);
+ carrier_disconnected_action_cancel (self);
carrier_changed (self, TRUE);
if (nm_clear_g_source (&priv->carrier_wait_id)) {
@@ -2297,12 +2299,14 @@ nm_device_set_carrier (NMDevice *self, gboolean carrier)
carrier_changed (self, FALSE);
} else {
priv->carrier_defer_id = g_timeout_add_seconds (LINK_DISCONNECT_DELAY,
- link_disconnect_action_cb, self);
+ carrier_disconnected_action_cb, self);
_LOGD (LOGD_DEVICE, "link disconnected (deferring action for %d seconds) (id=%u)",
LINK_DISCONNECT_DELAY, priv->carrier_defer_id);
}
}
+/*****************************************************************************/
+
static void
device_recheck_slave_status (NMDevice *self, const NMPlatformLink *plink)
{
@@ -13775,7 +13779,7 @@ dispose (GObject *object)
nm_clear_g_source (&priv->stats.timeout_id);
- link_disconnect_action_cancel (self);
+ carrier_disconnected_action_cancel (self);
if (priv->ifindex > 0) {
priv->ifindex = 0;
--
2.9.4
From 5385cb00a8686c55e84f1924038ec20102939ac9 Mon Sep 17 00:00:00 2001
From: Thomas Haller <thaller@redhat.com>
Date: Fri, 12 May 2017 16:22:47 +0200
Subject: [PATCH 3/7] device: minor cleanup of
carrier_disconnected_action_cancel()
(cherry picked from commit 6c5d883a4bd9ef167ee4fe8ec2b0187c7bc77142)
(cherry picked from commit 62f1875766a181528c36596b7bd16a78663879cc)
---
src/devices/nm-device.c | 10 ++++------
1 file changed, 4 insertions(+), 6 deletions(-)
diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c
index e615f32..dabe87e 100644
--- a/src/devices/nm-device.c
+++ b/src/devices/nm-device.c
@@ -2254,9 +2254,7 @@ carrier_disconnected_action_cb (gpointer user_data)
_LOGD (LOGD_DEVICE, "link disconnected (calling deferred action) (id=%u)", priv->carrier_defer_id);
priv->carrier_defer_id = 0;
-
carrier_changed (self, FALSE);
-
return FALSE;
}
@@ -2264,11 +2262,11 @@ static void
carrier_disconnected_action_cancel (NMDevice *self)
{
NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
+ guint id = priv->carrier_defer_id;
- if (priv->carrier_defer_id) {
- g_source_remove (priv->carrier_defer_id);
- _LOGD (LOGD_DEVICE, "link disconnected (canceling deferred action) (id=%u)", priv->carrier_defer_id);
- priv->carrier_defer_id = 0;
+ if (nm_clear_g_source (&priv->carrier_defer_id)) {
+ _LOGD (LOGD_DEVICE, "link disconnected (canceling deferred action) (id=%u)",
+ id);
}
}
--
2.9.4
From 68703df31190d899d881490ce3f0742890a3f5d2 Mon Sep 17 00:00:00 2001
From: Thomas Haller <thaller@redhat.com>
Date: Fri, 12 May 2017 16:48:57 +0200
Subject: [PATCH 4/7] device: downgrade logging messages about (non) pending
action
Adding/Removing a pending action with assert_not_yet_pending/
assert_is_pending means that we expect that no action is taken.
Downgrade the logging level in those cases to <trace>.
(cherry picked from commit eaba285375248a691aaa896fecdd991ad695c1b1)
(cherry picked from commit f4600c7fa5afd960fb3657ca6d694e56f5dc5dac)
---
src/devices/nm-device.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c
index dabe87e..d58c50d 100644
--- a/src/devices/nm-device.c
+++ b/src/devices/nm-device.c
@@ -11821,7 +11821,7 @@ nm_device_add_pending_action (NMDevice *self, const char *action, gboolean asser
count + g_slist_length (iter), action);
g_return_val_if_reached (FALSE);
} else {
- _LOGD (LOGD_DEVICE, "add_pending_action (%d): '%s' already pending (expected)",
+ _LOGT (LOGD_DEVICE, "add_pending_action (%d): '%s' already pending (expected)",
count + g_slist_length (iter), action);
}
return FALSE;
@@ -11882,7 +11882,7 @@ nm_device_remove_pending_action (NMDevice *self, const char *action, gboolean as
_LOGW (LOGD_DEVICE, "remove_pending_action (%d): '%s' not pending", count, action);
g_return_val_if_reached (FALSE);
} else
- _LOGD (LOGD_DEVICE, "remove_pending_action (%d): '%s' not pending (expected)", count, action);
+ _LOGT (LOGD_DEVICE, "remove_pending_action (%d): '%s' not pending (expected)", count, action);
return FALSE;
}
--
2.9.4
From 8615608b36b72f8c47ae813583bad31ae7f7ec0c Mon Sep 17 00:00:00 2001
From: Thomas Haller <thaller@redhat.com>
Date: Sun, 14 May 2017 22:08:26 +0200
Subject: [PATCH 5/7] device: rename and minor refactoring of check_carrier()
The name should mirror what we already have: nm_device_set_carrier().
Also, move the code closer to nm_device_set_carrier() and refactor
it a bit.
(cherry picked from commit 7e472b4eb36347684e81e1c3a2bd7348e19eb628)
(cherry picked from commit 83c2243d800fb20a651f787b65e6c5586a6f970d)
---
src/devices/nm-device.c | 23 ++++++++++++-----------
1 file changed, 12 insertions(+), 11 deletions(-)
diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c
index d58c50d..4a330d0 100644
--- a/src/devices/nm-device.c
+++ b/src/devices/nm-device.c
@@ -2303,6 +2303,16 @@ nm_device_set_carrier (NMDevice *self, gboolean carrier)
}
}
+static void
+nm_device_set_carrier_from_platform (NMDevice *self)
+{
+ if (!nm_device_has_capability (self, NM_DEVICE_CAP_NONSTANDARD_CARRIER)) {
+ nm_device_set_carrier (self,
+ nm_platform_link_is_connected (nm_device_get_platform (self),
+ nm_device_get_ip_ifindex (self)));
+ }
+}
+
/*****************************************************************************/
static void
@@ -2881,15 +2891,6 @@ config_changed (NMConfig *config,
}
static void
-check_carrier (NMDevice *self)
-{
- int ifindex = nm_device_get_ip_ifindex (self);
-
- if (!nm_device_has_capability (self, NM_DEVICE_CAP_NONSTANDARD_CARRIER))
- nm_device_set_carrier (self, nm_platform_link_is_connected (nm_device_get_platform (self), ifindex));
-}
-
-static void
realize_start_notify (NMDevice *self,
const NMPlatformLink *pllink)
{
@@ -3020,7 +3021,7 @@ realize_start_setup (NMDevice *self,
}
if (nm_device_has_capability (self, NM_DEVICE_CAP_CARRIER_DETECT)) {
- check_carrier (self);
+ nm_device_set_carrier_from_platform (self);
_LOGD (LOGD_PLATFORM,
"carrier is %s%s",
priv->carrier ? "ON" : "OFF",
@@ -10343,7 +10344,7 @@ nm_device_bring_up (NMDevice *self, gboolean block, gboolean *no_firmware)
/* Store carrier immediately. */
if (nm_device_has_capability (self, NM_DEVICE_CAP_CARRIER_DETECT))
- check_carrier (self);
+ nm_device_set_carrier_from_platform (self);
device_is_up = nm_device_is_up (self);
if (block && !device_is_up) {
--
2.9.4
From 1520c770db02577c54bf25736adba5d344378568 Mon Sep 17 00:00:00 2001
From: Thomas Haller <thaller@redhat.com>
Date: Mon, 15 May 2017 11:35:41 +0200
Subject: [PATCH 6/7] device: cleanup nm_device_set_carrier_from_platform()
nm_device_set_carrier_from_platform() is only called from two places.
- both check for NM_DEVICE_CAP_CARRIER_DETECT, so move that check
inside the function.
- drop the logging in realize_start_setup(). nm_device_set_carrier() already
does logging.
- always set the fake carrier in nm_device_set_carrier_from_platform().
For the fake carrer, we anyway expect it to be already TRUE in most
case, so usually this should have no effect.
Also emit a property changed signal. That is necessary to refresh the
D-Bus property.
(cherry picked from commit 02bb4ce7eb518bf955ed802511f1efde921bc919)
(cherry picked from commit 3786e17c0f86561e23779490ec5032b432aa7178)
---
src/devices/nm-device.c | 32 ++++++++++++++++----------------
1 file changed, 16 insertions(+), 16 deletions(-)
diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c
index 4a330d0..851e0a3 100644
--- a/src/devices/nm-device.c
+++ b/src/devices/nm-device.c
@@ -2306,10 +2306,20 @@ nm_device_set_carrier (NMDevice *self, gboolean carrier)
static void
nm_device_set_carrier_from_platform (NMDevice *self)
{
- if (!nm_device_has_capability (self, NM_DEVICE_CAP_NONSTANDARD_CARRIER)) {
- nm_device_set_carrier (self,
- nm_platform_link_is_connected (nm_device_get_platform (self),
- nm_device_get_ip_ifindex (self)));
+ if (nm_device_has_capability (self, NM_DEVICE_CAP_CARRIER_DETECT)) {
+ if (!nm_device_has_capability (self, NM_DEVICE_CAP_NONSTANDARD_CARRIER)) {
+ nm_device_set_carrier (self,
+ nm_platform_link_is_connected (nm_device_get_platform (self),
+ nm_device_get_ip_ifindex (self)));
+ }
+ } else {
+ NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
+
+ /* Fake online link when carrier detection is not available. */
+ if (!priv->carrier) {
+ priv->carrier = TRUE;
+ _notify (self, PROP_CARRIER);
+ }
}
}
@@ -3020,16 +3030,7 @@ realize_start_setup (NMDevice *self,
self);
}
- if (nm_device_has_capability (self, NM_DEVICE_CAP_CARRIER_DETECT)) {
- nm_device_set_carrier_from_platform (self);
- _LOGD (LOGD_PLATFORM,
- "carrier is %s%s",
- priv->carrier ? "ON" : "OFF",
- priv->ignore_carrier ? " (but ignored)" : "");
- } else {
- /* Fake online link when carrier detection is not available. */
- priv->carrier = TRUE;
- }
+ nm_device_set_carrier_from_platform (self);
device_init_sriov_num_vfs (self);
@@ -10343,8 +10344,7 @@ nm_device_bring_up (NMDevice *self, gboolean block, gboolean *no_firmware)
}
/* Store carrier immediately. */
- if (nm_device_has_capability (self, NM_DEVICE_CAP_CARRIER_DETECT))
- nm_device_set_carrier_from_platform (self);
+ nm_device_set_carrier_from_platform (self);
device_is_up = nm_device_is_up (self);
if (block && !device_is_up) {
--
2.9.4
From 15bb8709410d829c63b502ac845b93a8c95c3f15 Mon Sep 17 00:00:00 2001
From: Thomas Haller <thaller@redhat.com>
Date: Fri, 12 May 2017 16:32:15 +0200
Subject: [PATCH 7/7] device: fix delaying startup complete waiting for carrier
platform: signal: link changed: 2: eth0 <DOWN;broadcast,multicast> mtu ...
...
device[0x7f90c29c64d0] (eth0): bringing up device
...
platform: signal: link changed: 2: eth0 <UP,LOWER_UP;broadcast,multicast,up,running,lowerup> mtu ...
...
device (eth0): link connected
...
device[0x7f90c29c64d0] (eth0): add_pending_action (2): 'carrier wait'
Note how we schedule the pending action 'carrier-wait', although the device
already has carrier. That means, the pending action will not be removed
until timeout, 5 seconds later.
Avoid scheduling 'carrier-wait' if we already have carrier.
However, don't just add the pending action 'carrier-wait' only during
nm_device_bring_up(). Instead, always schedule the carrier_wait timeout.
This gives a grace period during which we keep setting 'carrier-wait' whenever
we have no carrier. This should prevent two cases:
- during nm_device_bring_up() the platform state might not yet have
caught up. If we don't add the pending action there, we will add
it a moment later when carrier goes away.
- bringing the interface up might cause carrier to get lost for a
moment (flapping). If that happens within the timeout, also add the
pending action.
(cherry picked from commit 9f874d166d260bb4b9af32cb8d12d287341a9a8b)
(cherry picked from commit 51a1fc3cd9f281f1348cf0ec1ea17d4d03ecd0b7)
---
src/devices/nm-device.c | 47 +++++++++++++++++++++++++++++------------------
1 file changed, 29 insertions(+), 18 deletions(-)
diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c
index 851e0a3..8540b4c 100644
--- a/src/devices/nm-device.c
+++ b/src/devices/nm-device.c
@@ -2287,19 +2287,23 @@ nm_device_set_carrier (NMDevice *self, gboolean carrier)
carrier_disconnected_action_cancel (self);
carrier_changed (self, TRUE);
- if (nm_clear_g_source (&priv->carrier_wait_id)) {
- nm_device_remove_pending_action (self, NM_PENDING_ACTION_CARRIER_WAIT, TRUE);
+ if (priv->carrier_wait_id) {
+ nm_device_remove_pending_action (self, NM_PENDING_ACTION_CARRIER_WAIT, FALSE);
_carrier_wait_check_queued_act_request (self);
}
- } else if ( state <= NM_DEVICE_STATE_DISCONNECTED
- && !priv->queued_act_request) {
- _LOGD (LOGD_DEVICE, "link disconnected");
- carrier_changed (self, FALSE);
} else {
- priv->carrier_defer_id = g_timeout_add_seconds (LINK_DISCONNECT_DELAY,
- carrier_disconnected_action_cb, self);
- _LOGD (LOGD_DEVICE, "link disconnected (deferring action for %d seconds) (id=%u)",
- LINK_DISCONNECT_DELAY, priv->carrier_defer_id);
+ if (priv->carrier_wait_id)
+ nm_device_add_pending_action (self, NM_PENDING_ACTION_CARRIER_WAIT, FALSE);
+ if ( state <= NM_DEVICE_STATE_DISCONNECTED
+ && !priv->queued_act_request) {
+ _LOGD (LOGD_DEVICE, "link disconnected");
+ carrier_changed (self, FALSE);
+ } else {
+ priv->carrier_defer_id = g_timeout_add_seconds (LINK_DISCONNECT_DELAY,
+ carrier_disconnected_action_cb, self);
+ _LOGD (LOGD_DEVICE, "link disconnected (deferring action for %d seconds) (id=%u)",
+ LINK_DISCONNECT_DELAY, priv->carrier_defer_id);
+ }
}
}
@@ -10297,12 +10301,12 @@ static gboolean
carrier_wait_timeout (gpointer user_data)
{
NMDevice *self = NM_DEVICE (user_data);
+ NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
- NM_DEVICE_GET_PRIVATE (self)->carrier_wait_id = 0;
- nm_device_remove_pending_action (self, NM_PENDING_ACTION_CARRIER_WAIT, TRUE);
-
- _carrier_wait_check_queued_act_request (self);
-
+ priv->carrier_wait_id = 0;
+ nm_device_remove_pending_action (self, NM_PENDING_ACTION_CARRIER_WAIT, FALSE);
+ if (!priv->carrier)
+ _carrier_wait_check_queued_act_request (self);
return G_SOURCE_REMOVE;
}
@@ -10379,8 +10383,14 @@ nm_device_bring_up (NMDevice *self, gboolean block, gboolean *no_firmware)
* a timeout is reached.
*/
if (nm_device_has_capability (self, NM_DEVICE_CAP_CARRIER_DETECT)) {
- if (!nm_clear_g_source (&priv->carrier_wait_id))
- nm_device_add_pending_action (self, NM_PENDING_ACTION_CARRIER_WAIT, TRUE);
+ /* we start a grace period of 5 seconds during which we will schedule
+ * a pending action whenever we have no carrier.
+ *
+ * If during that time carrier goes away, we declare the interface
+ * as not ready. */
+ nm_clear_g_source (&priv->carrier_wait_id);
+ if (!priv->carrier)
+ nm_device_add_pending_action (self, NM_PENDING_ACTION_CARRIER_WAIT, FALSE);
priv->carrier_wait_id = g_timeout_add_seconds (5, carrier_wait_timeout, self);
}
@@ -13793,7 +13803,8 @@ dispose (GObject *object)
available_connections_del_all (self);
- nm_clear_g_source (&priv->carrier_wait_id);
+ if (nm_clear_g_source (&priv->carrier_wait_id))
+ nm_device_remove_pending_action (self, NM_PENDING_ACTION_CARRIER_WAIT, FALSE);
_clear_queued_act_request (priv);
--
2.9.4

View File

@ -0,0 +1,85 @@
From bed605f5bd8524779b3cf3d3e02baf06a76f4054 Mon Sep 17 00:00:00 2001
From: Beniamino Galvani <bgalvani@redhat.com>
Date: Wed, 10 May 2017 16:17:48 +0200
Subject: [PATCH] dhcp: don't add route to DHCP4 server
This basically reverts commit 31fe84e46773 "core: Add host route for
DHCP4 server if outside assigned subnet (bgo #721767)" because the
additional route added by NM does more harm than good.
First, the code does not consider routes pushed by the server and thus
it can add a route conflicting with the ones from the network
administrator.
Second, there is no specification on what a DHCP client should do when
the server is not reachable via unicast, and adding arbitrary logic
into the client is likely to break things in specific cases. If
network administrators want to make the DHCP server reachable from a
client in a different subnet, they should push proper routes with the
lease.
In any case, if the DHCP server is not reachable through unicast,
before the lease expiration (after timeout T2) the client will resort
to broadcast and so there won't be any network disruption; the renewal
will only happen at a later time.
Fixes: 31fe84e467732463eabc8f70c2a419008e7a227c
https://bugzilla.redhat.com/show_bug.cgi?id=1448987
(cherry picked from commit 36e97f5d7beba7ab5446c2b7c6c22523b1bca476)
(cherry picked from commit cbf5a776f72d1895405b71f45a74cf4fe9046dae)
---
src/dhcp/nm-dhcp-utils.c | 37 -------------------------------------
1 file changed, 37 deletions(-)
diff --git a/src/dhcp/nm-dhcp-utils.c b/src/dhcp/nm-dhcp-utils.c
index e020ca3..e55a21b 100644
--- a/src/dhcp/nm-dhcp-utils.c
+++ b/src/dhcp/nm-dhcp-utils.c
@@ -450,43 +450,6 @@ nm_dhcp_utils_ip4_config_from_options (int ifindex,
}
}
- /*
- * RFC 2132, section 9.7
- * DHCP clients use the contents of the 'server identifier' field
- * as the destination address for any DHCP messages unicast to
- * the DHCP server.
- *
- * Some ISP's provide leases from central servers that are on
- * different subnets that the address offered. If the host
- * does not configure the interface as the default route, the
- * dhcp server may not be reachable via unicast, and a host
- * specific route is needed.
- **/
- str = g_hash_table_lookup (options, "dhcp_server_identifier");
- if (str) {
- if (inet_pton (AF_INET, str, &tmp_addr) > 0) {
-
- _LOG2I (LOGD_DHCP4, iface, " server identifier %s", str);
- if ( nm_utils_ip4_address_clear_host_address(tmp_addr, address.plen) != nm_utils_ip4_address_clear_host_address(address.address, address.plen)
- && !nm_ip4_config_get_direct_route_for_host (ip4_config, tmp_addr)) {
- /* DHCP server not on assigned subnet and the no direct route was returned. Add route */
- NMPlatformIP4Route route = { 0 };
-
- route.network = tmp_addr;
- route.plen = 32;
- /* this will be a device route if gwaddr is 0 */
- route.gateway = gwaddr;
- route.rt_source = NM_IP_CONFIG_SOURCE_DHCP;
- route.metric = priority;
- nm_ip4_config_add_route (ip4_config, &route);
- _LOG2D (LOGD_IP, iface, "adding route for server identifier: %s",
- nm_platform_ip4_route_to_string (&route, NULL, 0));
- }
- }
- else
- _LOG2W (LOGD_DHCP4, iface, "ignoring invalid server identifier '%s'", str);
- }
-
str = g_hash_table_lookup (options, "dhcp_lease_time");
if (str) {
address.lifetime = address.preferred = strtoul (str, NULL, 10);
--
2.9.3

View File

@ -0,0 +1,108 @@
From b870115d83ddb2f7091e7b5e1f65b64261c53557 Mon Sep 17 00:00:00 2001
From: Beniamino Galvani <bgalvani@redhat.com>
Date: Fri, 12 May 2017 12:00:20 +0200
Subject: [PATCH 1/2] device: update external configuration before commit
If the platform signaled that the external configuration changed (and
thus update_ipX_config() is scheduled) and we are doing a commit of
the new configuration, update priv->ext_ipX_config. Without this, the
commit will remove addresses added externally but not yet captured in
the external configuration.
https://bugzilla.redhat.com/show_bug.cgi?id=1449873
(cherry picked from commit a21b8882cc9defc43248afc94bf59ca0f84f0d27)
(cherry picked from commit bf5407992f54440b586e1d0b3792f93eb2c464f3)
---
src/devices/nm-device.c | 21 +++++++++++++++++++--
1 file changed, 19 insertions(+), 2 deletions(-)
diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c
index 8540b4c..87cd296 100644
--- a/src/devices/nm-device.c
+++ b/src/devices/nm-device.c
@@ -5487,8 +5487,15 @@ ip4_config_merge_and_apply (NMDevice *self,
composite = nm_ip4_config_new (nm_device_get_ip_ifindex (self));
init_ip4_config_dns_priority (self, composite);
- if (commit)
+ if (commit) {
ensure_con_ip4_config (self);
+ if (priv->queued_ip4_config_id) {
+ g_clear_object (&priv->ext_ip4_config);
+ priv->ext_ip4_config = nm_ip4_config_capture (nm_device_get_platform (self),
+ nm_device_get_ifindex (self),
+ FALSE);
+ }
+ }
if (priv->dev_ip4_config) {
nm_ip4_config_merge (composite, priv->dev_ip4_config,
@@ -6223,8 +6230,18 @@ ip6_config_merge_and_apply (NMDevice *self,
NM_SETTING_IP6_CONFIG_PRIVACY_UNKNOWN);
init_ip6_config_dns_priority (self, composite);
- if (commit)
+ if (commit) {
ensure_con_ip6_config (self);
+ if (priv->queued_ip6_config_id) {
+ g_clear_object (&priv->ext_ip6_config);
+ g_clear_object (&priv->ext_ip6_config_captured);
+ priv->ext_ip6_config_captured = nm_ip6_config_capture (nm_device_get_platform (self),
+ nm_device_get_ifindex (self),
+ FALSE,
+ NM_SETTING_IP6_CONFIG_PRIVACY_UNKNOWN);
+ priv->ext_ip6_config = nm_ip6_config_new_cloned (priv->ext_ip6_config_captured);
+ }
+ }
/* Merge all the IP configs into the composite config */
if (priv->ac_ip6_config) {
--
2.9.3
From 2d0d1643e59f4ac935e2288a02da8774b6b237dc Mon Sep 17 00:00:00 2001
From: Beniamino Galvani <bgalvani@redhat.com>
Date: Wed, 17 May 2017 09:46:22 +0200
Subject: [PATCH 2/2] device: fix crash in ip6_config_merge_and_apply()
nm_ip6_config_capture() returns NULL for slaves. Fixes the following:
nm_ip6_config_new_cloned: assertion 'NM_IS_IP6_CONFIG (src)' failed
#0 g_logv () at /lib64/libglib-2.0.so.0
#1 g_log () at /lib64/libglib-2.0.so.0
#2 nm_ip6_config_new_cloned (src=0x0) at src/nm-ip6-config.c:2272
#3 ip6_config_merge_and_apply (self=self@entry=0x200d8f0, commit=commit@entry=1) at src/devices/nm-device.c:6192
#4 nm_device_bring_up (self=self@entry=0x200d8f0, block=block@entry=1, no_firmware=no_firmware@entry=0x0) at src/devices/nm-device.c:10369
#5 _hw_addr_set (self=self@entry=0x200d8f0, addr=addr@entry=0x2095ea0 "6A:1C:00:2A:68:7C", operation=operation@entry=0x64f8ba "set", detail=detail@entry=0x67369d "restore") at src/devices/nm-device.c:13225
#6 nm_device_hw_addr_set (self=self@entry=0x200d8f0, addr=addr@entry=0x2095ea0 "6A:1C:00:2A:68:7C", detail=detail@entry=0x67369d "restore", set_permanent=set_permanent@entry=0) at src/devices/nm-device.c:13255
#7 release_slave (device=0x200d8f0, slave=0x1ef2990, configure=<optimized out>) at src/devices/nm-device-bond.c:463
#8 nm_device_master_release_one_slave (self=self@entry=0x200d8f0, slave=slave@entry=0x1ef2990, configure=1, reason=reason@entry=NM_DEVICE_STATE_REASON_CONNECTION_REMOVED) at src/devices/nm-device.c:2041
#9 slave_state_changed (slave=0x1ef2990, slave_new_state=NM_DEVICE_STATE_DEACTIVATING, slave_old_state=NM_DEVICE_STATE_ACTIVATED, reason=NM_DEVICE_STATE_REASON_CONNECTION_REMOVED, self=0x200d8f0)
at src/devices/nm-device.c:3366
...
Fixes: a21b8882cc9defc43248afc94bf59ca0f84f0d27
(cherry picked from commit 1e78f50b8e5e24d13547b478165170117c1ac8ae)
(cherry picked from commit bf28e0845fa38cdd3556fb61a7e725ac42a7d50a)
---
src/devices/nm-device.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c
index 87cd296..b14dc49 100644
--- a/src/devices/nm-device.c
+++ b/src/devices/nm-device.c
@@ -6239,7 +6239,8 @@ ip6_config_merge_and_apply (NMDevice *self,
nm_device_get_ifindex (self),
FALSE,
NM_SETTING_IP6_CONFIG_PRIVACY_UNKNOWN);
- priv->ext_ip6_config = nm_ip6_config_new_cloned (priv->ext_ip6_config_captured);
+ if (priv->ext_ip6_config_captured)
+ priv->ext_ip6_config = nm_ip6_config_new_cloned (priv->ext_ip6_config_captured);
}
}
--
2.9.3

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,140 @@
From a3d2153b90f3f56f1548d01be674a0ab5e82e6b7 Mon Sep 17 00:00:00 2001
From: Beniamino Galvani <bgalvani@redhat.com>
Date: Fri, 19 May 2017 16:18:55 +0200
Subject: [PATCH] ifcfg-rh: omit empty next hop for routes in legacy format
Don't add "via (null)" if the next hop is missing.
https://bugzilla.redhat.com/show_bug.cgi?id=1452648
(cherry picked from commit af8aac9b544cb64df3b77a413dfded23e976d1b0)
(cherry picked from commit cb5ba08f00691b18d272bfb08e4929d00fa246bb)
---
.../plugins/ifcfg-rh/nms-ifcfg-rh-writer.c | 77 ++++++++++------------
1 file changed, 36 insertions(+), 41 deletions(-)
diff --git a/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-writer.c b/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-writer.c
index d6f33c4..400e9bd 100644
--- a/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-writer.c
+++ b/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-writer.c
@@ -1926,12 +1926,8 @@ get_route_attributes_string (NMIPRoute *route, int family)
static gboolean
write_route_file_legacy (const char *filename, NMSettingIPConfig *s_ip4, GError **error)
{
- const char *dest, *next_hop;
- char **route_items;
- gs_free char *route_contents = NULL;
+ nm_auto_free_gstring GString *contents = NULL;
NMIPRoute *route;
- guint32 prefix;
- gint64 metric;
guint32 i, num;
g_return_val_if_fail (filename != NULL, FALSE);
@@ -1945,36 +1941,34 @@ write_route_file_legacy (const char *filename, NMSettingIPConfig *s_ip4, GError
return TRUE;
}
- route_items = g_malloc0 (sizeof (char *) * (num + 1));
+ contents = g_string_new ("");
+
for (i = 0; i < num; i++) {
+ const char *next_hop;
gs_free char *options = NULL;
+ gint64 metric;
route = nm_setting_ip_config_get_route (s_ip4, i);
-
- dest = nm_ip_route_get_dest (route);
- prefix = nm_ip_route_get_prefix (route);
next_hop = nm_ip_route_get_next_hop (route);
metric = nm_ip_route_get_metric (route);
-
options = get_route_attributes_string (route, AF_INET);
- if (metric == -1) {
- route_items[i] = g_strdup_printf ("%s/%u via %s%s%s\n",
- dest, prefix, next_hop,
- options ? " " : "",
- options ?: "");
- } else {
- route_items[i] = g_strdup_printf ("%s/%u via %s metric %u%s%s\n",
- dest, prefix, next_hop, (guint32) metric,
- options ? " " : "",
- options ?: "");
+ g_string_append_printf (contents, "%s/%u",
+ nm_ip_route_get_dest (route),
+ nm_ip_route_get_prefix (route));
+ if (next_hop)
+ g_string_append_printf (contents, " via %s", next_hop);
+ if (metric >= 0)
+ g_string_append_printf (contents, " metric %u", (guint) metric);
+ if (options) {
+ g_string_append_c (contents, ' ');
+ g_string_append (contents, options);
}
+
+ g_string_append_c (contents, '\n');
}
- route_items[num] = NULL;
- route_contents = g_strjoinv (NULL, route_items);
- g_strfreev (route_items);
- if (!g_file_set_contents (filename, route_contents, -1, NULL)) {
+ if (!g_file_set_contents (filename, contents->str, contents->len, NULL)) {
g_set_error (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_FAILED,
"Writing route file '%s' failed", filename);
return FALSE;
@@ -2492,32 +2486,33 @@ write_route6_file (const char *filename, NMSettingIPConfig *s_ip6, GError **erro
}
contents = g_string_new ("");
+
for (i = 0; i < num; i++) {
gs_free char *options = NULL;
+ const char *next_hop;
+ gint64 metric;
route = nm_setting_ip_config_get_route (s_ip6, i);
+ next_hop = nm_ip_route_get_next_hop (route);
+ metric = nm_ip_route_get_metric (route);
options = get_route_attributes_string (route, AF_INET6);
- if (nm_ip_route_get_metric (route) == -1) {
- g_string_append_printf (contents, "%s/%u via %s%s%s",
- nm_ip_route_get_dest (route),
- nm_ip_route_get_prefix (route),
- nm_ip_route_get_next_hop (route),
- options ? " " : "",
- options ?: "");
- } else {
- g_string_append_printf (contents, "%s/%u via %s metric %u%s%s",
- nm_ip_route_get_dest (route),
- nm_ip_route_get_prefix (route),
- nm_ip_route_get_next_hop (route),
- (unsigned) nm_ip_route_get_metric (route),
- options ? " " : "",
- options ?: "");
+ g_string_append_printf (contents, "%s/%u",
+ nm_ip_route_get_dest (route),
+ nm_ip_route_get_prefix (route));
+ if (next_hop)
+ g_string_append_printf (contents, " via %s", next_hop);
+ if (metric >= 0)
+ g_string_append_printf (contents, " metric %u", (guint) metric);
+ if (options) {
+ g_string_append_c (contents, ' ');
+ g_string_append (contents, options);
}
- g_string_append (contents, "\n");
+
+ g_string_append_c (contents, '\n');
}
- if (!g_file_set_contents (filename, contents->str, -1, NULL)) {
+ if (!g_file_set_contents (filename, contents->str, contents->len, NULL)) {
g_set_error (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_FAILED,
"Writing route6 file '%s' failed", filename);
return FALSE;
--
2.9.3

View File

@ -10,7 +10,7 @@
%global epoch_version 1
%global rpm_version 1.8.0
%global real_version 1.8.0
%global release_version 1
%global release_version 2
%global snapshot %{nil}
%global git_sha %{nil}
@ -76,7 +76,14 @@ Source1: NetworkManager.conf
Source2: 00-server.conf
Source3: 20-connectivity-fedora.conf
Patch1: 0001-utils-fix-maybe-uninitialized-in-nm-udev-utils.c.patch
Patch2: 0002-utils-fix-maybe-uninitialized-in-nm-udev-utils.c.patch
Patch3: 0003-fix-device-run-state-unknown-rh1440171.patch
Patch4: 0004-proxy-crash-rh1450459.patch
Patch5: 0005-device-fix-wait-carrier-rh1450444.patch
Patch6: 0006-dhcp-don-t-add-route-to-DHCP4-server-rh1448987.patch
Patch7: 0007-device-update-ext-conf-before-commit-rh1449873.patch
Patch8: 0008-utf8safe-fixes-rh1443114.patch
Patch9: 0009-ifcfg-rh-fix-null-next-hop.patch
Requires(post): systemd
Requires(preun): systemd
@ -332,7 +339,14 @@ by nm-connection-editor and nm-applet in a non-graphical environment.
%prep
%setup -q -n NetworkManager-%{real_version}
%patch1 -p1
%patch2 -p1
%patch3 -p1
%patch4 -p1
%patch5 -p1
%patch6 -p1
%patch7 -p1
%patch8 -p1
%patch9 -p1
%build
%if %{with regen_docs}
@ -635,6 +649,17 @@ fi
%endif
%changelog
* Sat May 20 2017 Thomas Haller <thaller@redhat.com> - 1:1.8.0-2
- dhcp: don't add route to DHCP4 server (rh #1448987)
- device: update external configuration before commit (rh #1449873)
- libnm: fix NUL termination of device's description (rh #1443114)
- libnm, core: ensure valid UTF-8 in device properties (rh #1443114)
- core: fix device's UDI property on D-Bus (rh #1443114)
- ifcfg-rh: omit empty next hop for routes in legacy format (rh #1452648)
- core: fix persisting managed state of device (rh #1440171)
- proxy: fix use-after-free (rh #1450459)
- device: don't wrongly delay startup complete waiting for carrier (rh #1450444)
* Wed May 10 2017 Thomas Haller <thaller@redhat.com> - 1:1.8.0-1
- Update to 1.8.0 release