introduce WEXT scan capabilities
authorDan Williams <dcbw@redhat.com>
Wed, 12 Dec 2007 15:25:07 +0000 (10:25 -0500)
committerDavid S. Miller <davem@davemloft.net>
Mon, 28 Jan 2008 22:58:25 +0000 (14:58 -0800)
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>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/wireless/hostap/hostap_ioctl.c
drivers/net/wireless/ipw2200.c
include/linux/wireless.h
net/mac80211/ieee80211_ioctl.c

index d8f5efcfcab96915d0f41ecfb22958ba556a3936..3a57d48cc360be4ed0aa0952644e2e03fa51d07b 100644 (file)
@@ -1089,6 +1089,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;
 }
 
index 003f73f89efa66bda431e3322b1b2b35eb5dbf7e..be31304dfad52ca5c7b024a93a7dc2b5e08638e9 100644 (file)
@@ -8912,6 +8912,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;
 }
index 0987aa7a6cf513281b0c6fb50332bc260f3ca279..74e84caa1e208ba529729597bf8a66612d40061b 100644 (file)
 /* 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 */
 
@@ -963,6 +973,9 @@ struct      iw_range
        __u16           old_num_channels;
        __u8            old_num_frequency;
 
+       /* Scan capabilities */
+       __u8            scan_capa;      /* IW_SCAN_CAPA_* bit field */
+
        /* Wireless event capability bitmasks */
        __u32           event_capa[6];
 
index 161f3bdec41be4818612755893af7e98dca9aaf0..04ddce76135b9fd021e9d888089d9cd2cca85b23 100644 (file)
@@ -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;
 }