[libvirt] [PATCH 2/4] interface_backend_udev: Implement link speed & state
Daniel P. Berrange
berrange at redhat.com
Wed Jun 4 21:40:59 UTC 2014
On Tue, Jun 03, 2014 at 02:22:10PM +0200, Michal Privoznik wrote:
> In previous commit the interface XML is prepared for exporting
> information on NIC link speed and state. This commit implement
> actual logic for getting such info and writing it into XML.
>
> Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
> ---
>
> Notes:
> For the kernel issue I've posted patch here:
>
> http://patchwork.ozlabs.org/patch/354928/
>
> But it wasn't accepted as developers are afraid of breaking backward
> compatibility. Which is weird as in 2.6.X the kernel was reporting -1
> instead of unsigned -1.
>
> src/interface/interface_backend_udev.c | 27 +++++++++++++++++++++++++++
> 1 file changed, 27 insertions(+)
>
> diff --git a/src/interface/interface_backend_udev.c b/src/interface/interface_backend_udev.c
> index c5353ea..80ba93e 100644
> --- a/src/interface/interface_backend_udev.c
> +++ b/src/interface/interface_backend_udev.c
> @@ -1036,6 +1036,8 @@ udevGetIfaceDef(struct udev *udev, const char *name)
> const char *mtu_str;
> char *vlan_parent_dev = NULL;
> const char *devtype;
> + const char *operstate;
> + const char *link_speed;
>
> /* Allocate our interface definition structure */
> if (VIR_ALLOC(ifacedef) < 0)
> @@ -1059,6 +1061,31 @@ udevGetIfaceDef(struct udev *udev, const char *name)
> udev_device_get_sysattr_value(dev, "address")) < 0)
> goto error;
>
> + operstate = udev_device_get_sysattr_value(dev, "operstate");
> + if ((ifacedef->lnk.state = virInterfaceStateTypeFromString(operstate)) <= 0) {
> + virReportError(VIR_ERR_INTERNAL_ERROR,
> + _("Unable to parse operstate: %s"),
> + operstate);
> + goto error;
> + }
> +
> + link_speed = udev_device_get_sysattr_value(dev, "speed");
> + if (link_speed) {
> + if (virStrToLong_ul(link_speed, NULL, 10, &ifacedef->lnk.speed) < 0) {
> + virReportError(VIR_ERR_INTERNAL_ERROR,
> + _("Unable to parse speed: %s"),
> + link_speed);
> + goto error;
> + }
> +
> + /* 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. */
> + if ((int) ifacedef->lnk.speed == -1)
> + ifacedef->lnk.speed = 0;
> + }
This block of code is duplicated in two other places in your series.
I think it'd be worth having a function in virnetdev
virNetDevGetLinkInfo(const char *ifname, int *speed, int *state)
Regards,
Daniel
--
|: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org -o- http://virt-manager.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|
More information about the libvir-list
mailing list