X-Git-Url: https://vcs.maemo.org/git/?a=blobdiff_plain;f=src%2Fdetect.c;h=0dce3d3f12ae7fe9a3332a6618f2af86487a1abb;hb=5d707c40f9304323ce09ba4e7b3a699a25742501;hp=f6c66a797da1dc057751e2983e1f5739c88ff4c2;hpb=7e090d498e11ae435d973bea44e393a6e42beb3d;p=connman diff --git a/src/detect.c b/src/detect.c index f6c66a7..0dce3d3 100644 --- a/src/detect.c +++ b/src/detect.c @@ -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 #include -#include -#include -#include +#include #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; 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,25 +226,81 @@ 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; + 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); + addr = NULL; + break; } - name = index2ident(index, "dev_"); - device = connman_device_create(name, devtype); 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; + ident = NULL; + 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; + ident = NULL; + break; + case CONNMAN_DEVICE_TYPE_HSO: + mode = CONNMAN_DEVICE_MODE_NETWORK_SINGLE; + ident = NULL; + 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); + 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);