cfg80211: use RTNL locked reg_can_beacon for IR-relaxation
The RTNL is required to check for IR-relaxation conditions that allow
more channels to beacon. Export an RTNL locked version of reg_can_beacon
and use it where possible in AP/STA interface type flows, where
IR-relaxation may be applicable.
Fixes: 06f207fc54 ("cfg80211: change GO_CONCURRENT to IR_CONCURRENT for STA")
Signed-off-by: Arik Nemtsov <arikx.nemtsov@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
b3e7de873d
commit
923b352f19
@@ -797,23 +797,18 @@ static bool cfg80211_ir_permissive_chan(struct wiphy *wiphy,
|
||||
return false;
|
||||
}
|
||||
|
||||
bool cfg80211_reg_can_beacon(struct wiphy *wiphy,
|
||||
struct cfg80211_chan_def *chandef,
|
||||
enum nl80211_iftype iftype)
|
||||
static bool _cfg80211_reg_can_beacon(struct wiphy *wiphy,
|
||||
struct cfg80211_chan_def *chandef,
|
||||
enum nl80211_iftype iftype,
|
||||
bool check_no_ir)
|
||||
{
|
||||
bool res;
|
||||
u32 prohibited_flags = IEEE80211_CHAN_DISABLED |
|
||||
IEEE80211_CHAN_RADAR;
|
||||
|
||||
trace_cfg80211_reg_can_beacon(wiphy, chandef, iftype);
|
||||
trace_cfg80211_reg_can_beacon(wiphy, chandef, iftype, check_no_ir);
|
||||
|
||||
/*
|
||||
* Under certain conditions suggested by some regulatory bodies a
|
||||
* GO/STA can IR on channels marked with IEEE80211_NO_IR. Set this flag
|
||||
* only if such relaxations are not enabled and the conditions are not
|
||||
* met.
|
||||
*/
|
||||
if (!cfg80211_ir_permissive_chan(wiphy, iftype, chandef->chan))
|
||||
if (check_no_ir)
|
||||
prohibited_flags |= IEEE80211_CHAN_NO_IR;
|
||||
|
||||
if (cfg80211_chandef_dfs_required(wiphy, chandef, iftype) > 0 &&
|
||||
@@ -827,8 +822,36 @@ bool cfg80211_reg_can_beacon(struct wiphy *wiphy,
|
||||
trace_cfg80211_return_bool(res);
|
||||
return res;
|
||||
}
|
||||
|
||||
bool cfg80211_reg_can_beacon(struct wiphy *wiphy,
|
||||
struct cfg80211_chan_def *chandef,
|
||||
enum nl80211_iftype iftype)
|
||||
{
|
||||
return _cfg80211_reg_can_beacon(wiphy, chandef, iftype, true);
|
||||
}
|
||||
EXPORT_SYMBOL(cfg80211_reg_can_beacon);
|
||||
|
||||
bool cfg80211_reg_can_beacon_relax(struct wiphy *wiphy,
|
||||
struct cfg80211_chan_def *chandef,
|
||||
enum nl80211_iftype iftype)
|
||||
{
|
||||
bool check_no_ir;
|
||||
|
||||
ASSERT_RTNL();
|
||||
|
||||
/*
|
||||
* Under certain conditions suggested by some regulatory bodies a
|
||||
* GO/STA can IR on channels marked with IEEE80211_NO_IR. Set this flag
|
||||
* only if such relaxations are not enabled and the conditions are not
|
||||
* met.
|
||||
*/
|
||||
check_no_ir = !cfg80211_ir_permissive_chan(wiphy, iftype,
|
||||
chandef->chan);
|
||||
|
||||
return _cfg80211_reg_can_beacon(wiphy, chandef, iftype, check_no_ir);
|
||||
}
|
||||
EXPORT_SYMBOL(cfg80211_reg_can_beacon_relax);
|
||||
|
||||
int cfg80211_set_monitor_channel(struct cfg80211_registered_device *rdev,
|
||||
struct cfg80211_chan_def *chandef)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user