|
@@ -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)
|
|
|
{
|