X-Git-Url: https://vcs.maemo.org/git/?a=blobdiff_plain;f=plugins%2Frtnllink.c;h=3fbcedbd62937c5659ece765081f75fa05b016ce;hb=3cbd718323c5fe44459db0cf1df3441e51b9de23;hp=abe6811edaf5a5c47e83817a8d195b6524c020f5;hpb=61d0b6297c0f8e96a5ce79d03009a2d436e742f4;p=connman diff --git a/plugins/rtnllink.c b/plugins/rtnllink.c index abe6811..3fbcedb 100644 --- a/plugins/rtnllink.c +++ b/plugins/rtnllink.c @@ -23,6 +23,15 @@ #include #endif +#include +#include +#include +#include +#include +#include +#include +#include + #include #include #include @@ -30,22 +39,19 @@ #include "inet.h" -static GStaticMutex device_mutex = G_STATIC_MUTEX_INIT; static GSList *device_list = NULL; static void rtnllink_newlink(unsigned short type, int index, unsigned flags, unsigned change) { + enum connman_element_subtype subtype = CONNMAN_ELEMENT_SUBTYPE_UNKNOWN; struct connman_element *device; - enum connman_element_subtype subtype; GSList *list; gboolean exists = FALSE; - gchar *name; + gchar *name, *devname; DBG("index %d", index); - g_static_mutex_lock(&device_mutex); - for (list = device_list; list; list = list->next) { struct connman_element *device = list->data; @@ -55,23 +61,41 @@ static void rtnllink_newlink(unsigned short type, int index, } } - g_static_mutex_unlock(&device_mutex); - if (exists == TRUE) return; - name = inet_index2name(index); - - if (g_str_has_prefix(name, "eth") == TRUE) - subtype = CONNMAN_ELEMENT_SUBTYPE_ETHERNET; - else if (g_str_has_prefix(name, "wlan") == TRUE) - subtype = CONNMAN_ELEMENT_SUBTYPE_WIFI; - else if (g_str_has_prefix(name, "wmx") == TRUE) - subtype = CONNMAN_ELEMENT_SUBTYPE_WIMAX; - else if (g_str_has_prefix(name, "bnep") == TRUE) - subtype = CONNMAN_ELEMENT_SUBTYPE_BLUETOOTH; - else - subtype = CONNMAN_ELEMENT_SUBTYPE_UNKNOWN; + name = inet_index2ident(index, "dev_"); + devname = inet_index2name(index); + + if (type == ARPHRD_ETHER) { + char bridge_path[PATH_MAX], wimax_path[PATH_MAX]; + struct stat st; + struct iwreq iwr; + int sk; + + snprintf(bridge_path, PATH_MAX, + "/sys/class/net/%s/bridge", name); + snprintf(wimax_path, PATH_MAX, + "/sys/class/net/%s/wimax", name); + + memset(&iwr, 0, sizeof(iwr)); + strncpy(iwr.ifr_ifrn.ifrn_name, devname, IFNAMSIZ); + + sk = socket(PF_INET, SOCK_DGRAM, 0); + + if (g_str_has_prefix(name, "bnep") == TRUE) + subtype = CONNMAN_ELEMENT_SUBTYPE_UNKNOWN; + else if (stat(bridge_path, &st) == 0 && (st.st_mode & S_IFDIR)) + subtype = CONNMAN_ELEMENT_SUBTYPE_UNKNOWN; + else if (stat(wimax_path, &st) == 0 && (st.st_mode & S_IFDIR)) + subtype = CONNMAN_ELEMENT_SUBTYPE_WIMAX; + else if (ioctl(sk, SIOCGIWNAME, &iwr) == 0) + subtype = CONNMAN_ELEMENT_SUBTYPE_UNKNOWN; + else + subtype = CONNMAN_ELEMENT_SUBTYPE_ETHERNET; + + close(sk); + } if (subtype == CONNMAN_ELEMENT_SUBTYPE_UNKNOWN) { g_free(name); @@ -84,13 +108,10 @@ static void rtnllink_newlink(unsigned short type, int index, device->index = index; device->name = name; - - g_static_mutex_lock(&device_mutex); + device->devname = devname; connman_element_register(device, NULL); device_list = g_slist_append(device_list, device); - - g_static_mutex_unlock(&device_mutex); } static void rtnllink_dellink(unsigned short type, int index, @@ -100,8 +121,6 @@ static void rtnllink_dellink(unsigned short type, int index, DBG("index %d", index); - g_static_mutex_lock(&device_mutex); - for (list = device_list; list; list = list->next) { struct connman_element *device = list->data; @@ -112,8 +131,6 @@ static void rtnllink_dellink(unsigned short type, int index, break; } } - - g_static_mutex_unlock(&device_mutex); } static struct connman_rtnl rtnllink_rtnl = { @@ -141,8 +158,6 @@ static void rtnllink_exit(void) connman_rtnl_unregister(&rtnllink_rtnl); - g_static_mutex_lock(&device_mutex); - for (list = device_list; list; list = list->next) { struct connman_element *device = list->data; @@ -152,9 +167,7 @@ static void rtnllink_exit(void) g_slist_free(device_list); device_list = NULL; - - g_static_mutex_unlock(&device_mutex); } -CONNMAN_PLUGIN_DEFINE("rtnllink", "RTNL link detection plugin", VERSION, +CONNMAN_PLUGIN_DEFINE(rtnllink, "RTNL link detection plugin", VERSION, rtnllink_init, rtnllink_exit)