Add device type for Nozomi based hardware
[connman] / src / detect.c
index 85fb077..fab79d4 100644 (file)
@@ -2,7 +2,7 @@
  *
  *  Connection Manager
  *
- *  Copyright (C) 2007-2008  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2007-2009  Intel Corporation. All rights reserved.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License version 2 as
@@ -35,9 +35,7 @@
 #include <linux/if_arp.h>
 #include <linux/wireless.h>
 
-#include <connman/device.h>
-#include <connman/rtnl.h>
-#include <connman/log.h>
+#include <glib.h>
 
 #include "connman.h"
 
@@ -132,16 +130,19 @@ static void detect_newlink(unsigned short type, int index,
                                        unsigned flags, unsigned change)
 {
        enum connman_device_type devtype = CONNMAN_DEVICE_TYPE_UNKNOWN;
+       enum connman_device_mode mode = CONNMAN_DEVICE_MODE_UNKNOWN;
        struct connman_device *device;
        gchar *name, *devname;
 
-       DBG("index %d", index);
+       DBG("type %d index %d", type, index);
 
        device = find_device(index);
        if (device != NULL)
                return;
 
        devname = index2name(index);
+       if (devname == NULL)
+               return;
 
        if (type == ARPHRD_ETHER) {
                char bridge_path[PATH_MAX], wimax_path[PATH_MAX];
@@ -171,15 +172,30 @@ static void detect_newlink(unsigned short type, int index,
                        devtype = CONNMAN_DEVICE_TYPE_ETHERNET;
 
                close(sk);
+       } else if (type == ARPHRD_NONE) {
+               if (g_str_has_prefix(devname, "hso") == TRUE)
+                       devtype = CONNMAN_DEVICE_TYPE_HSO;
        }
 
-       if (devtype == CONNMAN_DEVICE_TYPE_UNKNOWN) {
+       switch (devtype) {
+       case CONNMAN_DEVICE_TYPE_UNKNOWN:
                g_free(devname);
                return;
+       case CONNMAN_DEVICE_TYPE_ETHERNET:
+       case CONNMAN_DEVICE_TYPE_WIFI:
+       case CONNMAN_DEVICE_TYPE_WIMAX:
+               name = index2ident(index, "dev_");
+               break;
+       case CONNMAN_DEVICE_TYPE_BLUETOOTH:
+       case CONNMAN_DEVICE_TYPE_HSO:
+       case CONNMAN_DEVICE_TYPE_NOZOMI:
+       case CONNMAN_DEVICE_TYPE_HUAWEI:
+       case CONNMAN_DEVICE_TYPE_NOVATEL:
+       case CONNMAN_DEVICE_TYPE_VENDOR:
+               name = strdup(devname);
+               break;
        }
 
-       name = index2ident(index, "dev_");
-
        device = connman_device_create(name, devtype);
        if (device == NULL) {
                g_free(devname);
@@ -187,6 +203,32 @@ static void detect_newlink(unsigned short type, int index,
                return;
        }
 
+       switch (devtype) {
+       case CONNMAN_DEVICE_TYPE_UNKNOWN:
+       case CONNMAN_DEVICE_TYPE_VENDOR:
+       case CONNMAN_DEVICE_TYPE_NOZOMI:
+       case CONNMAN_DEVICE_TYPE_HUAWEI:
+       case CONNMAN_DEVICE_TYPE_NOVATEL:
+               mode = CONNMAN_DEVICE_MODE_UNKNOWN;
+               break;
+       case CONNMAN_DEVICE_TYPE_ETHERNET:
+               mode = CONNMAN_DEVICE_MODE_TRANSPORT_IP;
+               break;
+       case CONNMAN_DEVICE_TYPE_WIFI:
+       case CONNMAN_DEVICE_TYPE_WIMAX:
+               mode = CONNMAN_DEVICE_MODE_NETWORK_SINGLE;
+               break;
+       case CONNMAN_DEVICE_TYPE_BLUETOOTH:
+               mode = CONNMAN_DEVICE_MODE_NETWORK_MULTIPLE;
+               break;
+       case CONNMAN_DEVICE_TYPE_HSO:
+               mode = CONNMAN_DEVICE_MODE_NETWORK_SINGLE;
+               connman_device_set_policy(device, CONNMAN_DEVICE_POLICY_MANUAL);
+               break;
+       }
+
+       connman_device_set_mode(device, mode);
+
        connman_device_set_index(device, index);
        connman_device_set_interface(device, devname);
 
@@ -206,7 +248,7 @@ static void detect_dellink(unsigned short type, int index,
 {
        struct connman_device *device;
 
-       DBG("index %d", index);
+       DBG("type %d index %d", type, index);
 
        device = find_device(index);
        if (device == NULL)