summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBeniamino Galvani <bgalvani@redhat.com>2018-12-20 09:35:34 +0100
committerBeniamino Galvani <bgalvani@redhat.com>2018-12-21 10:43:37 +0100
commit4ea9d21dac74a829b1f134ce005beba3a5c338c0 (patch)
tree7040b18c080a07c529d3cdaa136aea69ba3bd8bc
parent3db4d3acebc17ba29f303aaaa561271c94372249 (diff)
downloadNetworkManager-bg/missing-prefix-route-rh1636715.tar.gz
device: ensure IP configuration is restored when link goes upbg/missing-prefix-route-rh1636715
When the link is up and goes down link_changed_cb() schedules device_link_changed() to be run later. If the function is dispatched when the link is already up again, it does not detect that the link was down. Fix this by storing in the device state that we saw the link down so that device_link_changed() can properly restore the IP configuration. https://bugzilla.redhat.com/show_bug.cgi?id=1636715
-rw-r--r--src/devices/nm-device.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c
index 0bdb7f6bac..20bf8bf8f1 100644
--- a/src/devices/nm-device.c
+++ b/src/devices/nm-device.c
@@ -395,6 +395,7 @@ typedef struct _NMDevicePrivate {
bool ipv6ll_handle:1; /* TRUE if NM handles the device's IPv6LL address */
bool ipv6ll_has:1;
bool ndisc_started:1;
+ bool device_link_changed_down:1;
/* Generic DHCP stuff */
char * dhcp_anycast_address;
@@ -3703,8 +3704,10 @@ device_link_changed (NMDevice *self)
gboolean was_up;
gboolean update_unmanaged_specs = FALSE;
gboolean got_hw_addr = FALSE, had_hw_addr;
+ gboolean seen_down = priv->device_link_changed_down;
priv->device_link_changed_id = 0;
+ priv->device_link_changed_down = FALSE;
ifindex = nm_device_get_ifindex (self);
if (ifindex <= 0)
@@ -3816,7 +3819,7 @@ device_link_changed (NMDevice *self)
device_recheck_slave_status (self, pllink);
- if (priv->up && !was_up) {
+ if (priv->up && (!was_up || seen_down)) {
/* the link was down and just came up. That happens for example, while changing MTU.
* We must restore IP configuration. */
if (priv->ip4_state == IP_DONE) {
@@ -3892,6 +3895,8 @@ link_changed_cb (NMPlatform *platform,
priv = NM_DEVICE_GET_PRIVATE (self);
if (ifindex == nm_device_get_ifindex (self)) {
+ if (!(info->n_ifi_flags & IFF_UP))
+ priv->device_link_changed_down = TRUE;
if (!priv->device_link_changed_id) {
priv->device_link_changed_id = g_idle_add ((GSourceFunc) device_link_changed, self);
_LOGD (LOGD_DEVICE, "queued link change for ifindex %d", ifindex);