mac80211: introduce per vif frame registration API
Currently the cfg80211's frame registration api receives wdev, however mac80211 assumes per device filter configuration and ignores wdev. Per device filtering is too wasteful, especially for multi-channel devices. Introduce new per vif frame registration API and use it for probe request registrations in ieee80211_mgmt_frame_register() Also call directly to ieee80211_configure_filter instead of using a work since it is now allowed to sleep in ieee80211_mgmt_frame_register. Signed-off-by: Andrei Otcheretianski <andrei.otcheretianski@intel.com> Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com> Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:

committed by
Johannes Berg

parent
7bdbe400d1
commit
1b09b5568e
@@ -3516,18 +3516,32 @@ static void ieee80211_mgmt_frame_register(struct wiphy *wiphy,
|
||||
u16 frame_type, bool reg)
|
||||
{
|
||||
struct ieee80211_local *local = wiphy_priv(wiphy);
|
||||
struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
|
||||
|
||||
switch (frame_type) {
|
||||
case IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_PROBE_REQ:
|
||||
if (reg)
|
||||
if (reg) {
|
||||
local->probe_req_reg++;
|
||||
else
|
||||
local->probe_req_reg--;
|
||||
sdata->vif.probe_req_reg++;
|
||||
} else {
|
||||
if (local->probe_req_reg)
|
||||
local->probe_req_reg--;
|
||||
|
||||
if (sdata->vif.probe_req_reg)
|
||||
sdata->vif.probe_req_reg--;
|
||||
}
|
||||
|
||||
if (!local->open_count)
|
||||
break;
|
||||
|
||||
ieee80211_queue_work(&local->hw, &local->reconfig_filter);
|
||||
if (sdata->vif.probe_req_reg == 1)
|
||||
drv_config_iface_filter(local, sdata, FIF_PROBE_REQ,
|
||||
FIF_PROBE_REQ);
|
||||
else if (sdata->vif.probe_req_reg == 0)
|
||||
drv_config_iface_filter(local, sdata, 0,
|
||||
FIF_PROBE_REQ);
|
||||
|
||||
ieee80211_configure_filter(local);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
Reference in New Issue
Block a user