mac80211: Add capability to enable/disable beaconing
This patch adds a flag to notify drivers to start and stop beaconing when needed, for example, during a scan run. Based on Sujith's first patch to do the same, but now disables beaconing for all virtual interfaces while scanning, has a separate change flag and tracks user-space requests. Signed-off-by: Sujith <Sujith.Manoharan@atheros.com> Signed-off-by: Johannes Berg <johannes@sipsolutions.net> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
committed by
John W. Linville
parent
07c1e85251
commit
078e1e60dd
@ -20,6 +20,7 @@
|
||||
|
||||
#include <linux/wireless.h>
|
||||
#include <linux/if_arp.h>
|
||||
#include <linux/rtnetlink.h>
|
||||
#include <net/mac80211.h>
|
||||
#include <net/iw_handler.h>
|
||||
|
||||
@ -472,8 +473,8 @@ void ieee80211_scan_completed(struct ieee80211_hw *hw)
|
||||
netif_addr_unlock(local->mdev);
|
||||
netif_tx_unlock_bh(local->mdev);
|
||||
|
||||
rcu_read_lock();
|
||||
list_for_each_entry_rcu(sdata, &local->interfaces, list) {
|
||||
mutex_lock(&local->iflist_mtx);
|
||||
list_for_each_entry(sdata, &local->interfaces, list) {
|
||||
/* Tell AP we're back */
|
||||
if (sdata->vif.type == NL80211_IFTYPE_STATION) {
|
||||
if (sdata->u.sta.flags & IEEE80211_STA_ASSOCIATED) {
|
||||
@ -482,8 +483,10 @@ void ieee80211_scan_completed(struct ieee80211_hw *hw)
|
||||
}
|
||||
} else
|
||||
netif_tx_wake_all_queues(sdata->dev);
|
||||
|
||||
ieee80211_if_config(sdata, IEEE80211_IFCC_BEACON_ENABLED);
|
||||
}
|
||||
rcu_read_unlock();
|
||||
mutex_unlock(&local->iflist_mtx);
|
||||
|
||||
done:
|
||||
ieee80211_mlme_notify_scan_completed(local);
|
||||
@ -491,7 +494,6 @@ void ieee80211_scan_completed(struct ieee80211_hw *hw)
|
||||
}
|
||||
EXPORT_SYMBOL(ieee80211_scan_completed);
|
||||
|
||||
|
||||
void ieee80211_scan_work(struct work_struct *work)
|
||||
{
|
||||
struct ieee80211_local *local =
|
||||
@ -633,8 +635,10 @@ int ieee80211_start_scan(struct ieee80211_sub_if_data *scan_sdata,
|
||||
|
||||
local->sw_scanning = true;
|
||||
|
||||
rcu_read_lock();
|
||||
list_for_each_entry_rcu(sdata, &local->interfaces, list) {
|
||||
mutex_lock(&local->iflist_mtx);
|
||||
list_for_each_entry(sdata, &local->interfaces, list) {
|
||||
ieee80211_if_config(sdata, IEEE80211_IFCC_BEACON_ENABLED);
|
||||
|
||||
if (sdata->vif.type == NL80211_IFTYPE_STATION) {
|
||||
if (sdata->u.sta.flags & IEEE80211_STA_ASSOCIATED) {
|
||||
netif_tx_stop_all_queues(sdata->dev);
|
||||
@ -643,7 +647,7 @@ int ieee80211_start_scan(struct ieee80211_sub_if_data *scan_sdata,
|
||||
} else
|
||||
netif_tx_stop_all_queues(sdata->dev);
|
||||
}
|
||||
rcu_read_unlock();
|
||||
mutex_unlock(&local->iflist_mtx);
|
||||
|
||||
if (ssid) {
|
||||
local->scan_ssid_len = ssid_len;
|
||||
|
Reference in New Issue
Block a user