Sophie

Sophie

distrib > Scientific%20Linux > 5x > x86_64 > by-pkgid > fc11cd6e1c513a17304da94a5390f3cd > files > 2534

kernel-2.6.18-194.11.1.el5.src.rpm

From: John W. Linville <linville@redhat.com>
Date: Thu, 17 Jan 2008 15:48:21 -0500
Subject: [net] wireless: introduce WEXT scan capabilities
Message-id: 20080117204821.GA1043@redhat.com
O-Subject: [RHEL5.2 PATCH] introduce WEXT scan capabilities
Bugzilla: 427528

This is a very simple backport of a patch queued for 2.6.25.  Without
it NetworkManager has great difficulty connecting to infrastructure
mode wireless networks that do not broadcast their SSID (i.e. hidden APs).

BZ427528

commit f4317f3ba1f6d833bcf8ec22b5575b981b5438dc
Author: Dan Williams <dcbw@redhat.com>
Date:   Wed Dec 12 10:25:07 2007 -0500

    introduce WEXT scan capabilities

    Introduce scan capabilities to WEXT so that userspace can do intelligent
    things with scan behavior such as handling hidden SSIDs more gracefully.
    If the driver reports a specific scan capability, the driver must
    respect the options specified in the iw_scan_req structure when handling
    the SIOCSIWSCAN call, unless it's mode or state does not allow it to do
    so, in which case it must return an error.

    This version switches to Dave Kilroy's suggestion of claiming unused
    padding space for the scan_capa field.

    Signed-off-by: Dan Williams <dcbw@redhat.com>
    Signed-off-by: John W. Linville <linville@tuxdriver.com>

Acked-by: "David S. Miller" <davem@redhat.com>
Acked-by: Alan Cox <alan@redhat.com>
Acked-by: Rik van Riel <riel@redhat.com>

diff --git a/drivers/net/wireless/hostap/hostap_ioctl.c b/drivers/net/wireless/hostap/hostap_ioctl.c
index 8399de5..9b4bd49 100644
--- a/drivers/net/wireless/hostap/hostap_ioctl.c
+++ b/drivers/net/wireless/hostap/hostap_ioctl.c
@@ -1094,6 +1094,9 @@ static int prism2_ioctl_giwrange(struct net_device *dev,
 	range->enc_capa = IW_ENC_CAPA_WPA | IW_ENC_CAPA_WPA2 |
 		IW_ENC_CAPA_CIPHER_TKIP | IW_ENC_CAPA_CIPHER_CCMP;
 
+	if (local->sta_fw_ver >= PRISM2_FW_VER(1,3,1))
+		range->scan_capa = IW_SCAN_CAPA_ESSID;
+
 	return 0;
 }
 
diff --git a/drivers/net/wireless/ipw2200.c b/drivers/net/wireless/ipw2200.c
index 37e60f6..d7b70a0 100644
--- a/drivers/net/wireless/ipw2200.c
+++ b/drivers/net/wireless/ipw2200.c
@@ -8836,6 +8836,8 @@ static int ipw_wx_get_range(struct net_device *dev,
 	range->enc_capa = IW_ENC_CAPA_WPA | IW_ENC_CAPA_WPA2 |
 		IW_ENC_CAPA_CIPHER_TKIP | IW_ENC_CAPA_CIPHER_CCMP;
 
+	range->scan_capa = IW_SCAN_CAPA_ESSID | IW_SCAN_CAPA_TYPE;
+
 	IPW_DEBUG_WX("GET Range\n");
 	return 0;
 }
diff --git a/include/linux/wireless.h b/include/linux/wireless.h
index 1358856..3ede0ee 100644
--- a/include/linux/wireless.h
+++ b/include/linux/wireless.h
@@ -521,6 +521,16 @@
 /* Maximum size of returned data */
 #define IW_SCAN_MAX_DATA	4096	/* In bytes */
 
+/* Scan capability flags - in (struct iw_range *)->scan_capa */
+#define IW_SCAN_CAPA_NONE		0x00
+#define IW_SCAN_CAPA_ESSID		0x01
+#define IW_SCAN_CAPA_BSSID		0x02
+#define IW_SCAN_CAPA_CHANNEL	0x04
+#define IW_SCAN_CAPA_MODE		0x08
+#define IW_SCAN_CAPA_RATE		0x10
+#define IW_SCAN_CAPA_TYPE		0x20
+#define IW_SCAN_CAPA_TIME		0x40
+
 /* Max number of char in custom event - use multiple of them if needed */
 #define IW_CUSTOM_MAX		256	/* In bytes */
 
@@ -941,6 +951,11 @@ struct	iw_range
 	__u16		old_num_channels;
 	__u8		old_num_frequency;
 
+#ifndef __GENKSYMS__
+	/* Scan capabilities */
+	__u8		scan_capa; 	/* IW_SCAN_CAPA_* bit field */
+#endif
+
 	/* Wireless event capability bitmasks */
 	__u32		event_capa[6];
 
diff --git a/net/mac80211/ieee80211_ioctl.c b/net/mac80211/ieee80211_ioctl.c
index 646e2f2..0c52ed8 100644
--- a/net/mac80211/ieee80211_ioctl.c
+++ b/net/mac80211/ieee80211_ioctl.c
@@ -218,6 +218,8 @@ static int ieee80211_ioctl_giwrange(struct net_device *dev,
 	IW_EVENT_CAPA_SET(range->event_capa, SIOCGIWAP);
 	IW_EVENT_CAPA_SET(range->event_capa, SIOCGIWSCAN);
 
+	range->scan_capa |= IW_SCAN_CAPA_ESSID;
+
 	return 0;
 }