*
* 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
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;
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;
+ gchar *addr, *name, *devname;
DBG("type %d index %d", type, index);
return;
devname = index2name(index);
+ if (devname == NULL)
+ return;
if (type == ARPHRD_ETHER) {
char bridge_path[PATH_MAX], wimax_path[PATH_MAX];
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;
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, "dev_");
+ 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;
}
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;
+ 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);
- connman_device_set_mode(device,
- CONNMAN_DEVICE_MODE_SINGLE_NETWORK);
- break;
- default:
break;
}
+ connman_device_set_mode(device, mode);
+
connman_device_set_index(device, index);
connman_device_set_interface(device, devname);
+ 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);