linux-wireless.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 1/3] cfg80211: DFS check dfs_region before CAC
@ 2013-11-12 13:05 Janusz Dziedzic
  2013-11-12 13:05 ` [PATCH v2 2/3] cfg80211/mac80211: DFS pass CAC time as a parameter Janusz Dziedzic
                   ` (2 more replies)
  0 siblings, 3 replies; 5+ messages in thread
From: Janusz Dziedzic @ 2013-11-12 13:05 UTC (permalink / raw)
  To: linux-wireless; +Cc: johannes, mcgrof, Janusz Dziedzic

Before we will start radar detection check
if we have correct DFS region. Fail in case
we don't know DFS region (don't know CAC/NOP
timing and how to configure DFS pattern detector).

Signed-off-by: Janusz Dziedzic <janusz.dziedzic@tieto.com>
---
 net/wireless/nl80211.c |    5 +++++
 net/wireless/reg.c     |   16 ++++++++++++++++
 net/wireless/reg.h     |    1 +
 3 files changed, 22 insertions(+)

diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
index 3f8c364..4669644 100644
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
@@ -5631,8 +5631,13 @@ static int nl80211_start_radar_detection(struct sk_buff *skb,
 	struct net_device *dev = info->user_ptr[1];
 	struct wireless_dev *wdev = dev->ieee80211_ptr;
 	struct cfg80211_chan_def chandef;
+	enum nl80211_dfs_regions dfs_region;
 	int err;
 
+	dfs_region = reg_get_dfs_region(wdev->wiphy);
+	if (dfs_region == NL80211_DFS_UNSET)
+		return -EINVAL;
+
 	err = nl80211_parse_chandef(rdev, info, &chandef);
 	if (err)
 		return err;
diff --git a/net/wireless/reg.c b/net/wireless/reg.c
index a75c5ed..bba81c7 100644
--- a/net/wireless/reg.c
+++ b/net/wireless/reg.c
@@ -2129,6 +2129,22 @@ bool reg_supported_dfs_region(u8 dfs_region)
 	}
 }
 
+enum nl80211_dfs_regions reg_get_dfs_region(struct wiphy *wiphy)
+{
+	const struct ieee80211_regdomain *regdom = NULL;
+
+	ASSERT_RTNL();
+
+	if (wiphy)
+		regdom = get_wiphy_regdom(wiphy);
+	if (!regdom)
+		regdom = get_cfg80211_regdom();
+	if (!regdom)
+		return NL80211_DFS_UNSET;
+
+	return regdom->dfs_region;
+}
+
 static void print_dfs_region(u8 dfs_region)
 {
 	if (!dfs_region)
diff --git a/net/wireless/reg.h b/net/wireless/reg.h
index b4076ba..f8c8a49 100644
--- a/net/wireless/reg.h
+++ b/net/wireless/reg.h
@@ -21,6 +21,7 @@ extern const struct ieee80211_regdomain __rcu *cfg80211_regdomain;
 bool reg_is_valid_request(const char *alpha2);
 bool is_world_regdom(const char *alpha2);
 bool reg_supported_dfs_region(u8 dfs_region);
+enum nl80211_dfs_regions reg_get_dfs_region(struct wiphy *wiphy);
 
 int regulatory_hint_user(const char *alpha2,
 			 enum nl80211_user_reg_hint_type user_reg_hint_type);
-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH v2 2/3] cfg80211/mac80211: DFS pass CAC time as a parameter
  2013-11-12 13:05 [PATCH v2 1/3] cfg80211: DFS check dfs_region before CAC Janusz Dziedzic
