mac80211: refactor virtual monitor code

Use cfg80211 the new .set_monitor_enabled instead
of tracking it inside mac80211.

Signed-off-by: Michal Kazior <michal.kazior@tieto.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
Michal Kazior 2012-06-29 12:47:02 +02:00 committed by Johannes Berg
parent dbbae26afa
commit 870d37fc22
3 changed files with 17 additions and 14 deletions

View File

@ -2990,6 +2990,16 @@ ieee80211_wiphy_get_channel(struct wiphy *wiphy,
return local->oper_channel; return local->oper_channel;
} }
static void ieee80211_set_monitor_enabled(struct wiphy *wiphy, bool enabled)
{
struct ieee80211_local *local = wiphy_priv(wiphy);
if (enabled)
WARN_ON(ieee80211_add_virtual_monitor(local));
else
ieee80211_del_virtual_monitor(local);
}
#ifdef CONFIG_PM #ifdef CONFIG_PM
static void ieee80211_set_wakeup(struct wiphy *wiphy, bool enabled) static void ieee80211_set_wakeup(struct wiphy *wiphy, bool enabled)
{ {
@ -3065,6 +3075,7 @@ struct cfg80211_ops mac80211_config_ops = {
.probe_client = ieee80211_probe_client, .probe_client = ieee80211_probe_client,
.get_channel = ieee80211_wiphy_get_channel, .get_channel = ieee80211_wiphy_get_channel,
.set_noack_map = ieee80211_set_noack_map, .set_noack_map = ieee80211_set_noack_map,
.set_monitor_enabled = ieee80211_set_monitor_enabled,
#ifdef CONFIG_PM #ifdef CONFIG_PM
.set_wakeup = ieee80211_set_wakeup, .set_wakeup = ieee80211_set_wakeup,
#endif #endif

View File

@ -1485,6 +1485,10 @@ int ieee80211_add_srates_ie(struct ieee80211_sub_if_data *sdata,
int ieee80211_add_ext_srates_ie(struct ieee80211_sub_if_data *sdata, int ieee80211_add_ext_srates_ie(struct ieee80211_sub_if_data *sdata,
struct sk_buff *skb, bool need_basic); struct sk_buff *skb, bool need_basic);
/* virtual monitor */
int ieee80211_add_virtual_monitor(struct ieee80211_local *local);
void ieee80211_del_virtual_monitor(struct ieee80211_local *local);
/* channel management */ /* channel management */
enum ieee80211_chan_mode { enum ieee80211_chan_mode {
CHAN_MODE_UNDEFINED, CHAN_MODE_UNDEFINED,

View File

@ -330,7 +330,7 @@ static void ieee80211_set_default_queues(struct ieee80211_sub_if_data *sdata)
sdata->vif.cab_queue = IEEE80211_INVAL_HW_QUEUE; sdata->vif.cab_queue = IEEE80211_INVAL_HW_QUEUE;
} }
static int ieee80211_add_virtual_monitor(struct ieee80211_local *local) int ieee80211_add_virtual_monitor(struct ieee80211_local *local)
{ {
struct ieee80211_sub_if_data *sdata; struct ieee80211_sub_if_data *sdata;
int ret; int ret;
@ -371,7 +371,7 @@ static int ieee80211_add_virtual_monitor(struct ieee80211_local *local)
return 0; return 0;
} }
static void ieee80211_del_virtual_monitor(struct ieee80211_local *local) void ieee80211_del_virtual_monitor(struct ieee80211_local *local)
{ {
struct ieee80211_sub_if_data *sdata; struct ieee80211_sub_if_data *sdata;
@ -487,12 +487,6 @@ static int ieee80211_do_open(struct net_device *dev, bool coming_up)
break; break;
} }
if (local->monitors == 0 && local->open_count == 0) {
res = ieee80211_add_virtual_monitor(local);
if (res)
goto err_stop;
}
/* must be before the call to ieee80211_configure_filter */ /* must be before the call to ieee80211_configure_filter */
local->monitors++; local->monitors++;
if (local->monitors == 1) { if (local->monitors == 1) {
@ -507,8 +501,6 @@ static int ieee80211_do_open(struct net_device *dev, bool coming_up)
break; break;
default: default:
if (coming_up) { if (coming_up) {
ieee80211_del_virtual_monitor(local);
res = drv_add_interface(local, sdata); res = drv_add_interface(local, sdata);
if (res) if (res)
goto err_stop; goto err_stop;
@ -743,7 +735,6 @@ static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata,
if (local->monitors == 0) { if (local->monitors == 0) {
local->hw.conf.flags &= ~IEEE80211_CONF_MONITOR; local->hw.conf.flags &= ~IEEE80211_CONF_MONITOR;
hw_reconf_flags |= IEEE80211_CONF_CHANGE_MONITOR; hw_reconf_flags |= IEEE80211_CONF_CHANGE_MONITOR;
ieee80211_del_virtual_monitor(local);
} }
ieee80211_adjust_monitor_flags(sdata, -1); ieee80211_adjust_monitor_flags(sdata, -1);
@ -817,9 +808,6 @@ static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata,
} }
} }
spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags); spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags);
if (local->monitors == local->open_count && local->monitors > 0)
ieee80211_add_virtual_monitor(local);
} }
static int ieee80211_stop(struct net_device *dev) static int ieee80211_stop(struct net_device *dev)