diff options
Diffstat (limited to 'src/platform/wifi/wifi-utils-wext.c')
| -rw-r--r-- | src/platform/wifi/wifi-utils-wext.c | 276 |
1 files changed, 178 insertions, 98 deletions
diff --git a/src/platform/wifi/wifi-utils-wext.c b/src/platform/wifi/wifi-utils-wext.c index af8cf2de..1bc29ae8 100644 --- a/src/platform/wifi/wifi-utils-wext.c +++ b/src/platform/wifi/wifi-utils-wext.c @@ -26,7 +26,6 @@ #include <sys/ioctl.h> #include <net/ethernet.h> #include <unistd.h> -#include <math.h> #include "wifi-utils-private.h" #include "wifi-utils-wext.h" @@ -69,8 +68,17 @@ struct iw_range_with_scan_capa /* don't need the rest... */ }; +#define _NMLOG_PREFIX_NAME "wifi-wext" +#define _NMLOG(level, domain, ...) \ + G_STMT_START { \ + nm_log ((level), (domain), NULL, NULL, \ + "%s: " _NM_UTILS_MACRO_FIRST(__VA_ARGS__), \ + _NMLOG_PREFIX_NAME \ + _NM_UTILS_MACRO_REST(__VA_ARGS__)); \ + } G_STMT_END + static guint32 -iw_freq_to_uint32 (struct iw_freq *freq) +iw_freq_to_uint32 (const struct iw_freq *freq) { if (freq->e == 0) { /* Some drivers report channel not frequency. Convert to a @@ -81,8 +89,7 @@ iw_freq_to_uint32 (struct iw_freq *freq) else if (freq->m == 14) return 2484; } - - return (guint32) (((double) freq->m) * pow (10, freq->e) / 1000000); + return (guint32) ((((double) freq->m) * nm_utils_exp10 (freq->e)) / 1000000.0); } static void @@ -94,20 +101,36 @@ wifi_wext_deinit (WifiData *parent) close (wext->fd); } +static gboolean +get_ifname (int ifindex, char *buffer, const char *op) +{ + int errsv; + + if (!nmp_utils_if_indextoname (ifindex, buffer)) { + errsv = errno; + _LOGW (LOGD_PLATFORM | LOGD_WIFI, + "error getting interface name for ifindex %d, operation '%s': %s (%d)", + ifindex, op, g_strerror (errsv), errsv); + return FALSE; + } + + return TRUE; +} + static NM80211Mode -wifi_wext_get_mode (WifiData *data) +wifi_wext_get_mode_ifname (WifiData *data, const char *ifname) { WifiDataWext *wext = (WifiDataWext *) data; struct iwreq wrq; memset (&wrq, 0, sizeof (struct iwreq)); - nm_utils_ifname_cpy (wrq.ifr_name, wext->parent.iface); + nm_utils_ifname_cpy (wrq.ifr_name, ifname); if (ioctl (wext->fd, SIOCGIWMODE, &wrq) < 0) { if (errno != ENODEV) { - nm_log_warn (LOGD_PLATFORM | LOGD_WIFI, - "(%s): error %d getting card mode", - wext->parent.iface, errno); + _LOGW (LOGD_PLATFORM | LOGD_WIFI, + "(%s): error %d getting card mode", + ifname, errno); } return NM_802_11_MODE_UNKNOWN; } @@ -126,13 +149,28 @@ wifi_wext_get_mode (WifiData *data) return NM_802_11_MODE_UNKNOWN; } +static NM80211Mode +wifi_wext_get_mode (WifiData *data) +{ + char ifname[IFNAMSIZ]; + + if (!get_ifname (data->ifindex, ifname, "get-mode")) + return FALSE; + + return wifi_wext_get_mode_ifname (data, ifname); +} + static gboolean wifi_wext_set_mode (WifiData *data, const NM80211Mode mode) { WifiDataWext *wext = (WifiDataWext *) data; struct iwreq wrq; + char ifname[IFNAMSIZ]; + + if (!get_ifname (data->ifindex, ifname, "set-mode")) + return FALSE; - if (wifi_wext_get_mode (data) == mode) + if (wifi_wext_get_mode_ifname (data, ifname) == mode) return TRUE; memset (&wrq, 0, sizeof (struct iwreq)); @@ -151,11 +189,12 @@ wifi_wext_set_mode (WifiData *data, const NM80211Mode mode) return FALSE; } - nm_utils_ifname_cpy (wrq.ifr_name, wext->parent.iface); + nm_utils_ifname_cpy (wrq.ifr_name, ifname); if (ioctl (wext->fd, SIOCSIWMODE, &wrq) < 0) { if (errno != ENODEV) { - nm_log_err (LOGD_PLATFORM | LOGD_WIFI, "(%s): error setting mode %d", - wext->parent.iface, mode); + _LOGE (LOGD_PLATFORM | LOGD_WIFI, + "(%s): error setting mode %d", + ifname, mode); } return FALSE; } @@ -168,6 +207,10 @@ wifi_wext_set_powersave (WifiData *data, guint32 powersave) { WifiDataWext *wext = (WifiDataWext *) data; struct iwreq wrq; + char ifname[IFNAMSIZ]; + + if (!get_ifname (data->ifindex, ifname, "set-powersave")) + return FALSE; memset (&wrq, 0, sizeof (struct iwreq)); if (powersave == 1) { @@ -175,11 +218,12 @@ wifi_wext_set_powersave (WifiData *data, guint32 powersave) } else wrq.u.power.disabled = 1; - nm_utils_ifname_cpy (wrq.ifr_name, wext->parent.iface); + nm_utils_ifname_cpy (wrq.ifr_name, ifname); if (ioctl (wext->fd, SIOCSIWPOWER, &wrq) < 0) { if (errno != ENODEV) { - nm_log_err (LOGD_PLATFORM | LOGD_WIFI, "(%s): error setting powersave %" G_GUINT32_FORMAT, - wext->parent.iface, powersave); + _LOGE (LOGD_PLATFORM | LOGD_WIFI, + "(%s): error setting powersave %" G_GUINT32_FORMAT, + ifname, powersave); } return FALSE; } @@ -192,13 +236,17 @@ wifi_wext_get_freq (WifiData *data) { WifiDataWext *wext = (WifiDataWext *) data; struct iwreq wrq; + char ifname[IFNAMSIZ]; + + if (!get_ifname (data->ifindex, ifname, "get-freq")) + return FALSE; memset (&wrq, 0, sizeof (struct iwreq)); - nm_utils_ifname_cpy (wrq.ifr_name, wext->parent.iface); + nm_utils_ifname_cpy (wrq.ifr_name, ifname); if (ioctl (wext->fd, SIOCGIWFREQ, &wrq) < 0) { - nm_log_warn (LOGD_PLATFORM | LOGD_WIFI, - "(%s): error getting frequency: %s", - wext->parent.iface, strerror (errno)); + _LOGW (LOGD_PLATFORM | LOGD_WIFI, + "(%s): error getting frequency: %s", + ifname, strerror (errno)); return 0; } @@ -226,13 +274,17 @@ wifi_wext_get_bssid (WifiData *data, guint8 *out_bssid) { WifiDataWext *wext = (WifiDataWext *) data; struct iwreq wrq; + char ifname[IFNAMSIZ]; + + if (!get_ifname (data->ifindex, ifname, "get-bssid")) + return FALSE; memset (&wrq, 0, sizeof (wrq)); - nm_utils_ifname_cpy (wrq.ifr_name, wext->parent.iface); + nm_utils_ifname_cpy (wrq.ifr_name, ifname); if (ioctl (wext->fd, SIOCGIWAP, &wrq) < 0) { - nm_log_warn (LOGD_PLATFORM | LOGD_WIFI, - "(%s): error getting associated BSSID: %s", - wext->parent.iface, strerror (errno)); + _LOGW (LOGD_PLATFORM | LOGD_WIFI, + "(%s): error getting associated BSSID: %s", + ifname, strerror (errno)); return FALSE; } memcpy (out_bssid, &(wrq.u.ap_addr.sa_data), ETH_ALEN); @@ -245,9 +297,13 @@ wifi_wext_get_rate (WifiData *data) WifiDataWext *wext = (WifiDataWext *) data; struct iwreq wrq; int err; + char ifname[IFNAMSIZ]; + + if (!get_ifname (data->ifindex, ifname, "get-rate")) + return FALSE; memset (&wrq, 0, sizeof (wrq)); - nm_utils_ifname_cpy (wrq.ifr_name, wext->parent.iface); + nm_utils_ifname_cpy (wrq.ifr_name, ifname); err = ioctl (wext->fd, SIOCGIWRATE, &wrq); return ((err == 0) ? wrq.u.bitrate.value / 1000 : 0); } @@ -264,16 +320,16 @@ wext_qual_to_percent (const struct iw_quality *qual, /* Magically convert the many different WEXT quality representations to a percentage */ - nm_log_dbg (LOGD_WIFI, - "QL: qual %d/%u/0x%X, level %d/%u/0x%X, noise %d/%u/0x%X, updated: 0x%X ** MAX: qual %d/%u/0x%X, level %d/%u/0x%X, noise %d/%u/0x%X, updated: 0x%X", - (__s8) qual->qual, qual->qual, qual->qual, - (__s8) qual->level, qual->level, qual->level, - (__s8) qual->noise, qual->noise, qual->noise, - qual->updated, - (__s8) max_qual->qual, max_qual->qual, max_qual->qual, - (__s8) max_qual->level, max_qual->level, max_qual->level, - (__s8) max_qual->noise, max_qual->noise, max_qual->noise, - max_qual->updated); + _LOGD (LOGD_WIFI, + "QL: qual %d/%u/0x%X, level %d/%u/0x%X, noise %d/%u/0x%X, updated: 0x%X ** MAX: qual %d/%u/0x%X, level %d/%u/0x%X, noise %d/%u/0x%X, updated: 0x%X", + (__s8) qual->qual, qual->qual, qual->qual, + (__s8) qual->level, qual->level, qual->level, + (__s8) qual->noise, qual->noise, qual->noise, + qual->updated, + (__s8) max_qual->qual, max_qual->qual, max_qual->qual, + (__s8) max_qual->level, max_qual->level, max_qual->level, + (__s8) max_qual->noise, max_qual->noise, max_qual->noise, + max_qual->updated); /* Try using the card's idea of the signal quality first as long as it tells us what the max quality is. * Drivers that fill in quality values MUST treat them as percentages, ie the "Link Quality" MUST be @@ -319,8 +375,8 @@ wext_qual_to_percent (const struct iw_quality *qual, /* A sort of signal-to-noise ratio calculation */ level_percent = (int) (100 - 70 * (((double)max_level - (double)level) / ((double)max_level - (double)noise))); - nm_log_dbg (LOGD_WIFI, "QL1: level_percent is %d. max_level %d, level %d, noise_floor %d.", - level_percent, max_level, level, noise); + _LOGD (LOGD_WIFI, "QL1: level_percent is %d. max_level %d, level %d, noise_floor %d.", + level_percent, max_level, level, noise); } else if ( (max_qual->level != 0) && !(max_qual->updated & IW_QUAL_LEVEL_INVALID) /* Valid max_qual->level as upper bound */ && !(qual->updated & IW_QUAL_LEVEL_INVALID)) { @@ -331,18 +387,18 @@ wext_qual_to_percent (const struct iw_quality *qual, /* Signal level is relavtive (0 -> max_qual->level) */ level = CLAMP (level, 0, max_qual->level); level_percent = (int)(100 * ((double)level / (double)max_qual->level)); - nm_log_dbg (LOGD_WIFI, "QL2: level_percent is %d. max_level %d, level %d.", - level_percent, max_qual->level, level); + _LOGD (LOGD_WIFI, "QL2: level_percent is %d. max_level %d, level %d.", + level_percent, max_qual->level, level); } else if (percent == -1) { - nm_log_dbg (LOGD_WIFI, "QL: Could not get quality %% value from driver. Driver is probably buggy."); + _LOGD (LOGD_WIFI, "QL: Could not get quality %% value from driver. Driver is probably buggy."); } /* If the quality percent was 0 or doesn't exist, then try to use signal levels instead */ if ((percent < 1) && (level_percent >= 0)) percent = level_percent; - nm_log_dbg (LOGD_WIFI, "QL: Final quality percent is %d (%d).", - percent, CLAMP (percent, 0, 100)); + _LOGD (LOGD_WIFI, "QL: Final quality percent is %d (%d).", + percent, CLAMP (percent, 0, 100)); return (CLAMP (percent, 0, 100)); } @@ -352,17 +408,21 @@ wifi_wext_get_qual (WifiData *data) WifiDataWext *wext = (WifiDataWext *) data; struct iwreq wrq; struct iw_statistics stats; + char ifname[IFNAMSIZ]; + + if (!get_ifname (data->ifindex, ifname, "get-qual")) + return FALSE; memset (&stats, 0, sizeof (stats)); wrq.u.data.pointer = &stats; wrq.u.data.length = sizeof (stats); wrq.u.data.flags = 1; /* Clear updated flag */ - nm_utils_ifname_cpy (wrq.ifr_name, wext->parent.iface); + nm_utils_ifname_cpy (wrq.ifr_name, ifname); if (ioctl (wext->fd, SIOCGIWSTATS, &wrq) < 0) { - nm_log_warn (LOGD_PLATFORM | LOGD_WIFI, - "(%s): error getting signal strength: %s", - wext->parent.iface, strerror (errno)); + _LOGW (LOGD_PLATFORM | LOGD_WIFI, + "(%s): error getting signal strength: %s", + ifname, strerror (errno)); return -1; } @@ -392,9 +452,13 @@ wifi_wext_set_mesh_channel (WifiData *data, guint32 channel) { WifiDataWext *wext = (WifiDataWext *) data; struct iwreq wrq; + char ifname[IFNAMSIZ]; + + if (!get_ifname (data->ifindex, ifname, "set-mesh-channel")) + return FALSE; memset (&wrq, 0, sizeof (struct iwreq)); - nm_utils_ifname_cpy (wrq.ifr_name, wext->parent.iface); + nm_utils_ifname_cpy (wrq.ifr_name, ifname); if (channel > 0) { wrq.u.freq.flags = IW_FREQ_FIXED; @@ -403,9 +467,9 @@ wifi_wext_set_mesh_channel (WifiData *data, guint32 channel) } if (ioctl (wext->fd, SIOCSIWFREQ, &wrq) < 0) { - nm_log_err (LOGD_PLATFORM | LOGD_WIFI | LOGD_OLPC, - "(%s): error setting channel to %d: %s", - wext->parent.iface, channel, strerror (errno)); + _LOGE (LOGD_PLATFORM | LOGD_WIFI | LOGD_OLPC, + "(%s): error setting channel to %d: %s", + ifname, channel, strerror (errno)); return FALSE; } @@ -418,6 +482,11 @@ wifi_wext_set_mesh_ssid (WifiData *data, const guint8 *ssid, gsize len) WifiDataWext *wext = (WifiDataWext *) data; struct iwreq wrq; char buf[IW_ESSID_MAX_SIZE + 1]; + char ifname[IFNAMSIZ]; + int errsv; + + if (!get_ifname (data->ifindex, ifname, "set-mesh-ssid")) + return FALSE; memset (buf, 0, sizeof (buf)); memcpy (buf, ssid, MIN (sizeof (buf) - 1, len)); @@ -426,16 +495,17 @@ wifi_wext_set_mesh_ssid (WifiData *data, const guint8 *ssid, gsize len) wrq.u.essid.length = len; wrq.u.essid.flags = (len > 0) ? 1 : 0; /* 1=enable SSID, 0=disable/any */ - nm_utils_ifname_cpy (wrq.ifr_name, wext->parent.iface); + nm_utils_ifname_cpy (wrq.ifr_name, ifname); if (ioctl (wext->fd, SIOCSIWESSID, &wrq) == 0) return TRUE; if (errno != ENODEV) { - nm_log_err (LOGD_PLATFORM | LOGD_WIFI | LOGD_OLPC, - "(%s): error setting SSID to '%s': %s", - wext->parent.iface, - ssid ? nm_utils_escape_ssid (ssid, len) : "(null)", - strerror (errno)); + errsv = errno; + _LOGE (LOGD_PLATFORM | LOGD_WIFI | LOGD_OLPC, + "(%s): error setting SSID to '%s': %s", + ifname, + ssid ? nm_utils_escape_ssid (ssid, len) : "(null)", + strerror (errsv)); } return FALSE; @@ -444,12 +514,12 @@ wifi_wext_set_mesh_ssid (WifiData *data, const guint8 *ssid, gsize len) /*****************************************************************************/ static gboolean -wext_can_scan (WifiDataWext *wext) +wext_can_scan_ifname (WifiDataWext *wext, const char *ifname) { struct iwreq wrq; memset (&wrq, 0, sizeof (struct iwreq)); - nm_utils_ifname_cpy (wrq.ifr_name, wext->parent.iface); + nm_utils_ifname_cpy (wrq.ifr_name, ifname); if (ioctl (wext->fd, SIOCSIWSCAN, &wrq) < 0) { if (errno == EOPNOTSUPP) return FALSE; @@ -458,16 +528,17 @@ wext_can_scan (WifiDataWext *wext) } static gboolean -wext_get_range (WifiDataWext *wext, - struct iw_range *range, - guint32 *response_len) +wext_get_range_ifname (WifiDataWext *wext, + const char *ifname, + struct iw_range *range, + guint32 *response_len) { int i = 26; gboolean success = FALSE; struct iwreq wrq; memset (&wrq, 0, sizeof (struct iwreq)); - nm_utils_ifname_cpy (wrq.ifr_name, wext->parent.iface); + nm_utils_ifname_cpy (wrq.ifr_name, ifname); wrq.u.data.pointer = (caddr_t) range; wrq.u.data.length = sizeof (struct iw_range); @@ -482,9 +553,9 @@ wext_get_range (WifiDataWext *wext, success = TRUE; break; } else if (errno != EAGAIN) { - nm_log_err (LOGD_PLATFORM | LOGD_WIFI, - "(%s): couldn't get driver range information (%d).", - wext->parent.iface, errno); + _LOGE (LOGD_PLATFORM | LOGD_WIFI, + "(%s): couldn't get driver range information (%d).", + ifname, errno); break; } @@ -492,9 +563,9 @@ wext_get_range (WifiDataWext *wext, } if (i <= 0) { - nm_log_warn (LOGD_PLATFORM | LOGD_WIFI, - "(%s): driver took too long to respond to IWRANGE query.", - wext->parent.iface); + _LOGW (LOGD_PLATFORM | LOGD_WIFI, + "(%s): driver took too long to respond to IWRANGE query.", + ifname); } return success; @@ -506,7 +577,7 @@ wext_get_range (WifiDataWext *wext, NM_WIFI_DEVICE_CAP_RSN) static guint32 -wext_get_caps (WifiDataWext *wext, struct iw_range *range) +wext_get_caps (WifiDataWext *wext, const char *ifname, struct iw_range *range) { guint32 caps = NM_WIFI_DEVICE_CAP_NONE; @@ -531,16 +602,18 @@ wext_get_caps (WifiDataWext *wext, struct iw_range *range) /* Check for cipher support but not WPA support */ if ( (caps & (NM_WIFI_DEVICE_CAP_CIPHER_TKIP | NM_WIFI_DEVICE_CAP_CIPHER_CCMP)) && !(caps & (NM_WIFI_DEVICE_CAP_WPA | NM_WIFI_DEVICE_CAP_RSN))) { - nm_log_warn (LOGD_WIFI, "%s: device supports WPA ciphers but not WPA protocol; " - "WPA unavailable.", wext->parent.iface); + _LOGW (LOGD_WIFI, + "%s: device supports WPA ciphers but not WPA protocol; WPA unavailable.", + ifname); caps &= ~WPA_CAPS; } /* Check for WPA support but not cipher support */ if ( (caps & (NM_WIFI_DEVICE_CAP_WPA | NM_WIFI_DEVICE_CAP_RSN)) && !(caps & (NM_WIFI_DEVICE_CAP_CIPHER_TKIP | NM_WIFI_DEVICE_CAP_CIPHER_CCMP))) { - nm_log_warn (LOGD_WIFI, "%s: device supports WPA protocol but not WPA ciphers; " - "WPA unavailable.", wext->parent.iface); + _LOGW (LOGD_WIFI, + "%s: device supports WPA protocol but not WPA ciphers; WPA unavailable.", + ifname); caps &= ~WPA_CAPS; } @@ -554,7 +627,7 @@ wext_get_caps (WifiDataWext *wext, struct iw_range *range) } WifiData * -wifi_wext_init (const char *iface, int ifindex, gboolean check_scan) +wifi_wext_init (int ifindex, gboolean check_scan) { WifiDataWext *wext; struct iw_range range; @@ -562,8 +635,15 @@ wifi_wext_init (const char *iface, int ifindex, gboolean check_scan) struct iw_range_with_scan_capa *scan_capa_range; int i; gboolean freq_valid = FALSE, has_5ghz = FALSE, has_2ghz = FALSE; + char ifname[IFNAMSIZ]; + + if (!nmp_utils_if_indextoname (ifindex, ifname)) { + _LOGW (LOGD_PLATFORM | LOGD_WIFI, + "can't determine interface name for ifindex %d", ifindex); + return NULL; + } - wext = wifi_data_new (iface, ifindex, sizeof (*wext)); + wext = wifi_data_new (ifindex, sizeof (*wext)); wext->parent.get_mode = wifi_wext_get_mode; wext->parent.set_mode = wifi_wext_set_mode; wext->parent.set_powersave = wifi_wext_set_powersave; @@ -582,17 +662,17 @@ wifi_wext_init (const char *iface, int ifindex, gboolean check_scan) goto error; memset (&range, 0, sizeof (struct iw_range)); - if (wext_get_range (wext, &range, &response_len) == FALSE) { - nm_log_info (LOGD_PLATFORM | LOGD_WIFI, "(%s): driver WEXT range request failed", - wext->parent.iface); + if (wext_get_range_ifname (wext, ifname, &range, &response_len) == FALSE) { + _LOGI (LOGD_PLATFORM | LOGD_WIFI, "(%s): driver WEXT range request failed", + ifname); goto error; } if ((response_len < 300) || (range.we_version_compiled < 21)) { - nm_log_info (LOGD_PLATFORM | LOGD_WIFI, - "(%s): driver WEXT version too old (got %d, expected >= 21)", - wext->parent.iface, - range.we_version_compiled); + _LOGI (LOGD_PLATFORM | LOGD_WIFI, + "(%s): driver WEXT version too old (got %d, expected >= 21)", + ifname, + range.we_version_compiled); goto error; } @@ -612,10 +692,10 @@ wifi_wext_init (const char *iface, int ifindex, gboolean check_scan) } /* Check for scanning capability; cards that can't scan are not supported */ - if (check_scan && (wext_can_scan (wext) == FALSE)) { - nm_log_info (LOGD_PLATFORM | LOGD_WIFI, - "(%s): drivers that cannot scan are unsupported", - wext->parent.iface); + if (check_scan && (wext_can_scan_ifname (wext, ifname) == FALSE)) { + _LOGI (LOGD_PLATFORM | LOGD_WIFI, + "(%s): drivers that cannot scan are unsupported", + ifname); goto error; } @@ -625,18 +705,18 @@ wifi_wext_init (const char *iface, int ifindex, gboolean check_scan) */ scan_capa_range = (struct iw_range_with_scan_capa *) ⦥ if (scan_capa_range->scan_capa & NM_IW_SCAN_CAPA_ESSID) { - nm_log_info (LOGD_PLATFORM | LOGD_WIFI, - "(%s): driver supports SSID scans (scan_capa 0x%02X).", - wext->parent.iface, - scan_capa_range->scan_capa); + _LOGI (LOGD_PLATFORM | LOGD_WIFI, + "(%s): driver supports SSID scans (scan_capa 0x%02X).", + ifname, + scan_capa_range->scan_capa); } else { - nm_log_info (LOGD_PLATFORM | LOGD_WIFI, - "(%s): driver does not support SSID scans (scan_capa 0x%02X).", - wext->parent.iface, - scan_capa_range->scan_capa); + _LOGI (LOGD_PLATFORM | LOGD_WIFI, + "(%s): driver does not support SSID scans (scan_capa 0x%02X).", + ifname, + scan_capa_range->scan_capa); } - wext->parent.caps = wext_get_caps (wext, &range); + wext->parent.caps = wext_get_caps (wext, ifname, &range); if (freq_valid) wext->parent.caps |= NM_WIFI_DEVICE_CAP_FREQ_VALID; if (has_2ghz) @@ -644,9 +724,9 @@ wifi_wext_init (const char *iface, int ifindex, gboolean check_scan) if (has_5ghz) wext->parent.caps |= NM_WIFI_DEVICE_CAP_FREQ_5GHZ; - nm_log_info (LOGD_PLATFORM | LOGD_WIFI, - "(%s): using WEXT for WiFi device control", - wext->parent.iface); + _LOGI (LOGD_PLATFORM | LOGD_WIFI, + "(%s): using WEXT for WiFi device control", + ifname); return (WifiData *) wext; |