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:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user