diff options
author | Thomas Haller <thaller@redhat.com> | 2016-08-29 18:28:34 +0200 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2016-08-29 18:39:30 +0200 |
commit | 67b685235847ac49712d77023e23ef5c38e82a9e (patch) | |
tree | 78e75021783cc39b3be7051fad4f5b20ed84c5d1 | |
parent | d51f2c2a4e99799739e2adbeaf578144b556c4b9 (diff) | |
download | NetworkManager-67b685235847ac49712d77023e23ef5c38e82a9e.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.c | 28 |
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; } |