Commit 9fd171a7 authored by Johannes Berg's avatar Johannes Berg

wifi: cfg80211: refactor regulatory beaconing checking

There are two functions exported now, with different settings,
refactor to just export a single function that take a struct
with different settings. This will make it easier to add more
parameters.
Reviewed-by: default avatarMiriam Rachel Korenblit <miriam.rachel.korenblit@intel.com>
Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
Link: https://msgid.link/20240523120945.d44c34dadfc2.I59b4403108e0dbf7fc6ae8f7522e1af520cffb1c@changeidSigned-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent 459662e8
...@@ -8800,6 +8800,31 @@ static inline void cfg80211_report_obss_beacon(struct wiphy *wiphy, ...@@ -8800,6 +8800,31 @@ static inline void cfg80211_report_obss_beacon(struct wiphy *wiphy,
sig_dbm); sig_dbm);
} }
/**
* struct cfg80211_beaconing_check_config - beacon check configuration
* @iftype: the interface type to check for
* @relax: allow IR-relaxation conditions to apply (e.g. another
* interface connected already on the same channel)
* NOTE: If this is set, wiphy mutex must be held.
*/
struct cfg80211_beaconing_check_config {
enum nl80211_iftype iftype;
bool relax;
};
/**
* cfg80211_reg_check_beaconing - check if beaconing is allowed
* @wiphy: the wiphy
* @chandef: the channel definition
* @cfg: additional parameters for the checking
*
* Return: %true if there is no secondary channel or the secondary channel(s)
* can be used for beaconing (i.e. is not a radar channel etc.)
*/
bool cfg80211_reg_check_beaconing(struct wiphy *wiphy,
struct cfg80211_chan_def *chandef,
struct cfg80211_beaconing_check_config *cfg);
/** /**
* cfg80211_reg_can_beacon - check if beaconing is allowed * cfg80211_reg_can_beacon - check if beaconing is allowed
* @wiphy: the wiphy * @wiphy: the wiphy
...@@ -8809,9 +8834,17 @@ static inline void cfg80211_report_obss_beacon(struct wiphy *wiphy, ...@@ -8809,9 +8834,17 @@ static inline void cfg80211_report_obss_beacon(struct wiphy *wiphy,
* Return: %true if there is no secondary channel or the secondary channel(s) * Return: %true if there is no secondary channel or the secondary channel(s)
* can be used for beaconing (i.e. is not a radar channel etc.) * can be used for beaconing (i.e. is not a radar channel etc.)
*/ */
bool cfg80211_reg_can_beacon(struct wiphy *wiphy, static inline bool
struct cfg80211_chan_def *chandef, cfg80211_reg_can_beacon(struct wiphy *wiphy,
enum nl80211_iftype iftype); struct cfg80211_chan_def *chandef,
enum nl80211_iftype iftype)
{
struct cfg80211_beaconing_check_config config = {
.iftype = iftype,
};
return cfg80211_reg_check_beaconing(wiphy, chandef, &config);
}
/** /**
* cfg80211_reg_can_beacon_relax - check if beaconing is allowed with relaxation * cfg80211_reg_can_beacon_relax - check if beaconing is allowed with relaxation
...@@ -8826,9 +8859,18 @@ bool cfg80211_reg_can_beacon(struct wiphy *wiphy, ...@@ -8826,9 +8859,18 @@ bool cfg80211_reg_can_beacon(struct wiphy *wiphy,
* *
* Context: Requires the wiphy mutex to be held. * Context: Requires the wiphy mutex to be held.
*/ */
bool cfg80211_reg_can_beacon_relax(struct wiphy *wiphy, static inline bool
struct cfg80211_chan_def *chandef, cfg80211_reg_can_beacon_relax(struct wiphy *wiphy,
enum nl80211_iftype iftype); struct cfg80211_chan_def *chandef,
enum nl80211_iftype iftype)
{
struct cfg80211_beaconing_check_config config = {
.iftype = iftype,
.relax = true,
};
return cfg80211_reg_check_beaconing(wiphy, chandef, &config);
}
/** /**
* cfg80211_ch_switch_notify - update wdev channel and notify userspace * cfg80211_ch_switch_notify - update wdev channel and notify userspace
......
...@@ -1550,22 +1550,12 @@ static bool _cfg80211_reg_can_beacon(struct wiphy *wiphy, ...@@ -1550,22 +1550,12 @@ static bool _cfg80211_reg_can_beacon(struct wiphy *wiphy,
return res; return res;
} }
bool cfg80211_reg_can_beacon(struct wiphy *wiphy, bool cfg80211_reg_check_beaconing(struct wiphy *wiphy,
struct cfg80211_chan_def *chandef, struct cfg80211_chan_def *chandef,
enum nl80211_iftype iftype) struct cfg80211_beaconing_check_config *cfg)
{
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)
{ {
struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
bool check_no_ir; bool check_no_ir = true;
lockdep_assert_held(&rdev->wiphy.mtx);
/* /*
* Under certain conditions suggested by some regulatory bodies a * Under certain conditions suggested by some regulatory bodies a
...@@ -1573,12 +1563,16 @@ bool cfg80211_reg_can_beacon_relax(struct wiphy *wiphy, ...@@ -1573,12 +1563,16 @@ bool cfg80211_reg_can_beacon_relax(struct wiphy *wiphy,
* only if such relaxations are not enabled and the conditions are not * only if such relaxations are not enabled and the conditions are not
* met. * met.
*/ */
check_no_ir = !cfg80211_ir_permissive_chan(wiphy, iftype, if (cfg->relax) {
chandef->chan); lockdep_assert_held(&rdev->wiphy.mtx);
check_no_ir = !cfg80211_ir_permissive_chan(wiphy, cfg->iftype,
chandef->chan);
}
return _cfg80211_reg_can_beacon(wiphy, chandef, iftype, check_no_ir); return _cfg80211_reg_can_beacon(wiphy, chandef, cfg->iftype,
check_no_ir);
} }
EXPORT_SYMBOL(cfg80211_reg_can_beacon_relax); EXPORT_SYMBOL(cfg80211_reg_check_beaconing);
int cfg80211_set_monitor_channel(struct cfg80211_registered_device *rdev, int cfg80211_set_monitor_channel(struct cfg80211_registered_device *rdev,
struct cfg80211_chan_def *chandef) struct cfg80211_chan_def *chandef)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment