1
0
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:
Michal Privoznik 2014-06-13 11:29:48 +02:00
parent 51c439056b
commit 90ba5ef1bb

View File

@ -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: