* [PATCH v2 1/5] cfg80211/mac80211: DFS setup chandef for cac event
@ 2013-11-05 13:48 Janusz Dziedzic
2013-11-05 13:48 ` [PATCH v2 2/5] mac80211: DFS setup chandef for radar_event correctly Janusz Dziedzic
` (4 more replies)
0 siblings, 5 replies; 12+ messages in thread
From: Janusz Dziedzic @ 2013-11-05 13:48 UTC (permalink / raw)
To: linux-wireless; +Cc: johannes, Janusz Dziedzic
To report channel width correctly we have
to send correct channel parameters from
mac80211 when calling cfg80211_cac_event().
This is required in case of using channel width
higher than 20MHz and we have to set correct
dfs channel state after CAC (NL80211_DFS_AVAILABLE).
Signed-off-by: Janusz Dziedzic <janusz.dziedzic@tieto.com>
Reviewed-by: Luis R. Rodriguez <mcgrof@do-not-panic.com>
---
include/net/cfg80211.h | 2 ++
net/mac80211/cfg.c | 5 ++++-
net/mac80211/iface.c | 5 ++++-
net/mac80211/mlme.c | 6 ++++--
net/mac80211/util.c | 3 +++
net/wireless/mlme.c | 8 +++-----
6 files changed, 20 insertions(+), 9 deletions(-)
diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h
index c1b8874..dc7de24 100644
--- a/include/net/cfg80211.h
+++ b/include/net/cfg80211.h
@@ -4145,6 +4145,7 @@ void cfg80211_radar_event(struct wiphy *wiphy,
/**
* cfg80211_cac_event - Channel availability check (CAC) event
* @netdev: network device
+ * @chandef: chandef for the current channel
* @event: type of event
* @gfp: context flags
*
@@ -4153,6 +4154,7 @@ void cfg80211_radar_event(struct wiphy *wiphy,
* also by full-MAC drivers.
*/
void cfg80211_cac_event(struct net_device *netdev,
+ struct cfg80211_chan_def *chandef,
enum nl80211_radar_event event, gfp_t gfp);
diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c
index ed1e9a8..fcdc357 100644
--- a/net/mac80211/cfg.c
+++ b/net/mac80211/cfg.c
@@ -1050,6 +1050,7 @@ static int ieee80211_stop_ap(struct wiphy *wiphy, struct net_device *dev)
struct ieee80211_local *local = sdata->local;
struct beacon_data *old_beacon;
struct probe_resp *old_probe_resp;
+ struct cfg80211_chan_def chandef;
old_beacon = rtnl_dereference(sdata->u.ap.beacon);
if (!old_beacon)
@@ -1091,8 +1092,10 @@ static int ieee80211_stop_ap(struct wiphy *wiphy, struct net_device *dev)
ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BEACON_ENABLED);
if (sdata->wdev.cac_started) {
+ chandef = sdata->vif.bss_conf.chandef;
cancel_delayed_work_sync(&sdata->dfs_cac_timer_work);
- cfg80211_cac_event(sdata->dev, NL80211_RADAR_CAC_ABORTED,
+ cfg80211_cac_event(sdata->dev, &chandef,
+ NL80211_RADAR_CAC_ABORTED,
GFP_KERNEL);
}
diff --git a/net/mac80211/iface.c b/net/mac80211/iface.c
index ff101ea..c9b0442 100644
--- a/net/mac80211/iface.c
+++ b/net/mac80211/iface.c
@@ -749,6 +749,7 @@ static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata,
u32 hw_reconf_flags = 0;
int i, flushed;
struct ps_data *ps;
+ struct cfg80211_chan_def chandef;
clear_bit(SDATA_STATE_RUNNING, &sdata->state);
@@ -823,11 +824,13 @@ static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata,
cancel_delayed_work_sync(&sdata->dfs_cac_timer_work);
if (sdata->wdev.cac_started) {
+ chandef = sdata->vif.bss_conf.chandef;
WARN_ON(local->suspended);
mutex_lock(&local->iflist_mtx);
ieee80211_vif_release_channel(sdata);
mutex_unlock(&local->iflist_mtx);
- cfg80211_cac_event(sdata->dev, NL80211_RADAR_CAC_ABORTED,
+ cfg80211_cac_event(sdata->dev, &chandef,
+ NL80211_RADAR_CAC_ABORTED,
GFP_KERNEL);
}
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c
index 1305ff9..e75c82c 100644
--- a/net/mac80211/mlme.c
+++ b/net/mac80211/mlme.c
@@ -1398,10 +1398,12 @@ void ieee80211_dfs_cac_timer_work(struct work_struct *work)
struct ieee80211_sub_if_data *sdata =
container_of(delayed_work, struct ieee80211_sub_if_data,
dfs_cac_timer_work);
+ struct cfg80211_chan_def chandef = sdata->vif.bss_conf.chandef;
ieee80211_vif_release_channel(sdata);
-
- cfg80211_cac_event(sdata->dev, NL80211_RADAR_CAC_FINISHED, GFP_KERNEL);
+ cfg80211_cac_event(sdata->dev, &chandef,
+ NL80211_RADAR_CAC_FINISHED,
+ GFP_KERNEL);
}
/* MLME */
diff --git a/net/mac80211/util.c b/net/mac80211/util.c
index a38d582..6110be9 100644
--- a/net/mac80211/util.c
+++ b/net/mac80211/util.c
@@ -2258,14 +2258,17 @@ u64 ieee80211_calculate_rx_timestamp(struct ieee80211_local *local,
void ieee80211_dfs_cac_cancel(struct ieee80211_local *local)
{
struct ieee80211_sub_if_data *sdata;
+ struct cfg80211_chan_def chandef;
mutex_lock(&local->iflist_mtx);
list_for_each_entry(sdata, &local->interfaces, list) {
cancel_delayed_work_sync(&sdata->dfs_cac_timer_work);
if (sdata->wdev.cac_started) {
+ chandef = sdata->vif.bss_conf.chandef;
ieee80211_vif_release_channel(sdata);
cfg80211_cac_event(sdata->dev,
+ &chandef,
NL80211_RADAR_CAC_ABORTED,
GFP_KERNEL);
}
diff --git a/net/wireless/mlme.c b/net/wireless/mlme.c
index 8d49c1c..b2276f5 100644
--- a/net/wireless/mlme.c
+++ b/net/wireless/mlme.c
@@ -761,12 +761,12 @@ void cfg80211_radar_event(struct wiphy *wiphy,
EXPORT_SYMBOL(cfg80211_radar_event);
void cfg80211_cac_event(struct net_device *netdev,
+ struct cfg80211_chan_def *chandef,
enum nl80211_radar_event event, gfp_t gfp)
{
struct wireless_dev *wdev = netdev->ieee80211_ptr;
struct wiphy *wiphy = wdev->wiphy;
struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
- struct cfg80211_chan_def chandef;
unsigned long timeout;
trace_cfg80211_cac_event(netdev, event);
@@ -777,14 +777,12 @@ void cfg80211_cac_event(struct net_device *netdev,
if (WARN_ON(!wdev->channel))
return;
- cfg80211_chandef_create(&chandef, wdev->channel, NL80211_CHAN_NO_HT);
-
switch (event) {
case NL80211_RADAR_CAC_FINISHED:
timeout = wdev->cac_start_time +
msecs_to_jiffies(IEEE80211_DFS_MIN_CAC_TIME_MS);
WARN_ON(!time_after_eq(jiffies, timeout));
- cfg80211_set_dfs_state(wiphy, &chandef, NL80211_DFS_AVAILABLE);
+ cfg80211_set_dfs_state(wiphy, chandef, NL80211_DFS_AVAILABLE);
break;
case NL80211_RADAR_CAC_ABORTED:
break;
@@ -794,6 +792,6 @@ void cfg80211_cac_event(struct net_device *netdev,
}
wdev->cac_started = false;
- nl80211_radar_notify(rdev, &chandef, event, netdev, gfp);
+ nl80211_radar_notify(rdev, chandef, event, netdev, gfp);
}
EXPORT_SYMBOL(cfg80211_cac_event);
--
1.7.9.5
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v2 2/5] mac80211: DFS setup chandef for radar_event correctly
2013-11-05 13:48 [PATCH v2 1/5] cfg80211/mac80211: DFS setup chandef for cac event Janusz Dziedzic
@ 2013-11-05 13:48 ` Janusz Dziedzic
2013-11-06 10:09 ` Johannes Berg
2013-11-05 13:48 ` [PATCH v2 3/5] cfg80211: add helper functions for start/end freq Janusz Dziedzic
` (3 subsequent siblings)
4 siblings, 1 reply; 12+ messages in thread
From: Janusz Dziedzic @ 2013-11-05 13:48 UTC (permalink / raw)
To: linux-wireless; +Cc: johannes, Janusz Dziedzic
Setup chandef for radar event correctly, before we
will clear this in ieee80211_dfs_cac_cancel() function.
Without this patch mac80211 will report wrong channel
width in case we will get radar event during active CAC.
Signed-off-by: Janusz Dziedzic <janusz.dziedzic@tieto.com>
Reviewed-by: Luis R. Rodriguez <mcgrof@do-not-panic.com>
---
net/mac80211/util.c | 6 ++----
1 file changed, 2 insertions(+), 4 deletions(-)
diff --git a/net/mac80211/util.c b/net/mac80211/util.c
index 6110be9..0571f49 100644
--- a/net/mac80211/util.c
+++ b/net/mac80211/util.c
@@ -2280,17 +2280,15 @@ void ieee80211_dfs_radar_detected_work(struct work_struct *work)
{
struct ieee80211_local *local =
container_of(work, struct ieee80211_local, radar_detected_work);
- struct cfg80211_chan_def chandef;
+ struct cfg80211_chan_def chandef = local->hw.conf.chandef;
ieee80211_dfs_cac_cancel(local);
if (local->use_chanctx)
/* currently not handled */
WARN_ON(1);
- else {
- chandef = local->hw.conf.chandef;
+ else
cfg80211_radar_event(local->hw.wiphy, &chandef, GFP_KERNEL);
- }
}
void ieee80211_radar_detected(struct ieee80211_hw *hw)
--
1.7.9.5
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v2 3/5] cfg80211: add helper functions for start/end freq
2013-11-05 13:48 [PATCH v2 1/5] cfg80211/mac80211: DFS setup chandef for cac event Janusz Dziedzic
2013-11-05 13:48 ` [PATCH v2 2/5] mac80211: DFS setup chandef for radar_event correctly Janusz Dziedzic
@ 2013-11-05 13:48 ` Janusz Dziedzic
2013-11-05 13:48 ` [PATCH v2 4/5] cfg80211: DFS check chandef usable before CAC Janusz Dziedzic
` (2 subsequent siblings)
4 siblings, 0 replies; 12+ messages in thread
From: Janusz Dziedzic @ 2013-11-05 13:48 UTC (permalink / raw)
To: linux-wireless; +Cc: johannes, Janusz Dziedzic
Add helper fuctions for start/end freq.
Signed-off-by: Janusz Dziedzic <janusz.dziedzic@tieto.com>
Reviewed-by: Luis R. Rodriguez <mcgrof@do-not-panic.com>
---
net/wireless/chan.c | 44 ++++++++++++++++++++++++++++++--------------
1 file changed, 30 insertions(+), 14 deletions(-)
diff --git a/net/wireless/chan.c b/net/wireless/chan.c
index 3449664..1d25a46 100644
--- a/net/wireless/chan.c
+++ b/net/wireless/chan.c
@@ -277,6 +277,32 @@ void cfg80211_set_dfs_state(struct wiphy *wiphy,
width, dfs_state);
}
+static u32 cfg80211_get_start_freq(u32 center_freq,
+ u32 bandwidth)
+{
+ u32 start_freq;
+
+ if (bandwidth <= 20)
+ start_freq = center_freq;
+ else
+ start_freq = center_freq - bandwidth/2 + 10;
+
+ return start_freq;
+}
+
+static u32 cfg80211_get_end_freq(u32 center_freq,
+ u32 bandwidth)
+{
+ u32 end_freq;
+
+ if (bandwidth <= 20)
+ end_freq = center_freq;
+ else
+ end_freq = center_freq + bandwidth/2 - 10;
+
+ return end_freq;
+}
+
static int cfg80211_get_chans_dfs_required(struct wiphy *wiphy,
u32 center_freq,
u32 bandwidth)
@@ -284,13 +310,8 @@ static int cfg80211_get_chans_dfs_required(struct wiphy *wiphy,
struct ieee80211_channel *c;
u32 freq, start_freq, end_freq;
- if (bandwidth <= 20) {
- start_freq = center_freq;
- end_freq = center_freq;
- } else {
- start_freq = center_freq - bandwidth/2 + 10;
- end_freq = center_freq + bandwidth/2 - 10;
- }
+ start_freq = cfg80211_get_start_freq(center_freq, bandwidth);
+ end_freq = cfg80211_get_end_freq(center_freq, bandwidth);
for (freq = start_freq; freq <= end_freq; freq += 20) {
c = ieee80211_get_channel(wiphy, freq);
@@ -337,13 +358,8 @@ static bool cfg80211_secondary_chans_ok(struct wiphy *wiphy,
struct ieee80211_channel *c;
u32 freq, start_freq, end_freq;
- if (bandwidth <= 20) {
- start_freq = center_freq;
- end_freq = center_freq;
- } else {
- start_freq = center_freq - bandwidth/2 + 10;
- end_freq = center_freq + bandwidth/2 - 10;
- }
+ start_freq = cfg80211_get_start_freq(center_freq, bandwidth);
+ end_freq = cfg80211_get_end_freq(center_freq, bandwidth);
for (freq = start_freq; freq <= end_freq; freq += 20) {
c = ieee80211_get_channel(wiphy, freq);
--
1.7.9.5
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v2 4/5] cfg80211: DFS check chandef usable before CAC
2013-11-05 13:48 [PATCH v2 1/5] cfg80211/mac80211: DFS setup chandef for cac event Janusz Dziedzic
2013-11-05 13:48 ` [PATCH v2 2/5] mac80211: DFS setup chandef for radar_event correctly Janusz Dziedzic
2013-11-05 13:48 ` [PATCH v2 3/5] cfg80211: add helper functions for start/end freq Janusz Dziedzic
@ 2013-11-05 13:48 ` Janusz Dziedzic
2013-11-06 10:12 ` Johannes Berg
2013-11-05 13:48 ` [PATCH v2 5/5] cfg80211: allow beaconing after DFS CAC Janusz Dziedzic
2013-11-06 10:09 ` [PATCH v2 1/5] cfg80211/mac80211: DFS setup chandef for cac event Johannes Berg
4 siblings, 1 reply; 12+ messages in thread
From: Janusz Dziedzic @ 2013-11-05 13:48 UTC (permalink / raw)
To: linux-wireless; +Cc: johannes, Janusz Dziedzic
Check chandef we get in CAC request is usable for CAC.
All channels have to be DFS channels. Allow DFS_USABLE
and DFS_AVAILABLE channels mix. At least one channel
has to be DFS_USABLE (require CAC).
Signed-off-by: Janusz Dziedzic <janusz.dziedzic@tieto.com>
Reviewed-by: Luis R. Rodriguez <mcgrof@do-not-panic.com>
---
net/wireless/chan.c | 74 ++++++++++++++++++++++++++++++++++++++++++++++++
net/wireless/core.h | 13 +++++++++
net/wireless/nl80211.c | 2 +-
3 files changed, 88 insertions(+), 1 deletion(-)
diff --git a/net/wireless/chan.c b/net/wireless/chan.c
index 1d25a46..96c9780 100644
--- a/net/wireless/chan.c
+++ b/net/wireless/chan.c
@@ -351,6 +351,80 @@ int cfg80211_chandef_dfs_required(struct wiphy *wiphy,
}
EXPORT_SYMBOL(cfg80211_chandef_dfs_required);
+static int cfg80211_get_chans_dfs_usable(struct wiphy *wiphy,
+ u32 center_freq,
+ u32 bandwidth)
+{
+ struct ieee80211_channel *c;
+ u32 freq, start_freq, end_freq;
+ int count = 0;
+
+ start_freq = cfg80211_get_start_freq(center_freq, bandwidth);
+ end_freq = cfg80211_get_end_freq(center_freq, bandwidth);
+
+ /*
+ * Check entire range of channels for the bandwidth.
+ * Check all channels are DFS channels (DFS_USABLE or
+ * DFS_AVAILABLE). Return number of usable channels
+ * (require CAC). Allow DFS and non-DFS channel mix.
+ */
+ for (freq = start_freq; freq <= end_freq; freq += 20) {
+ c = ieee80211_get_channel(wiphy, freq);
+ if (!c)
+ return -EINVAL;
+
+ if (c->flags & IEEE80211_CHAN_DISABLED)
+ return -EINVAL;
+
+ if (c->flags & IEEE80211_CHAN_RADAR) {
+ if (c->dfs_state == NL80211_DFS_UNAVAILABLE)
+ return -EINVAL;
+
+ if (c->dfs_state == NL80211_DFS_USABLE)
+ count++;
+ }
+ }
+
+ return count;
+}
+
+bool cfg80211_chandef_dfs_usable(struct wiphy *wiphy,
+ const struct cfg80211_chan_def *chandef)
+{
+ int width;
+ int r1, r2 = 0;
+
+ if (WARN_ON(!cfg80211_chandef_valid(chandef)))
+ return false;
+
+ width = cfg80211_chandef_get_width(chandef);
+ if (width < 0)
+ return false;
+
+ r1 = cfg80211_get_chans_dfs_usable(wiphy, chandef->center_freq1,
+ width);
+
+ if (r1 < 0)
+ return false;
+
+ switch (chandef->width) {
+ case NL80211_CHAN_WIDTH_80P80:
+ WARN_ON(!chandef->center_freq2);
+ r2 = cfg80211_get_chans_dfs_usable(wiphy,
+ chandef->center_freq2,
+ width);
+ if (r2 < 0)
+ return false;
+ break;
+ default:
+ WARN_ON(chandef->center_freq2);
+ break;
+ }
+
+ return (r1 + r2 > 0);
+}
+
+
static bool cfg80211_secondary_chans_ok(struct wiphy *wiphy,
u32 center_freq, u32 bandwidth,
u32 prohibited_flags)
diff --git a/net/wireless/core.h b/net/wireless/core.h
index b43efac..5390aeb 100644
--- a/net/wireless/core.h
+++ b/net/wireless/core.h
@@ -382,6 +382,19 @@ int cfg80211_can_use_iftype_chan(struct cfg80211_registered_device *rdev,
enum cfg80211_chan_mode chanmode,
u8 radar_detect);
+/**
+ * cfg80211_chandef_dfs_usable - checks if chandef is DFS usable
+ * @wiphy: the wiphy to validate against
+ * @chandef: the channel definition to check
+ *
+ * Checks if chandef is usable and we can/need start CAC on such channel.
+ *
+ * Return: Return true if all channels available and at least
+ * one channel require CAC (NL80211_DFS_USABLE)
+ */
+bool cfg80211_chandef_dfs_usable(struct wiphy *wiphy,
+ const struct cfg80211_chan_def *chandef);
+
void cfg80211_set_dfs_state(struct wiphy *wiphy,
const struct cfg80211_chan_def *chandef,
enum nl80211_dfs_state dfs_state);
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
index fdac22c..0a862f1 100644
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
@@ -5651,7 +5651,7 @@ static int nl80211_start_radar_detection(struct sk_buff *skb,
if (err == 0)
return -EINVAL;
- if (chandef.chan->dfs_state != NL80211_DFS_USABLE)
+ if (!cfg80211_chandef_dfs_usable(wdev->wiphy, &chandef))
return -EINVAL;
if (!rdev->ops->start_radar_detection)
--
1.7.9.5
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v2 5/5] cfg80211: allow beaconing after DFS CAC
2013-11-05 13:48 [PATCH v2 1/5] cfg80211/mac80211: DFS setup chandef for cac event Janusz Dziedzic
` (2 preceding siblings ...)
2013-11-05 13:48 ` [PATCH v2 4/5] cfg80211: DFS check chandef usable before CAC Janusz Dziedzic
@ 2013-11-05 13:48 ` Janusz Dziedzic
2013-11-06 10:11 ` Johannes Berg
2013-11-06 10:09 ` [PATCH v2 1/5] cfg80211/mac80211: DFS setup chandef for cac event Johannes Berg
4 siblings, 1 reply; 12+ messages in thread
From: Janusz Dziedzic @ 2013-11-05 13:48 UTC (permalink / raw)
To: linux-wireless; +Cc: johannes, Janusz Dziedzic
After going throught the Channel Availability Check (CAC)
required by DFS enable beaconing. Channels that have
gone through a CAC will be in the NL80211_DFS_AVAILABLE
state. Without this change APs don't start beaconing
after a successful CAC.
Change also cfg80211_secondary_chans_ok() where handle
prohibited_flags as prohibited.
Signed-off-by: Janusz Dziedzic <janusz.dziedzic@tieto.com>
---
net/wireless/chan.c | 85 ++++++++++++++++++++++++++++++++++++++++++++-------
1 file changed, 74 insertions(+), 11 deletions(-)
diff --git a/net/wireless/chan.c b/net/wireless/chan.c
index 96c9780..64f8d58 100644
--- a/net/wireless/chan.c
+++ b/net/wireless/chan.c
@@ -425,9 +425,9 @@ bool cfg80211_chandef_dfs_usable(struct wiphy *wiphy,
}
-static bool cfg80211_secondary_chans_ok(struct wiphy *wiphy,
- u32 center_freq, u32 bandwidth,
- u32 prohibited_flags)
+static bool cfg80211_get_chans_dfs_available(struct wiphy *wiphy,
+ u32 center_freq,
+ u32 bandwidth)
{
struct ieee80211_channel *c;
u32 freq, start_freq, end_freq;
@@ -435,18 +435,75 @@ static bool cfg80211_secondary_chans_ok(struct wiphy *wiphy,
start_freq = cfg80211_get_start_freq(center_freq, bandwidth);
end_freq = cfg80211_get_end_freq(center_freq, bandwidth);
+ /*
+ * Check entire range of channels for the bandwidth.
+ * If any channel in between is disabled or has not
+ * had gone through CAC return false
+ */
for (freq = start_freq; freq <= end_freq; freq += 20) {
c = ieee80211_get_channel(wiphy, freq);
if (!c)
return false;
- /* check for radar flags */
- if ((prohibited_flags & c->flags & IEEE80211_CHAN_RADAR) &&
+ if (c->flags & IEEE80211_CHAN_DISABLED)
+ return false;
+
+ if ((c->flags & IEEE80211_CHAN_RADAR) &&
(c->dfs_state != NL80211_DFS_AVAILABLE))
return false;
+ }
+
+ return true;
+}
+
+static bool cfg80211_chandef_dfs_available(struct wiphy *wiphy,
+ const struct cfg80211_chan_def *chandef)
+{
+ int width;
+ int r;
+
+ if (WARN_ON(!cfg80211_chandef_valid(chandef)))
+ return false;
+
+ width = cfg80211_chandef_get_width(chandef);
+ if (width < 0)
+ return false;
+
+ r = cfg80211_get_chans_dfs_available(wiphy, chandef->center_freq1,
+ width);
+
+ /* If any of channels unavailable for cf1 just return */
+ if (!r)
+ return r;
+
+ switch (chandef->width) {
+ case NL80211_CHAN_WIDTH_80P80:
+ WARN_ON(!chandef->center_freq2);
+ r = cfg80211_get_chans_dfs_available(wiphy,
+ chandef->center_freq2,
+ width);
+ default:
+ WARN_ON(chandef->center_freq2);
+ break;
+ }
+
+ return r;
+}
+
+
+static bool cfg80211_secondary_chans_ok(struct wiphy *wiphy,
+ u32 center_freq, u32 bandwidth,
+ u32 prohibited_flags)
+{
+ struct ieee80211_channel *c;
+ u32 freq, start_freq, end_freq;
- /* check for the other flags */
- if (c->flags & prohibited_flags & ~IEEE80211_CHAN_RADAR)
+ start_freq = cfg80211_get_start_freq(center_freq, bandwidth);
+ end_freq = cfg80211_get_end_freq(center_freq, bandwidth);
+
+ for (freq = start_freq; freq <= end_freq; freq += 20) {
+ c = ieee80211_get_channel(wiphy, freq);
+ if (!c || c->flags & prohibited_flags)
return false;
}
@@ -552,13 +609,19 @@ bool cfg80211_reg_can_beacon(struct wiphy *wiphy,
struct cfg80211_chan_def *chandef)
{
bool res;
+ u32 prohibited_flags = IEEE80211_CHAN_DISABLED |
+ IEEE80211_CHAN_NO_IR |
+ IEEE80211_CHAN_RADAR;
trace_cfg80211_reg_can_beacon(wiphy, chandef);
- res = cfg80211_chandef_usable(wiphy, chandef,
- IEEE80211_CHAN_DISABLED |
- IEEE80211_CHAN_NO_IR |
- IEEE80211_CHAN_RADAR);
+ if (cfg80211_chandef_dfs_required(wiphy, chandef) > 0 &&
+ cfg80211_chandef_dfs_available(wiphy, chandef)) {
+ /* We can skip IEEE80211_CHAN_NO_IR if chandef dfs available */
+ prohibited_flags = IEEE80211_CHAN_DISABLED;
+ }
+
+ res = cfg80211_chandef_usable(wiphy, chandef, prohibited_flags);
trace_cfg80211_return_bool(res);
return res;
--
1.7.9.5
^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCH v2 1/5] cfg80211/mac80211: DFS setup chandef for cac event
2013-11-05 13:48 [PATCH v2 1/5] cfg80211/mac80211: DFS setup chandef for cac event Janusz Dziedzic
` (3 preceding siblings ...)
2013-11-05 13:48 ` [PATCH v2 5/5] cfg80211: allow beaconing after DFS CAC Janusz Dziedzic
@ 2013-11-06 10:09 ` Johannes Berg
2013-11-06 12:10 ` Janusz Dziedzic
4 siblings, 1 reply; 12+ messages in thread
From: Johannes Berg @ 2013-11-06 10:09 UTC (permalink / raw)
To: Janusz Dziedzic; +Cc: linux-wireless
On Tue, 2013-11-05 at 14:48 +0100, Janusz Dziedzic wrote:
> void cfg80211_cac_event(struct net_device *netdev,
> + struct cfg80211_chan_def *chandef,
Jouni had a patch to make a lot of these pointers const - this one
probably should be as well.
johannes
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v2 2/5] mac80211: DFS setup chandef for radar_event correctly
2013-11-05 13:48 ` [PATCH v2 2/5] mac80211: DFS setup chandef for radar_event correctly Janusz Dziedzic
@ 2013-11-06 10:09 ` Johannes Berg
0 siblings, 0 replies; 12+ messages in thread
From: Johannes Berg @ 2013-11-06 10:09 UTC (permalink / raw)
To: Janusz Dziedzic; +Cc: linux-wireless
On Tue, 2013-11-05 at 14:48 +0100, Janusz Dziedzic wrote:
> Setup chandef for radar event correctly, before we
> will clear this in ieee80211_dfs_cac_cancel() function.
>
> Without this patch mac80211 will report wrong channel
> width in case we will get radar event during active CAC.
I'll apply this, but I note that a lot of the DFS stuff is really broken
in 3.12 (did 3.11 have any?) I think you should try to get a patch into
stable that disables DFS in ath9k.
johannes
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v2 5/5] cfg80211: allow beaconing after DFS CAC
2013-11-05 13:48 ` [PATCH v2 5/5] cfg80211: allow beaconing after DFS CAC Janusz Dziedzic
@ 2013-11-06 10:11 ` Johannes Berg
2013-11-06 12:08 ` Janusz Dziedzic
0 siblings, 1 reply; 12+ messages in thread
From: Johannes Berg @ 2013-11-06 10:11 UTC (permalink / raw)
To: Janusz Dziedzic; +Cc: linux-wireless
On Tue, 2013-11-05 at 14:48 +0100, Janusz Dziedzic wrote:
> After going throught the Channel Availability Check (CAC)
> required by DFS enable beaconing. Channels that have
> gone through a CAC will be in the NL80211_DFS_AVAILABLE
> state. Without this change APs don't start beaconing
> after a successful CAC.
> Change also cfg80211_secondary_chans_ok() where handle
> prohibited_flags as prohibited.
I can't really understand this commit message - can you please rephrase
it?
johannes
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v2 4/5] cfg80211: DFS check chandef usable before CAC
2013-11-05 13:48 ` [PATCH v2 4/5] cfg80211: DFS check chandef usable before CAC Janusz Dziedzic
@ 2013-11-06 10:12 ` Johannes Berg
0 siblings, 0 replies; 12+ messages in thread
From: Johannes Berg @ 2013-11-06 10:12 UTC (permalink / raw)
To: Janusz Dziedzic; +Cc: linux-wireless
On Tue, 2013-11-05 at 14:48 +0100, Janusz Dziedzic wrote:
> Check chandef we get in CAC request is usable for CAC.
> All channels have to be DFS channels. Allow DFS_USABLE
> and DFS_AVAILABLE channels mix. At least one channel
> has to be DFS_USABLE (require CAC).
Applied 3 and 4 too, to mac80211-next.
johannes
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v2 5/5] cfg80211: allow beaconing after DFS CAC
2013-11-06 10:11 ` Johannes Berg
@ 2013-11-06 12:08 ` Janusz Dziedzic
0 siblings, 0 replies; 12+ messages in thread
From: Janusz Dziedzic @ 2013-11-06 12:08 UTC (permalink / raw)
To: Johannes Berg; +Cc: linux-wireless
On 6 November 2013 11:11, Johannes Berg <johannes@sipsolutions.net> wrote:
> On Tue, 2013-11-05 at 14:48 +0100, Janusz Dziedzic wrote:
>> After going throught the Channel Availability Check (CAC)
>> required by DFS enable beaconing. Channels that have
>> gone through a CAC will be in the NL80211_DFS_AVAILABLE
>> state. Without this change APs don't start beaconing
>> after a successful CAC.
>> Change also cfg80211_secondary_chans_ok() where handle
>> prohibited_flags as prohibited.
>
> I can't really understand this commit message - can you please rephrase
> it?
>
Allow beaconing after we pass Channel Availability Check (CAC).
Allow non-DFS and DFS channels mix. All DFS channels have to
be in NL80211_DFS_AVAILABLE state (have to pass CAC).
BR
Janusz
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v2 1/5] cfg80211/mac80211: DFS setup chandef for cac event
2013-11-06 10:09 ` [PATCH v2 1/5] cfg80211/mac80211: DFS setup chandef for cac event Johannes Berg
@ 2013-11-06 12:10 ` Janusz Dziedzic
2013-11-06 12:20 ` Johannes Berg
0 siblings, 1 reply; 12+ messages in thread
From: Janusz Dziedzic @ 2013-11-06 12:10 UTC (permalink / raw)
To: Johannes Berg; +Cc: linux-wireless
On 6 November 2013 11:09, Johannes Berg <johannes@sipsolutions.net> wrote:
> On Tue, 2013-11-05 at 14:48 +0100, Janusz Dziedzic wrote:
>
>> void cfg80211_cac_event(struct net_device *netdev,
>> + struct cfg80211_chan_def *chandef,
>
> Jouni had a patch to make a lot of these pointers const - this one
> probably should be as well.
>
Yes.
I can send this one after Jouni patch will be merged.
BR
Janusz
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v2 1/5] cfg80211/mac80211: DFS setup chandef for cac event
2013-11-06 12:10 ` Janusz Dziedzic
@ 2013-11-06 12:20 ` Johannes Berg
0 siblings, 0 replies; 12+ messages in thread
From: Johannes Berg @ 2013-11-06 12:20 UTC (permalink / raw)
To: Janusz Dziedzic; +Cc: linux-wireless
On Wed, 2013-11-06 at 13:10 +0100, Janusz Dziedzic wrote:
> On 6 November 2013 11:09, Johannes Berg <johannes@sipsolutions.net> wrote:
> > On Tue, 2013-11-05 at 14:48 +0100, Janusz Dziedzic wrote:
> >
> >> void cfg80211_cac_event(struct net_device *netdev,
> >> + struct cfg80211_chan_def *chandef,
> >
> > Jouni had a patch to make a lot of these pointers const - this one
> > probably should be as well.
> >
>
> Yes.
> I can send this one after Jouni patch will be merged.
Well I don't think he even sent it yet, so you could just send this one
with const?
johannes
^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2013-11-06 12:20 UTC | newest]
Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-11-05 13:48 [PATCH v2 1/5] cfg80211/mac80211: DFS setup chandef for cac event Janusz Dziedzic
2013-11-05 13:48 ` [PATCH v2 2/5] mac80211: DFS setup chandef for radar_event correctly Janusz Dziedzic
2013-11-06 10:09 ` Johannes Berg
2013-11-05 13:48 ` [PATCH v2 3/5] cfg80211: add helper functions for start/end freq Janusz Dziedzic
2013-11-05 13:48 ` [PATCH v2 4/5] cfg80211: DFS check chandef usable before CAC Janusz Dziedzic
2013-11-06 10:12 ` Johannes Berg
2013-11-05 13:48 ` [PATCH v2 5/5] cfg80211: allow beaconing after DFS CAC Janusz Dziedzic
2013-11-06 10:11 ` Johannes Berg
2013-11-06 12:08 ` Janusz Dziedzic
2013-11-06 10:09 ` [PATCH v2 1/5] cfg80211/mac80211: DFS setup chandef for cac event Johannes Berg
2013-11-06 12:10 ` Janusz Dziedzic
2013-11-06 12:20 ` Johannes Berg
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).