Fill WiFi channel property with correct values
[connman] / src / detect.c
index bac075b..c8247ee 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"
 
@@ -82,6 +80,49 @@ static char *index2name(int index)
        return strdup(ifr.ifr_name);
 }
 
+static char *index2addr(int index)
+{
+       struct ifreq ifr;
+       struct ether_addr *eth;
+       char *str;
+       int sk, err;
+
+       if (index < 0)
+               return NULL;
+
+       sk = socket(PF_INET, SOCK_DGRAM, 0);
+       if (sk < 0)
+               return NULL;
+
+       memset(&ifr, 0, sizeof(ifr));
+       ifr.ifr_ifindex = index;
+
+       err = ioctl(sk, SIOCGIFNAME, &ifr);
+
+       if (err == 0)
+               err = ioctl(sk, SIOCGIFHWADDR, &ifr);
+
+       close(sk);
+
+       if (err < 0)
+               return NULL;
+
+       str = malloc(18);
+       if (!str)
+               return NULL;
+
+       eth = (void *) &ifr.ifr_hwaddr.sa_data;
+       snprintf(str, 18, "%02X:%02X:%02X:%02X:%02X:%02X",
+                                               eth->ether_addr_octet[0],
+                                               eth->ether_addr_octet[1],
+                                               eth->ether_addr_octet[2],
+                                               eth->ether_addr_octet[3],
+                                               eth->ether_addr_octet[4],
+                                               eth->ether_addr_octet[5]);
+
+       return str;
+}
+
 static char *index2ident(int index, const char *prefix)
 {
        struct ifreq ifr;
@@ -116,7 +157,7 @@ static char *index2ident(int index, const char *prefix)
                return NULL;
 
        eth = (void *) &ifr.ifr_hwaddr.sa_data;
-       snprintf(str, len, "%s%02X_%02X_%02X_%02X_%02X_%02X",
+       snprintf(str, len, "%s%02x%02x%02x%02x%02x%02x",
                                                prefix ? prefix : "",
                                                eth->ether_addr_octet[0],
                                                eth->ether_addr_octet[1],
@@ -132,8 +173,9 @@ 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;
+       char *addr, *name, *devname, *ident = NULL;
 
        DBG("type %d index %d", type, index);
 
@@ -142,6 +184,8 @@ static void detect_newlink(unsigned short type, int index,
                return;
 
        devname = index2name(index);
+       if (devname == NULL)
+               return;
 
        if (type == ARPHRD_ETHER) {
                char bridge_path[PATH_MAX], wimax_path[PATH_MAX];
@@ -159,14 +203,20 @@ static void detect_newlink(unsigned short type, int index,
 
                sk = socket(PF_INET, SOCK_DGRAM, 0);
 
-               if (g_str_has_prefix(devname, "bnep") == TRUE)
+               if (g_str_has_prefix(devname, "vmnet") == TRUE ||
+                               g_str_has_prefix(devname, "vboxnet") == TRUE) {
+                       connman_info("Ignoring network interface %s", devname);
                        devtype = CONNMAN_DEVICE_TYPE_UNKNOWN;
-               else if (stat(bridge_path, &st) == 0 && (st.st_mode & S_IFDIR))
+               } else if (g_str_has_prefix(devname, "bnep") == TRUE)
+                       devtype = CONNMAN_DEVICE_TYPE_UNKNOWN;
+               else if (g_str_has_prefix(devname, "wmx") == TRUE)
                        devtype = CONNMAN_DEVICE_TYPE_UNKNOWN;
                else if (stat(wimax_path, &st) == 0 && (st.st_mode & S_IFDIR))
-                       devtype = CONNMAN_DEVICE_TYPE_WIMAX;
-               else if (ioctl(sk, SIOCGIWNAME, &iwr) == 0)
                        devtype = CONNMAN_DEVICE_TYPE_UNKNOWN;
+               else if (stat(bridge_path, &st) == 0 && (st.st_mode & S_IFDIR))
+                       devtype = CONNMAN_DEVICE_TYPE_UNKNOWN;
+               else if (ioctl(sk, SIOCGIWNAME, &iwr) == 0)
+                       devtype = CONNMAN_DEVICE_TYPE_WIFI;
                else
                        devtype = CONNMAN_DEVICE_TYPE_ETHERNET;
 
@@ -176,17 +226,25 @@ static void detect_newlink(unsigned short type, int index,
                        devtype = CONNMAN_DEVICE_TYPE_HSO;
        }
 
-       if (devtype == CONNMAN_DEVICE_TYPE_UNKNOWN) {
+       switch (devtype) {
+       case CONNMAN_DEVICE_TYPE_UNKNOWN:
                g_free(devname);
                return;
-       }
-
-       switch (devtype) {
+       case CONNMAN_DEVICE_TYPE_ETHERNET:
+       case CONNMAN_DEVICE_TYPE_WIFI:
+       case CONNMAN_DEVICE_TYPE_WIMAX:
+               name = index2ident(index, "");
+               addr = index2addr(index);
+               break;
+       case CONNMAN_DEVICE_TYPE_BLUETOOTH:
+       case CONNMAN_DEVICE_TYPE_GPS:
        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;
-       default:
-               name = index2ident(index, "dev_");
+               addr = NULL;
                break;
        }
 
@@ -194,23 +252,52 @@ static void detect_newlink(unsigned short type, int index,
        if (device == NULL) {
                g_free(devname);
                g_free(name);
+               g_free(addr);
                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:
+       case CONNMAN_DEVICE_TYPE_GPS:
+               mode = CONNMAN_DEVICE_MODE_UNKNOWN;
+               break;
+       case CONNMAN_DEVICE_TYPE_ETHERNET:
+               mode = CONNMAN_DEVICE_MODE_TRANSPORT_IP;
+               ident = index2ident(index, NULL);
+               break;
+       case CONNMAN_DEVICE_TYPE_WIFI:
+       case CONNMAN_DEVICE_TYPE_WIMAX:
+               mode = CONNMAN_DEVICE_MODE_NETWORK_SINGLE;
+               ident = index2ident(index, NULL);
+               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;
-       default:
-               break;
        }
 
+       connman_device_set_mode(device, mode);
+
        connman_device_set_index(device, index);
        connman_device_set_interface(device, devname);
 
+       if (ident != NULL) {
+               connman_device_set_ident(device, ident);
+               g_free(ident);
+       }
+
+       connman_device_set_string(device, "Address", addr);
+
        g_free(devname);
        g_free(name);
+       g_free(addr);
 
        if (connman_device_register(device) < 0) {
                connman_device_unref(device);