All of lore.kernel.org
 help / color / mirror / Atom feed
From: Bernhard Schmidt <bernhard.schmidt@saxnet.de>
To: linux-wireless <linux-wireless@vger.kernel.org>
Cc: <lrodriguez@atheros.com>, <nbd@openwrt.org>,
	<dubowoj@neratec.com>, <zefir.kurtisi@neratec.com>,
	<simon.wunderlich@saxnet.de>
Subject: [PATCH 3/5] mac80211: add NOL functionality
Date: Mon, 17 Jan 2011 11:05:30 +0100	[thread overview]
Message-ID: <20110117161133.792EB2082@mx.techwires.net> (raw)
In-Reply-To: <201101171621.29863.bernhard.schmidt@saxnet.de>

NOL is a list of channels on which radar interference has been detected.
Such channels are not allowed to be used for a certain amount of time.
---
 include/net/mac80211.h |    8 +++++
 net/mac80211/radar.c   |   74 ++++++++++++++++++++++++++++++++++++++++++++++++
 net/mac80211/radar.h   |    9 ++++++
 3 files changed, 91 insertions(+), 0 deletions(-)

diff --git a/include/net/mac80211.h b/include/net/mac80211.h
index b158be5..4ebc080 100644
--- a/include/net/mac80211.h
+++ b/include/net/mac80211.h
@@ -2773,6 +2773,14 @@ void ieee80211_remain_on_channel_expired(struct ieee80211_hw *hw);
 void ieee80211_radar_update_params(struct ieee80211_hw *hw,
 				   const struct ieee80211_regdomain *regd);
 
