summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2016-08-29 18:28:34 +0200
committerThomas Haller <thaller@redhat.com>2016-08-29 18:39:30 +0200
commit67b685235847ac49712d77023e23ef5c38e82a9e (patch)
tree78e75021783cc39b3be7051fad4f5b20ed84c5d1
parentd51f2c2a4e99799739e2adbeaf578144b556c4b9 (diff)
downloadNetworkManager-th/platform-set-address-enfile-bgo770456-v2.tar.gz
device: add hack to wait after changing MAC addressth/platform-set-address-enfile-bgo770456-v2
It seems some drivers return success for nm_platform_link_set_address(), but at that point the address did not yet actually change *sigh*. It changes a bit later, possibly after setting the device up. Add a workaround to retry reading the MAC address when platform indicates success but the address still differs at first. https://bugzilla.gnome.org/show_bug.cgi?id=770456
-rw-r--r--src/devices/nm-device.c28
1 files changed, 25 insertions, 3 deletions
diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c
index 305a1bb711..6939332068 100644
--- a/src/devices/nm-device.c
+++ b/src/devices/nm-device.c
@@ -11774,6 +11774,7 @@ _hw_addr_set (NMDevice *self,
{
NMDevicePrivate *priv;
gboolean success = FALSE;
+ gboolean needs_refresh = FALSE;
NMPlatformError plerr;
const char *cur_addr;
guint8 addr_bytes[NM_UTILS_HWADDR_LEN_MAX];
@@ -11819,10 +11820,10 @@ _hw_addr_set (NMDevice *self,
_LOGI (LOGD_DEVICE, "set-hw-addr: %s MAC address to %s (%s)",
operation, addr, detail);
} else {
- _LOGW (LOGD_DEVICE,
- "set-hw-addr: new MAC address %s not successfully %s (%s)",
+ _LOGD (LOGD_DEVICE,
+ "set-hw-addr: new MAC address %s not successfully %s (%s) (refresh link)",
addr, operation, detail);
- success = FALSE;
+ needs_refresh = TRUE;
}
} else {
_NMLOG (plerr == NM_PLATFORM_ERROR_NOT_FOUND ? LOGL_DEBUG : LOGL_WARN,
@@ -11836,6 +11837,27 @@ _hw_addr_set (NMDevice *self,
return FALSE;
}
+ if (needs_refresh) {
+ /* The platform call indicated success, however the address is not
+ * as expected. May be a kernel issue and the MAC address takes
+ * a moment to change (bgo#770456).
+ *
+ * Try to reload the link and check again. */
+ nm_platform_link_refresh (NM_PLATFORM_GET, nm_device_get_ip_ifindex (self));
+
+ nm_device_update_hw_address (self);
+ cur_addr = nm_device_get_hw_address (self);
+ if (cur_addr && nm_utils_hwaddr_matches (cur_addr, -1, addr, -1)) {
+ _LOGI (LOGD_DEVICE, "set-hw-addr: %s MAC address to %s (%s)",
+ operation, addr, detail);
+ } else {
+ _LOGW (LOGD_DEVICE,
+ "set-hw-addr: new MAC address %s not successfully %s (%s)",
+ addr, operation, detail);
+ return FALSE;
+ }
+ }
+
return success;
}