@ 2013-11-12 13:05 ` Janusz Dziedzic
  2013-11-12 13:05 ` [PATCH v2 3/3] cfg80211: DFS use 10 minutes CAC when weather channels Janusz Dziedzic
  2013-11-12 23:41 ` [PATCH v2 1/3] cfg80211: DFS check dfs_region before CAC Luis R. Rodriguez
  2 siblings, 0 replies; 5+ messages in thread
From: Janusz Dziedzic @ 2013-11-12 13:05 UTC (permalink / raw)
  To: linux-wireless; +Cc: johannes, mcgrof, Janusz Dziedzic

Send Channel Availability Check time as a parameter
of start_radar_detection() callback.
We could have different CAC time configuration for
Off-channel CAC and for weather channels.

Signed-off-by: Janusz Dziedzic <janusz.dziedzic@tieto.com>
---
 include/net/cfg80211.h |    3 ++-
 net/mac80211/cfg.c     |    8 ++++----
 net/wireless/nl80211.c |    3 ++-
 3 files changed, 8 insertions(+), 6 deletions(-)

diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h
index 968f2ad..d43fa0a 100644
--- a/include/net/cfg80211.h
+++ b/include/net/cfg80211.h
@@ -2412,7 +2412,8 @@ struct cfg80211_ops {
 
 	int	(*start_radar_detection)(struct wiphy *wiphy,
 					 struct net_device *dev,
-					 struct cfg80211_chan_def *chandef);
+					 struct cfg80211_chan_def *chandef,
+					 u32 cac_time_ms);
 	int	(*update_ft_ies)(struct wiphy *wiphy, struct net_device *dev,
 				 struct cfg80211_update_ft_ies_params *ftie);
 	int	(*crit_proto_start)(struct wiphy *wiphy,
diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c
index 30cbeaf..637127e 100644
--- a/net/mac80211/cfg.c
+++ b/net/mac80211/cfg.c
@@ -2893,11 +2893,11 @@ static int ieee80211_cancel_remain_on_channel(struct wiphy *wiphy,
 
 static int ieee80211_start_radar_detection(struct wiphy *wiphy,
 					   struct net_device *dev,
-					   struct cfg80211_chan_def *chandef)
+					   struct cfg80211_chan_def *chandef,
+					   u32 cac_time_ms)
 {
 	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
 	struct ieee80211_local *local = sdata->local;
-	unsigned long timeout;
 	int err;
 
 	if (!list_empty(&local->roc_list) || local->scanning)
@@ -2915,9 +2915,9 @@ static int ieee80211_start_radar_detection(struct wiphy *wiphy,
 	if (err)
 		return err;
 
-	timeout = msecs_to_jiffies(IEEE80211_DFS_MIN_CAC_TIME_MS);
 	ieee80211_queue_delayed_work(&sdata->local->hw,
-				     &sdata->dfs_cac_timer_work, timeout);
+				     &sdata->dfs_cac_timer_work,
+				     msecs_to_jiffies(cac_time_ms));
 
 	return 0;
 }
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
index 4669644..59d7522 100644
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
@@ -5667,7 +5667,8 @@ static int nl80211_start_radar_detection(struct sk_buff *skb,
 	if (err)
 		return err;
 
-	err = rdev->ops->start_radar_detection(&rdev->wiphy, dev, &chandef);
+	err = rdev->ops->start_radar_detection(&rdev->wiphy, dev, &chandef,
+					       IEEE80211_DFS_MIN_CAC_TIME_MS);
 	if (!err) {
 		wdev->channel = chandef.chan;
 		wdev->cac_started = true;
-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH v2 3/3] cfg80211: DFS use 10 minutes CAC when weather channels
  2013-11-12 13:05 [PATCH v2 1/3] cfg80211: DFS check dfs_region before CAC Janusz Dziedzic
  2013-11-12 13:05 ` [PATCH v2 2/3] cfg80211/mac80211: DFS pass CAC time as a parameter Janusz Dziedzic
@ 2013-11-12 13:05 ` Janusz Dziedzic
  2013-11-12 23:41 ` [PATCH v2 1/3] cfg80211: DFS check dfs_region before CAC Luis R. Rodriguez
  2 siblings, 0 replies; 5+ messages in thread
From: Janusz Dziedzic @ 2013-11-12 13:05 UTC (permalink / raw)
  To: linux-wireless; +Cc: johannes, mcgrof, Janusz Dziedzic

When nominal bandwidth falls completely or partly
within the band 5600MHz to 5650MHz the CAC time shall
be 10 minutes.
This is ETSI requirement. FCC forbids weather channels usage.

Signed-off-by: Janusz Dziedzic <janusz.dziedzic@tieto.com>
---
 include/net/cfg80211.h |    5 ++-
 net/wireless/chan.c    |   79 ++++++++++++++++++++++++++++++++++++++++++++++++
 net/wireless/core.h    |    4 +++
 net/wireless/nl80211.c |    6 +++-
 4 files changed, 92 insertions(+), 2 deletions(-)

diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h
index d43fa0a..c40847e 100644
--- a/include/net/cfg80211.h
+++ b/include/net/cfg80211.h
@@ -125,9 +125,12 @@ enum ieee80211_channel_flags {
 #define IEEE80211_CHAN_NO_HT40 \
 	(IEEE80211_CHAN_NO_HT40PLUS | IEEE80211_CHAN_NO_HT40MINUS)
 
-#define IEEE80211_DFS_MIN_CAC_TIME_MS		60000
+#define IEEE80211_DFS_MIN_CAC_TIME_MS		(60 * 1000)
 #define IEEE80211_DFS_MIN_NOP_TIME_MS		(30 * 60 * 1000)
 
+/* ETSI EN 301 893 V1.7.0 - Table D.1 */
+#define IEEE80211_DFS_WEATHER_MIN_CAC_TIME_MS	(10 * 60 * 1000)
+
 /**
  * struct ieee80211_channel - channel definition
  *
diff --git a/net/wireless/chan.c b/net/wireless/chan.c
index 78559b5..057edde 100644
--- a/net/wireless/chan.c
+++ b/net/wireless/chan.c
@@ -490,6 +490,85 @@ static bool cfg80211_chandef_dfs_available(struct wiphy *wiphy,
 	return r;
 }
 
+static int cfg80211_get_chans_dfs_is_weather(struct wiphy *wiphy,
+					     u32 center_freq,
+					     u32 bandwidth)
+{
+	u32 start_freq, end_freq;
+
+	start_freq = cfg80211_get_start_freq(center_freq, bandwidth) - 10;
+	end_freq = cfg80211_get_end_freq(center_freq, bandwidth) + 10;
+
+	/*
+	 * ETSI EN 301 893 V1.7.0 Table D.1
+	 * TODO In the future we can get this from regdb eg. channel flag
+	 * IEEE80211_CHAN_TDWR.
+	 */
+	if ((start_freq >= 5600 && start_freq < 5650) ||
+	    (end_freq > 5600 && end_freq <= 5650))
+		return 1;
+
+	return 0;
+}
+
+static int
+cfg80211_chandef_dfs_is_weather(struct wiphy *wiphy,
+				const struct cfg80211_chan_def *chandef)
+{
+	int width;
+	int r;
+
+	if (WARN_ON(!cfg80211_chandef_valid(chandef)))
+		return -EINVAL;
+
+	width = cfg80211_chandef_get_width(chandef);
+	if (width < 0)
+		return -EINVAL;
+
+	r = cfg80211_get_chans_dfs_is_weather(wiphy,
+					      chandef->center_freq1,
+					      width);
+
+	if (r)
+		return r;
+
+	switch (chandef->width) {
+	case NL80211_CHAN_WIDTH_80P80:
+		WARN_ON(!chandef->center_freq2);
+		r = cfg80211_get_chans_dfs_is_weather(wiphy,
+						      chandef->center_freq2,
+						      width);
+	default:
+		WARN_ON(chandef->center_freq2);
+		break;
+	}
+
+	return r;
+}
+
+unsigned int
+cfg80211_chandef_dfs_cac_time(struct wiphy *wiphy,
+			      const struct cfg80211_chan_def *chandef,
+			      enum nl80211_dfs_regions dfs_region)
+{
+	unsigned int timeout_ms = IEEE80211_DFS_MIN_CAC_TIME_MS;
+
+	switch (dfs_region) {
+	case NL80211_DFS_ETSI:
+		if (cfg80211_chandef_dfs_is_weather(wiphy, chandef))
+			timeout_ms = IEEE80211_DFS_WEATHER_MIN_CAC_TIME_MS;
+		break;
+	/* TODO check JP CAC time */
+	case NL80211_DFS_JP:
+		break;
+	/* FCC don't allow weather channels */
+	case NL80211_DFS_FCC:
+	default:
+		break;
+	}
+
+	return timeout_ms;
+}
 
 static bool cfg80211_secondary_chans_ok(struct wiphy *wiphy,
 					u32 center_freq, u32 bandwidth,
diff --git a/net/wireless/core.h b/net/wireless/core.h
index 5390aeb..f497ea1 100644
--- a/net/wireless/core.h
+++ b/net/wireless/core.h
@@ -401,6 +401,10 @@ void cfg80211_set_dfs_state(struct wiphy *wiphy,
 
 void cfg80211_dfs_channels_update_work(struct work_struct *work);
 
+unsigned int
+cfg80211_chandef_dfs_cac_time(struct wiphy *wiphy,
+			      const struct cfg80211_chan_def *chandef,
+			      enum nl80211_dfs_regions dfs_region);
 
 static inline int
 cfg80211_can_change_interface(struct cfg80211_registered_device *rdev,
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
index 59d7522..313502d 100644
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
@@ -5632,6 +5632,7 @@ static int nl80211_start_radar_detection(struct sk_buff *skb,
 	struct wireless_dev *wdev = dev->ieee80211_ptr;
 	struct cfg80211_chan_def chandef;
 	enum nl80211_dfs_regions dfs_region;
+	unsigned int cac_time_ms;
 	int err;
 
 	dfs_region = reg_get_dfs_region(wdev->wiphy);
@@ -5667,8 +5668,11 @@ static int nl80211_start_radar_detection(struct sk_buff *skb,
 	if (err)
 		return err;
 
+	cac_time_ms = cfg80211_chandef_dfs_cac_time(&rdev->wiphy, &chandef,
+						    dfs_region);
+
 	err = rdev->ops->start_radar_detection(&rdev->wiphy, dev, &chandef,
-					       IEEE80211_DFS_MIN_CAC_TIME_MS);
+					       cac_time_ms);
 	if (!err) {
 		wdev->channel = chandef.chan;
 		wdev->cac_started = true;
-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH v2 1/3] cfg80211: DFS check dfs_region before CAC
  2013-11-12 13:05 [PATCH v2 1/3] cfg80211: DFS check dfs_region before CAC Janusz Dziedzic
  2013-11-12 13:05 ` [PATCH v2 2/3] cfg80211/mac80211: DFS pass CAC time as a parameter Janusz Dziedzic
  2013-11-12 13:05 ` [PATCH v2 3/3] cfg80211: DFS use 10 minutes CAC when weather channels Janusz Dziedzic
@ 2013-11-12 23:41 ` Luis R. Rodriguez
  2013-11-13  9:49   ` Luis R. Rodriguez
  2 siblings, 1 reply; 5+ messages in thread
From: Luis R. Rodriguez @ 2013-11-12 23:41 UTC (permalink / raw)
  To: Janusz Dziedzic; +Cc: linux-wireless, Johannes Martin Berg

On Tue, Nov 12, 2013 at 2:05 PM, Janusz Dziedzic
<janusz.dziedzic@tieto.com> wrote:
> Before we will start radar detection check
> if we have correct DFS region. Fail in case
> we don't know DFS region (don't know CAC/NOP
> timing and how to configure DFS pattern detector).
>
> Signed-off-by: Janusz Dziedzic <janusz.dziedzic@tieto.com>

This doesn't address the complexity cases of intersection. From review
today with a few folks this should simply then set DFS as unset (as
you patches don't allow DFS then) if there is any intersection with
DFS regions. That is, intersection doesn't use dfs_regions yet, add
that and if we do an intersection with two regdoms with different
regodms or at least one unknown we can't IR on DFS. We can only DFS
when all regulatory hints agree on the DFS region. Make that happen.

  Luis

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH v2 1/3] cfg80211: DFS check dfs_region before CAC
  2013-11-12 23:41 ` [PATCH v2 1/3] cfg80211: DFS check dfs_region before CAC Luis R. Rodriguez
@ 2013-11-13  9:49   ` Luis R. Rodriguez
  0 siblings, 0 replies; 5+ messages in thread
From: Luis R. Rodriguez @ 2013-11-13  9:49 UTC (permalink / raw)
  To: Janusz Dziedzic; +Cc: linux-wireless, Johannes Martin Berg

On Wed, Nov 13, 2013 at 12:41 AM, Luis R. Rodriguez
<mcgrof@do-not-panic.com> wrote:
> This doesn't address the complexity cases of intersection. From review
> today with a few folks this should simply then set DFS as unset (as
> you patches don't allow DFS then) if there is any intersection with
> DFS regions. That is, intersection doesn't use dfs_regions yet, add
> that and if we do an intersection with two regdoms with different
> regodms or at least one unknown we can't IR on DFS. We can only DFS
> when all regulatory hints agree on the DFS region. Make that happen.

I'll just go ahead and add some patches for this today.

 Luis

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2013-11-13  9:49 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-11-12 13:05 [PATCH v2 1/3] cfg80211: DFS check dfs_region before CAC Janusz Dziedzic
2013-11-12 13:05 ` [PATCH v2 2/3] cfg80211/mac80211: DFS pass CAC time as a parameter Janusz Dziedzic
2013-11-12 13:05 ` [PATCH v2 3/3] cfg80211: DFS use 10 minutes CAC when weather channels Janusz Dziedzic
2013-11-12 23:41 ` [PATCH v2 1/3] cfg80211: DFS check dfs_region before CAC Luis R. Rodriguez
2013-11-13  9:49   ` Luis R. Rodriguez

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).