Re: [PATCH 1/3] cfg80211: Make pre-CAC results valid only for ETSI domain

2017-02-27 Thread Thiagarajan, Vasanthakumar
On Monday 27 February 2017 08:08 PM, Johannes Berg wrote:
> On Mon, 2017-02-20 at 16:09 +0530, Vasanthakumar Thiagarajan wrote:
>> DFS requirement for ETSI domain (section 4.7.1.4 in
>> ETSI EN 301 893 V1.8.1) is the only one which explicitly
>> states that once DFS channel is marked as available afer
>> the CAC, this channel will remain in available state even
>> moving to a different operating channel. But the same is
>> not explicitly stated in FCC DFS requirement. Also, Pre-CAC
>> requriements are not explicitly mentioned in FCC requirement.
>> Current implementation in keeping DFS channel in available
>> state is same as described in ETSI domain.
>>
>> For ETSI DFS domain, this patch gives a grace period of 2 seconds
>
> You mean non-ETSI, right?

Correct, I meant non-ETSI.

>
> Just making sure I understood correctly - no need to resend, I can fix
> that.

Thanks for pointing it out and fixing.

Vasanth


Re: [PATCH 1/3] cfg80211: Make pre-CAC results valid only for ETSI domain

2017-02-27 Thread Johannes Berg
On Mon, 2017-02-20 at 16:09 +0530, Vasanthakumar Thiagarajan wrote:
> DFS requirement for ETSI domain (section 4.7.1.4 in
> ETSI EN 301 893 V1.8.1) is the only one which explicitly
> states that once DFS channel is marked as available afer
> the CAC, this channel will remain in available state even
> moving to a different operating channel. But the same is
> not explicitly stated in FCC DFS requirement. Also, Pre-CAC
> requriements are not explicitly mentioned in FCC requirement.
> Current implementation in keeping DFS channel in available
> state is same as described in ETSI domain.
> 
> For ETSI DFS domain, this patch gives a grace period of 2 seconds

You mean non-ETSI, right?

Just making sure I understood correctly - no need to resend, I can fix
that.

johannes



[PATCH 1/3] cfg80211: Make pre-CAC results valid only for ETSI domain

2017-02-20 Thread Vasanthakumar Thiagarajan
DFS requirement for ETSI domain (section 4.7.1.4 in
ETSI EN 301 893 V1.8.1) is the only one which explicitly
states that once DFS channel is marked as available afer
the CAC, this channel will remain in available state even
moving to a different operating channel. But the same is
not explicitly stated in FCC DFS requirement. Also, Pre-CAC
requriements are not explicitly mentioned in FCC requirement.
Current implementation in keeping DFS channel in available
state is same as described in ETSI domain.

For ETSI DFS domain, this patch gives a grace period of 2 seconds
since the completion of successful CAC before moving the channel's
DFS state to 'usable' from 'available' state. The same grace period
is checked against the channel's dfs_state_entered timestamp while
deciding if a DFS channel is available for operation. There is a new
radar event, NL80211_RADAR_PRE_CAC_EXPIRED, reported when DFS channel
is moved from available to usable state after the grace period. Also
make sure the DFS channel state is reset to usable once the beaconing
operation on that channel is brought down (like stop_ap, leave_ibss
and leave_mesh) in non-ETSI domain.

Signed-off-by: Vasanthakumar Thiagarajan 
---
 include/uapi/linux/nl80211.h |   5 +++
 net/wireless/ap.c|   5 +++
 net/wireless/chan.c  | 101 +++
 net/wireless/core.h  |  10 +
 net/wireless/ibss.c  |   1 +
 net/wireless/mesh.c  |   1 +
 net/wireless/mlme.c  |  40 +
 net/wireless/reg.c   |  28 
 net/wireless/reg.h   |  14 ++
 9 files changed, 196 insertions(+), 9 deletions(-)

diff --git a/include/uapi/linux/nl80211.h b/include/uapi/linux/nl80211.h
index 9a499b1..cd4dfef 100644
--- a/include/uapi/linux/nl80211.h
+++ b/include/uapi/linux/nl80211.h
@@ -4913,12 +4913,17 @@ enum nl80211_smps_mode {
  * change to the channel status.
  * @NL80211_RADAR_NOP_FINISHED: The Non-Occupancy Period for this channel is
  * over, channel becomes usable.
+ * @NL80211_RADAR_PRE_CAC_EXPIRED: Channel Availability Check done on this
+ * non-operating channel is expired and no longer valid. New CAC must
+ * be done on this channel before starting the operation. This is not
+ * applicable for ETSI dfs domain where pre-CAC is valid for ever.
  */
 enum nl80211_radar_event {
NL80211_RADAR_DETECTED,
NL80211_RADAR_CAC_FINISHED,
NL80211_RADAR_CAC_ABORTED,
NL80211_RADAR_NOP_FINISHED,
+   NL80211_RADAR_PRE_CAC_EXPIRED,
 };
 
 /**
diff --git a/net/wireless/ap.c b/net/wireless/ap.c
index bdad1f9..25666d3 100644
--- a/net/wireless/ap.c
+++ b/net/wireless/ap.c
@@ -32,6 +32,11 @@ int __cfg80211_stop_ap(struct cfg80211_registered_device 
*rdev,
rdev_set_qos_map(rdev, dev, NULL);
if (notify)
nl80211_send_ap_stopped(wdev);
+
+   /* Should we apply the grace period during beaconing interface
+* shutdown also?
+*/
+   cfg80211_sched_dfs_chan_update(rdev);
}
 
return err;
diff --git a/net/wireless/chan.c b/net/wireless/chan.c
index 5497d022..099f13c 100644
--- a/net/wireless/chan.c
+++ b/net/wireless/chan.c
@@ -456,6 +456,107 @@ bool cfg80211_chandef_dfs_usable(struct wiphy *wiphy,
return (r1 + r2 > 0);
 }
 
+/*
+ * Checks if center frequency of chan falls with in the bandwidth
+ * range of chandef.
+ */
+bool cfg80211_is_sub_chan(struct cfg80211_chan_def *chandef,
+ struct ieee80211_channel *chan)
+{
+   int width;
+   u32 cf_offset, freq;
+
+   if (chandef->chan->center_freq == chan->center_freq)
+   return true;
+
+   width = cfg80211_chandef_get_width(chandef);
+   if (width <= 20)
+   return false;
+
+   cf_offset = width / 2 - 10;
+
+   for (freq = chandef->center_freq1 - width / 2 + 10;
+freq <= chandef->center_freq1 + width / 2 - 10; freq += 20) {
+   if (chan->center_freq == freq)
+   return true;
+   }
+
+   if (!chandef->center_freq2)
+   return false;
+
+   for (freq = chandef->center_freq2 - width / 2 + 10;
+freq <= chandef->center_freq2 + width / 2 - 10; freq += 20) {
+   if (chan->center_freq == freq)
+   return true;
+   }
+
+   return false;
+}
+
+bool cfg80211_beaconing_iface_active(struct wireless_dev *wdev)
+{
+   bool active = false;
+
+   ASSERT_WDEV_LOCK(wdev);
+
+   if (!wdev->chandef.chan)
+   return false;
+
+   switch (wdev->iftype) {
+   case NL80211_IFTYPE_AP:
+   case NL80211_IFTYPE_P2P_GO:
+   active = wdev->beacon_interval != 0;
+   break;
+   case NL80211_IFTYPE_ADHOC:
+   active = wdev->ssid_len != 0;
+   break;
+   case