On Friday 27 April 2007 15:49, Michael Wu wrote: > On Friday 27 April 2007 13:40, Jiri Benc wrote: > > I agree. > > > > And I'd like to see some way to disable this feature for sane cards. > > Here you go. > > Thanks, > -Michael Wu And here's one that *really* works. Thanks, -Michael Wu
mac80211: set bssid to broadcast before scan From: Michael Wu <flamingice@xxxxxxxxxxxx> This patch sets the BSSID to broadcast before scanning to ensure that the hardware filter does not filter probe responses. Signed-off-by: Michael Wu <flamingice@xxxxxxxxxxxx> --- include/net/mac80211.h | 4 ++++ net/mac80211/ieee80211.c | 7 ++++++- net/mac80211/ieee80211_sta.c | 11 +++++++++++ 3 files changed, 21 insertions(+), 1 deletions(-) diff --git a/include/net/mac80211.h b/include/net/mac80211.h index cade956..2da0d31 100644 --- a/include/net/mac80211.h +++ b/include/net/mac80211.h @@ -524,6 +524,10 @@ struct ieee80211_hw { * normal operation. */ #define IEEE80211_HW_MONITOR_DURING_OPER (1<<9) + /* Device does not need BSSID filter set to broadcast in order to + * receive all probe responses while scanning */ +#define IEEE80211_HW_NO_PROBE_FILTERING (1<<10) + /* please fill this gap when adding new flags */ /* calculate Michael MIC for an MSDU when doing hwcrypto */ diff --git a/net/mac80211/ieee80211.c b/net/mac80211/ieee80211.c index f6a71ce..4976493 100644 --- a/net/mac80211/ieee80211.c +++ b/net/mac80211/ieee80211.c @@ -2015,6 +2015,7 @@ static int __ieee80211_if_config(struct net_device *dev, struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr); struct ieee80211_if_conf conf; + static const u8 scan_bssid[] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; if (!local->ops->config_interface || !netif_running(dev)) return 0; @@ -2023,7 +2024,11 @@ static int __ieee80211_if_config(struct net_device *dev, conf.type = sdata->type; if (sdata->type == IEEE80211_IF_TYPE_STA || sdata->type == IEEE80211_IF_TYPE_IBSS) { - conf.bssid = sdata->u.sta.bssid; + if (local->sta_scanning && + local->scan_dev == dev) + conf.bssid = scan_bssid; + else + conf.bssid = sdata->u.sta.bssid; conf.ssid = sdata->u.sta.ssid; conf.ssid_len = sdata->u.sta.ssid_len; conf.generic_elem = sdata->u.sta.extra_ie; diff --git a/net/mac80211/ieee80211_sta.c b/net/mac80211/ieee80211_sta.c index 7cb2dd3..7b12d7d 100644 --- a/net/mac80211/ieee80211_sta.c +++ b/net/mac80211/ieee80211_sta.c @@ -2577,6 +2577,11 @@ void ieee80211_scan_completed(struct ieee80211_hw *hw) printk(KERN_DEBUG "%s: failed to restore operational" "channel after scan\n", dev->name); + if (!(local->hw.flags & IEEE80211_HW_NO_PROBE_FILTERING)) + if (ieee80211_if_config(dev)) + printk(KERN_DEBUG "%s: failed to restore operational" + "BSSID after scan\n", dev->name); + memset(&wrqu, 0, sizeof(wrqu)); wireless_send_event(dev, SIOCGIWSCAN, &wrqu, NULL); @@ -2736,6 +2741,12 @@ static int ieee80211_sta_start_scan(struct net_device *dev, list); local->scan_channel_idx = 0; local->scan_dev = dev; + + if (!(local->hw.flags & IEEE80211_HW_NO_PROBE_FILTERING)) + if (ieee80211_if_config(dev)) + printk(KERN_DEBUG "%s: failed to set BSSID for scan\n", + dev->name); + /* TODO: start scan as soon as all nullfunc frames are ACKed */ queue_delayed_work(local->hw.workqueue, &local->scan_work, IEEE80211_CHANNEL_TIME);
Attachment:
pgp0p9aA5xJMr.pgp
Description: PGP signature