Use udev_device_get_devtype before __connman_inet_get_device_type
authorMartin Xu <martin.xu@intel.com>
Tue, 23 Mar 2010 09:27:46 +0000 (17:27 +0800)
committerSamuel Ortiz <sameo@linux.intel.com>
Tue, 23 Mar 2010 11:06:59 +0000 (12:06 +0100)
With some specific 3G cards __connman_inet_get_device_type() fails to
give the correct device type and we end up having both ethernet and 3G
services when pluging those in.
As udev_device_get_devtype() is more reliable, we're now calling it first
and falling back to __connman_inet_get_device_type() when
udev_device_get_devtype() returns a NULL string.

src/udev.c

index fe814b83a0e86980a529896d9ebe460471cb424c..79df87c16b13831382b44af10585a7cb8f4d0eb2 100644 (file)
@@ -54,6 +54,30 @@ static struct connman_device *find_device(int index)
        return NULL;
 }
 
+static enum connman_device_type string2devtype(const char *devtype)
+{
+       if (g_strcmp0(devtype, "wlan") == 0)
+               return CONNMAN_DEVICE_TYPE_WIFI;
+       else if (g_strcmp0(devtype, "wimax") == 0)
+               return CONNMAN_DEVICE_TYPE_WIMAX;
+       else if (g_strcmp0(devtype, "wwan") == 0)
+               return CONNMAN_DEVICE_TYPE_CELLULAR;
+
+       return CONNMAN_DEVICE_TYPE_UNKNOWN;
+}
+
+static enum connman_device_type get_device_type(
+               struct udev_device *udev_device, int index)
+{
+       const char *devtype;
+
+       devtype = udev_device_get_devtype(udev_device);
+       if (devtype == NULL)
+               return __connman_inet_get_device_type(index);
+
+       return string2devtype(devtype);
+}
+
 static void add_net_device(struct udev_device *udev_device)
 {
        struct udev_list_entry *entry;
@@ -84,7 +108,9 @@ static void add_net_device(struct udev_device *udev_device)
        if (index < 0)
                return;
 
-       devtype = __connman_inet_get_device_type(index);
+       devtype = get_device_type(udev_device, index);
+
+       DBG("devtype %d", devtype);
 
        switch (devtype) {
        case CONNMAN_DEVICE_TYPE_UNKNOWN:
@@ -325,6 +351,9 @@ static void print_device(struct udev_device *device, const char *action)
        }
 
        devtype = udev_device_get_devtype(device);
+
+       DBG("devtype %s", devtype);
+
        sysname = udev_device_get_sysname(device);
 
        driver = udev_device_get_driver(parent);