summary refs log tree commit diff
path: root/src/platform/wifi/wifi-utils-wext.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/platform/wifi/wifi-utils-wext.c')
-rw-r--r--src/platform/wifi/wifi-utils-wext.c276
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 *) &range;
 	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;