[libvirt] [PATCH] nodedev: udev: Fix handling of wireless NIC

Dave Allan dallan at redhat.com
Thu May 27 14:58:30 UTC 2010


On Wed, May 26, 2010 at 03:55:44PM -0400, Cole Robinson wrote:
> Wireless NICs were being ignored because we weren't correctly handling
> device type. Fix this, as well as wireless NIC net subtype.

Thanks for finding and fixing this.  I made a v2 patch with the change
that since DEVTYPE == "wlan" is a definitive indication that the
device is a network interface, that case should be with the other
device types for which DEVTYPE is definitive.  v2 patch attached.

Dave

-------------- next part --------------
>From ccf89c57a6335c1c7c7e0b29ae09f4916b33622d Mon Sep 17 00:00:00 2001
From: David Allan <dallan at redhat.com>
Date: Thu, 27 May 2010 10:44:02 -0400
Subject: [PATCH 1/1] v2 of Cole's wlan support

* Incorporated Jim's feedback

* Moved case of DEVTYPE == "wlan" up as it's definitive that we have a network interface.

* Made comment more detailed about the wired case to explain better
  how it differentiates between wired network interfaces and USB
  devices.
---
 src/node_device/node_device_udev.c |   23 ++++++++++++++++++++---
 1 files changed, 20 insertions(+), 3 deletions(-)

diff --git a/src/node_device/node_device_udev.c b/src/node_device/node_device_udev.c
index f0485f1..5c54d65 100644
--- a/src/node_device/node_device_udev.c
+++ b/src/node_device/node_device_udev.c
@@ -597,8 +597,15 @@ static int udevProcessNetworkInterface(struct udev_device *device,
                                        virNodeDeviceDefPtr def)
 {
     int ret = -1;
+    const char *devtype = udev_device_get_devtype(device);
     union _virNodeDevCapData *data = &def->caps->data;

+    if (devtype && STREQ(devtype, "wlan")) {
+        data->net.subtype = VIR_NODE_DEV_CAP_NET_80211;
+    } else {
+        data->net.subtype = VIR_NODE_DEV_CAP_NET_80203;
+    }
+
     if (udevGetStringProperty(device,
                               "INTERFACE",
                               &data->net.ifname) == PROPERTY_ERROR) {
@@ -1074,6 +1081,8 @@ static int udevGetDeviceType(struct udev_device *device,
     int ret = 0;

     devtype = udev_device_get_devtype(device);
+    VIR_DEBUG("Found device type '%s' for device '%s'",
+              devtype, udev_device_get_sysname(device));

     if (devtype != NULL && STREQ(devtype, "usb_device")) {
         *type = VIR_NODE_DEV_CAP_USB_DEV;
@@ -1105,17 +1114,25 @@ static int udevGetDeviceType(struct udev_device *device,
         goto out;
     }

+    if (devtype != NULL && STREQ(devtype, "wlan")) {
+        *type = VIR_NODE_DEV_CAP_NET;
+        goto out;
+    }
+
     if (udevGetUintProperty(device, "PCI_CLASS", &tmp, 16) == PROPERTY_FOUND) {
         *type = VIR_NODE_DEV_CAP_PCI_DEV;
         goto out;
     }

-    /* It does not appear that network interfaces set the device type
-     * property. */
-    if (devtype == NULL &&
+    /* It does not appear that wired network interfaces set the
+     * DEVTYPE property.  USB devices also have an INTERFACE property,
+     * but they do set DEVTYPE, so if devtype is NULL and the
+     * INTERFACE property exists, we have a network device. */
+    if ((devtype == NULL) &&
         udevGetStringProperty(device,
                               "INTERFACE",
                               &tmp_string) == PROPERTY_FOUND) {
+
         VIR_FREE(tmp_string);
         *type = VIR_NODE_DEV_CAP_NET;
         goto out;
-- 
1.7.0.1



More information about the libvir-list mailing list