mirror of https://gitee.com/openkylin/linux.git
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:
parent
dbbae26afa
commit
870d37fc22
|
@ -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
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in New Issue