mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-22 17:34:18 +03:00
virNetDevGetLinkInfo: Don't report link speed if NIC's not up
The kernel's more broken than one would think. Various drivers report various (usually spurious) values if the interface is in other state than 'up' . While on some we experience -EINVAL when read()-ing the speed sysfs file, with other drivers we might get anything from 0 to UINT_MAX. If that's the case it's better to not report link speed. Well, the interface is not up anyway. Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
This commit is contained in:
parent
51c439056b
commit
90ba5ef1bb
@ -1875,6 +1875,16 @@ virNetDevGetLinkInfo(const char *ifname,
|
||||
|
||||
lnk->state = tmp_state;
|
||||
|
||||
/* Shortcut to avoid some kernel issues. If link is not up several drivers
|
||||
* report several misleading values. While igb reports 65535, realtek goes
|
||||
* with 10. To avoid muddying XML with insane values, don't report link
|
||||
* speed if that's the case. */
|
||||
if (lnk->state != VIR_INTERFACE_STATE_UP) {
|
||||
lnk->speed = 0;
|
||||
ret = 0;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
VIR_FREE(path);
|
||||
VIR_FREE(buf);
|
||||
|
||||
@ -1901,11 +1911,7 @@ virNetDevGetLinkInfo(const char *ifname,
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
/* Workaround broken kernel API. If the link is unplugged then
|
||||
* depending on the NIC driver, link speed can be reported as -1.
|
||||
* However, the value is printed out as unsigned integer instead of
|
||||
* signed one. Terrifying but true. */
|
||||
lnk->speed = (int) tmp_speed == -1 ? 0 : tmp_speed;
|
||||
lnk->speed = tmp_speed;
|
||||
|
||||
ret = 0;
|
||||
cleanup:
|
||||
|
Loading…
Reference in New Issue
Block a user