diff --git a/src/platform/nm-linux-platform.c b/src/platform/nm-linux-platform.c index 007e7953b..42444d97e 100644 --- a/src/platform/nm-linux-platform.c +++ b/src/platform/nm-linux-platform.c @@ -766,7 +766,7 @@ link_type_from_udev (NMPlatform *platform, int ifindex, const char *ifname, int prop = g_udev_device_get_property (udev_device, "DEVTYPE"); sysfs_path = g_udev_device_get_sysfs_path (udev_device); - if (g_strcmp0 (prop, "wlan") == 0 || wifi_utils_is_wifi (ifname, sysfs_path)) + if (wifi_utils_is_wifi (ifname, sysfs_path, prop)) return_type (NM_LINK_TYPE_WIFI, "wifi"); else if (g_strcmp0 (prop, "wwan") == 0) return_type (NM_LINK_TYPE_WWAN_ETHERNET, "wwan"); diff --git a/src/platform/wifi/wifi-utils-nl80211.c b/src/platform/wifi/wifi-utils-nl80211.c index 1c745112b..752da926a 100644 --- a/src/platform/wifi/wifi-utils-nl80211.c +++ b/src/platform/wifi/wifi-utils-nl80211.c @@ -934,48 +934,3 @@ error: return NULL; } -gboolean -wifi_nl80211_is_wifi (const char *iface) -{ - struct nl_sock *nl_sock; - struct nl_cb *nl_cb = NULL; - struct nl_msg *msg = NULL; - int id, ifindex; - struct nl80211_iface_info iface_info = { - .mode = NM_802_11_MODE_UNKNOWN, - }; - gboolean is_wifi = FALSE; - - nl_sock = nl_socket_alloc (); - if (nl_sock == NULL) - return FALSE; - - if (genl_connect (nl_sock)) - goto error; - - ifindex = nm_platform_link_get_ifindex (iface); - if (ifindex < 0) - goto error; - - id = genl_ctrl_resolve (nl_sock, "nl80211"); - if (id < 0) - goto error; - - nl_cb = nl_cb_alloc (NL_CB_DEFAULT); - if (nl_cb) { - msg = _nl80211_alloc_msg (id, ifindex, -1, NL80211_CMD_GET_INTERFACE, 0); - if (_nl80211_send_and_recv (nl_sock, - nl_cb, - msg, - nl80211_iface_info_handler, - &iface_info) >= 0) - is_wifi = (iface_info.mode != NM_802_11_MODE_UNKNOWN); - } - - error: - if (nl_cb) - nl_cb_put (nl_cb); - nl_socket_free (nl_sock); - return is_wifi; -} - diff --git a/src/platform/wifi/wifi-utils-nl80211.h b/src/platform/wifi/wifi-utils-nl80211.h index f34e960de..b3e8c8976 100644 --- a/src/platform/wifi/wifi-utils-nl80211.h +++ b/src/platform/wifi/wifi-utils-nl80211.h @@ -25,6 +25,4 @@ WifiData *wifi_nl80211_init (const char *iface, int ifindex); -gboolean wifi_nl80211_is_wifi (const char *iface); - #endif /* __WIFI_UTILS_NL80211_H__ */ diff --git a/src/platform/wifi/wifi-utils.c b/src/platform/wifi/wifi-utils.c index 3fb457bed..daef881bf 100644 --- a/src/platform/wifi/wifi-utils.c +++ b/src/platform/wifi/wifi-utils.c @@ -162,13 +162,20 @@ wifi_utils_deinit (WifiData *data) } gboolean -wifi_utils_is_wifi (const char *iface, const char *sysfs_path) +wifi_utils_is_wifi (const char *iface, const char *sysfs_path, const char *devtype) { char phy80211_path[255]; struct stat s; g_return_val_if_fail (iface != NULL, FALSE); + if (g_strcmp0 (devtype, "wlan") == 0) { + /* All Wi-Fi drivers should set DEVTYPE=wlan. Since the kernel's + * cfg80211/nl80211 stack does, this check should match any nl80211 + * capable driver (including mac82011-based ones). */ + return TRUE; + } + if (sysfs_path) { /* Check for nl80211 sysfs paths */ g_snprintf (phy80211_path, sizeof (phy80211_path), "%s/phy80211", sysfs_path); @@ -176,9 +183,6 @@ wifi_utils_is_wifi (const char *iface, const char *sysfs_path) return TRUE; } - if (wifi_nl80211_is_wifi (iface)) - return TRUE; - #if HAVE_WEXT if (wifi_wext_is_wifi (iface)) return TRUE; diff --git a/src/platform/wifi/wifi-utils.h b/src/platform/wifi/wifi-utils.h index 984dee775..f1b57aced 100644 --- a/src/platform/wifi/wifi-utils.h +++ b/src/platform/wifi/wifi-utils.h @@ -29,7 +29,7 @@ typedef struct WifiData WifiData; -gboolean wifi_utils_is_wifi (const char *iface, const char *sysfs_path); +gboolean wifi_utils_is_wifi (const char *iface, const char *sysfs_path, const char *devtype); WifiData *wifi_utils_init (const char *iface, int ifindex, gboolean check_scan);