device: add hack to wait after changing MAC address

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
This commit is contained in:
Thomas Haller
2016-08-29 18:28:34 +02:00
parent d51f2c2a4e
commit 67b6852358

View File

@@ -11774,6 +11774,7 @@ _hw_addr_set (NMDevice *self,
{ {
NMDevicePrivate *priv; NMDevicePrivate *priv;
gboolean success = FALSE; gboolean success = FALSE;
gboolean needs_refresh = FALSE;
NMPlatformError plerr; NMPlatformError plerr;
const char *cur_addr; const char *cur_addr;
guint8 addr_bytes[NM_UTILS_HWADDR_LEN_MAX]; 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)", _LOGI (LOGD_DEVICE, "set-hw-addr: %s MAC address to %s (%s)",
operation, addr, detail); operation, addr, detail);
} else { } else {
_LOGW (LOGD_DEVICE, _LOGD (LOGD_DEVICE,
"set-hw-addr: new MAC address %s not successfully %s (%s)", "set-hw-addr: new MAC address %s not successfully %s (%s) (refresh link)",
addr, operation, detail); addr, operation, detail);
success = FALSE; needs_refresh = TRUE;
} }
} else { } else {
_NMLOG (plerr == NM_PLATFORM_ERROR_NOT_FOUND ? LOGL_DEBUG : LOGL_WARN, _NMLOG (plerr == NM_PLATFORM_ERROR_NOT_FOUND ? LOGL_DEBUG : LOGL_WARN,
@@ -11836,6 +11837,27 @@ _hw_addr_set (NMDevice *self,
return FALSE; 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; return success;
} }