提交 90ba5ef1 编写于 作者: M Michal Privoznik

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: NMichal Privoznik <mprivozn@redhat.com>
上级 51c43905
......@@ -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:
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册