+/**
+ * ieee80211_radar_interference - report interference on a channel
+ * @hw: pointer as obtained from ieee80211_alloc_hw()
+ * @channel: the channel on which the event occurred
+ */
+int ieee80211_radar_interference(struct ieee80211_hw *hw,
+				 struct ieee80211_channel *chan);
+
 /* Rate control API */
 
 /**
diff --git a/net/mac80211/radar.c b/net/mac80211/radar.c
index 9f41dd7..e90b8bf 100644
--- a/net/mac80211/radar.c
+++ b/net/mac80211/radar.c
@@ -15,6 +15,67 @@
 #include "driver-ops.h"
 #include "radar.h"
 
+static void nol_timer(unsigned long data)
+{
+	struct ieee80211_local *local = (void *) data;
+	struct ieee80211_radar *radar = &local->radar;
+	struct ieee80211_radar_nol_list *nol, *tmp;
+
+	list_for_each_entry_safe(nol, tmp, &radar->nol_list, list) {
+		if (time_is_before_jiffies(nol->timeout)) {
+			struct ieee80211_channel *chan = nol->chan;
+
+			printk(KERN_INFO "remove NOL chan %d\n",
+			       chan->center_freq);
+
+			mutex_lock(&radar->mtx);
+			chan->flags &= ~IEEE80211_CHAN_RADAR_INTERFERENCE;
+			list_del(&nol->list);
+			mutex_unlock(&radar->mtx);
+			kfree(nol);
+		}
+	}
+
+	mod_timer(&radar->nol_timer, jiffies + msecs_to_jiffies(1000));
+}
+
+int ieee80211_radar_interference(struct ieee80211_hw *hw,
+				 struct ieee80211_channel *chan)
+{
+	struct ieee80211_local *local = hw_to_local(hw);
+	struct ieee80211_radar *radar = &local->radar;
+	struct ieee80211_radar_nol_list *nol, *tmp;
+
+	list_for_each_entry_safe(nol, tmp, &radar->nol_list, list) {
+		if (nol->chan == chan) {
+			mutex_lock(&radar->mtx);
+			list_del(&nol->list);
+			mutex_unlock(&radar->mtx);
+			kfree(nol);
+			break;
+		}
+	}
+
+	nol = kmalloc(sizeof(struct ieee80211_radar_nol_list), GFP_KERNEL);
+	if (nol == NULL)
+		return -ENOMEM;
+
+	nol->chan = chan;
+	nol->timeout = jiffies +
+		msecs_to_jiffies(radar->params->nol_period * 1000);
+
+	printk(KERN_INFO "add NOL chan %d\n", chan->center_freq);
+
+	mutex_lock(&radar->mtx);
+	chan->flags &= ~IEEE80211_CHAN_RADAR_CLEAR;
+	chan->flags |= IEEE80211_CHAN_RADAR_INTERFERENCE;
+	list_add_tail(&nol->list, &radar->nol_list);
+	mutex_unlock(&radar->mtx);
+
+	return 0;
+}
+EXPORT_SYMBOL(ieee80211_radar_interference);
+
 int ieee80211_radar_detection_enable(struct ieee80211_local *local,
 				     struct ieee80211_channel *chan)
 {
@@ -74,11 +135,24 @@ void ieee80211_radar_init(struct ieee80211_local *local)
 	radar->params = &regdomain_params[0];
 
 	mutex_init(&radar->mtx);
+
+	INIT_LIST_HEAD(&radar->nol_list);
+	setup_timer(&radar->nol_timer, nol_timer, (unsigned long)local);
+	mod_timer(&radar->nol_timer, jiffies + msecs_to_jiffies(1000));
 }
 
 void ieee80211_radar_deinit(struct ieee80211_local *local)
 {
 	struct ieee80211_radar *radar = &local->radar;
+	struct ieee80211_radar_nol_list *nol, *tmp;
+
+	del_timer_sync(&radar->nol_timer);
+	mutex_lock(&radar->mtx);
+	list_for_each_entry_safe(nol, tmp, &radar->nol_list, list) {
+		list_del(&nol->list);
+		kfree(nol);
+	}
+	mutex_unlock(&radar->mtx);
 
 	mutex_destroy(&radar->mtx);
 }
diff --git a/net/mac80211/radar.h b/net/mac80211/radar.h
index 6536e28..79684b5 100644
--- a/net/mac80211/radar.h
+++ b/net/mac80211/radar.h
@@ -21,9 +21,18 @@ struct ieee80211_radar_parameters {
 	int nol_period;
 };
 
+struct ieee80211_radar_nol_list {
+	struct ieee80211_channel *chan;
+	unsigned long timeout;
+	struct list_head list;
+};
+
 struct ieee80211_radar {
 	struct mutex mtx;
 	struct ieee80211_radar_parameters *params;
+
+	struct timer_list nol_timer;
+	struct list_head nol_list;
 };
 
 int ieee80211_radar_detection_enable(struct ieee80211_local *local,
-- 
1.5.6.5


  parent reply	other threads:[~2011-01-17 16:20 UTC|newest]

Thread overview: 33+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-01-17 15:21 [RFC 0/13] DFS/radar state/userspace handling Bernhard Schmidt
2011-01-17  8:31 ` [PATCH 1/5] mac80211: add DFS related channel flags Bernhard Schmidt
2011-01-18 10:40   ` Johannes Berg
2011-01-18 11:59     ` Bernhard Schmidt
2011-01-18 12:16       ` Johannes Berg
2011-01-18 12:27         ` Bernhard Schmidt
2011-01-18 14:29           ` Zefir Kurtisi
2011-01-18 10:40   ` Johannes Berg
2011-01-17  9:16 ` [PATCH 2/5] mac80211: initialize radar params + add driver API Bernhard Schmidt
2011-01-18 10:43   ` Johannes Berg
2011-01-18 12:00     ` Bernhard Schmidt
2011-01-18 10:44   ` Johannes Berg
2011-01-17 10:05 ` Bernhard Schmidt [this message]
2011-01-18 10:43   ` [PATCH 3/5] mac80211: add NOL functionality Johannes Berg
2011-01-18 12:01     ` Bernhard Schmidt
2011-01-18 12:13       ` Johannes Berg
2011-01-18 12:28         ` Bernhard Schmidt
2011-01-17 10:24 ` [PATCH 4/5] mac80211: add primarily CAC support Bernhard Schmidt
2011-01-18 10:45   ` Johannes Berg
2011-01-18 12:01     ` Bernhard Schmidt
2011-01-18 12:12       ` Johannes Berg
2011-01-18 12:28         ` Bernhard Schmidt
2011-01-18 10:48   ` Johannes Berg
2011-01-18 12:00     ` Bernhard Schmidt
2011-01-17 11:49 ` [PATCH 5/5] cfg80211: userspace commands/notifications Bernhard Schmidt
2011-01-17 12:55 ` [PATCH 1/8] hostap: make hostapd_parse_rates generic Bernhard Schmidt
2011-01-17 12:56 ` [PATCH 2/8] hostap: add channel_list config parameter Bernhard Schmidt
2011-01-17 13:00 ` [PATCH 3/8] hostapd: select random channel of the list Bernhard Schmidt
2011-01-17 13:07 ` [PATCH 4/8] hostap: sync nl80211_copy.h Bernhard Schmidt
2011-01-17 13:14 ` [PATCH 5/8] hostap: pull in additional chan flags Bernhard Schmidt
2011-01-17 13:23 ` [PATCH 6/8] hostap: request CAC before using a radar channel Bernhard Schmidt
2011-01-17 13:26 ` [PATCH 7/8] hostap: handle interference on current channel Bernhard Schmidt
2011-01-17 13:27 ` [PATCH 8/8] hostap: do not disable radar channels Bernhard Schmidt

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20110117161133.792EB2082@mx.techwires.net \
    --to=bernhard.schmidt@saxnet.de \
    --cc=dubowoj@neratec.com \
    --cc=linux-wireless@vger.kernel.org \
    --cc=lrodriguez@atheros.com \
    --cc=nbd@openwrt.org \
    --cc=simon.wunderlich@saxnet.de \
    --cc=zefir.kurtisi@neratec.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.