Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 31 Jan 2012 00:03:49 +0000 (UTC)
From:      Adrian Chadd <adrian@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r230793 - in head/sys: conf net80211
Message-ID:  <201201310003.q0V03nXG008570@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: adrian
Date: Tue Jan 31 00:03:49 2012
New Revision: 230793
URL: http://svn.freebsd.org/changeset/base/230793

Log:
  Add a DFS debugging mode which is useful when doing automated DFS
  compliance testing.
  
  In order to allow for radar pattern matching to occur, the DFS CAC/NOL
  handling needs to be made configurable.  This commit introduces a new
  sysctl, "net.wlan.dfs_debug", which controls which DFS debug mode
  net80211 is in.
  
  * 0 = default, CSA/NOL handling as per normal.
  * 1 = announce a CSA, but don't add the channel to the non-occupy list
    (NOL.)
  * 2 = disable both CSA and NOL - only print that a radar event occured.
  
  This code is not compiled/enabled by default as it breaks regulatory
  handling.  A user must enable IEEE80211_DFS_DEBUG in their kernel
  configuration file for this option to become available.
  
  Obtained from:	Atheros

Modified:
  head/sys/conf/options
  head/sys/net80211/ieee80211_dfs.c
  head/sys/net80211/ieee80211_dfs.h

Modified: head/sys/conf/options
==============================================================================
--- head/sys/conf/options	Mon Jan 30 23:37:17 2012	(r230792)
+++ head/sys/conf/options	Tue Jan 31 00:03:49 2012	(r230793)
@@ -845,6 +845,7 @@ IEEE80211_SUPPORT_MESH	opt_wlan.h
 IEEE80211_SUPPORT_SUPERG	opt_wlan.h
 IEEE80211_SUPPORT_TDMA	opt_wlan.h
 IEEE80211_ALQ		opt_wlan.h
+IEEE80211_DFS_DEBUG	opt_wlan.h
 
 # 802.11 TDMA support
 TDMA_SLOTLEN_DEFAULT	opt_tdma.h

Modified: head/sys/net80211/ieee80211_dfs.c
==============================================================================
--- head/sys/net80211/ieee80211_dfs.c	Mon Jan 30 23:37:17 2012	(r230792)
+++ head/sys/net80211/ieee80211_dfs.c	Tue Jan 31 00:03:49 2012	(r230793)
@@ -64,6 +64,28 @@ SYSCTL_INT(_net_wlan, OID_AUTO, cac_time
 	&ieee80211_cac_timeout, 0, "CAC timeout (secs)");
 #define	CAC_TIMEOUT	msecs_to_ticks(ieee80211_cac_timeout*1000)
 
+/*
+ DFS* In order to facilitate  debugging, a couple of operating
+ * modes aside from the default are needed.
+ *
+ * 0 - default CAC/NOL behaviour - ie, start CAC, place
+ *     channel on NOL list.
+ * 1 - send CAC, but don't change channel or add the channel
+ *     to the NOL list.
+ * 2 - just match on radar, don't send CAC or place channel in
+ *     the NOL list.
+ */
+static	int ieee80211_dfs_debug = DFS_DBG_NONE;
+
+/*
+ * This option must not be included in the default kernel
+ * as it allows users to plainly disable CAC/NOL handling.
+ */
+#ifdef	IEEE80211_DFS_DEBUG
+SYSCTL_INT(_net_wlan, OID_AUTO, dfs_debug, CTLFLAG_RW,
+	&ieee80211_dfs_debug, 0, "DFS debug behaviour");
+#endif
+
 static int
 null_set_quiet(struct ieee80211_node *ni, u_int8_t *quiet_elm)
 {
@@ -278,24 +300,44 @@ ieee80211_dfs_notify_radar(struct ieee80
 	IEEE80211_LOCK_ASSERT(ic);
 
 	/*
-	 * Mark all entries with this frequency.  Notify user
-	 * space and arrange for notification when the radar
-	 * indication is cleared.  Then kick the NOL processing
-	 * thread if not already running.
+	 * If doing DFS debugging (mode 2), don't bother
+	 * running the rest of this function.
+	 *
+	 * Simply announce the presence of the radar and continue
+	 * along merrily.
 	 */
-	now = ticks;
-	for (i = 0; i < ic->ic_nchans; i++) {
-		struct ieee80211_channel *c = &ic->ic_channels[i];
-		if (c->ic_freq == chan->ic_freq) {
-			c->ic_state &= ~IEEE80211_CHANSTATE_CACDONE;
-			c->ic_state |= IEEE80211_CHANSTATE_RADAR;
-			dfs->nol_event[i] = now;
+	if (ieee80211_dfs_debug == DFS_DBG_NOCSANOL) {
+		announce_radar(ic->ic_ifp, chan, chan);
+		ieee80211_notify_radar(ic, chan);
+		return;
+	}
+
+	/*
+	 * Don't mark the channel and don't put it into NOL
+	 * if we're doing DFS debugging.
+	 */
+	if (ieee80211_dfs_debug == DFS_DBG_NONE) {
+		/*
+		 * Mark all entries with this frequency.  Notify user
+		 * space and arrange for notification when the radar
+		 * indication is cleared.  Then kick the NOL processing
+		 * thread if not already running.
+		 */
+		now = ticks;
+		for (i = 0; i < ic->ic_nchans; i++) {
+			struct ieee80211_channel *c = &ic->ic_channels[i];
+			if (c->ic_freq == chan->ic_freq) {
+				c->ic_state &= ~IEEE80211_CHANSTATE_CACDONE;
+				c->ic_state |= IEEE80211_CHANSTATE_RADAR;
+				dfs->nol_event[i] = now;
+			}
 		}
+		ieee80211_notify_radar(ic, chan);
+		chan->ic_state |= IEEE80211_CHANSTATE_NORADAR;
+		if (!callout_pending(&dfs->nol_timer))
+			callout_reset(&dfs->nol_timer, NOL_TIMEOUT,
+			    dfs_timeout, ic);
 	}
-	ieee80211_notify_radar(ic, chan);
-	chan->ic_state |= IEEE80211_CHANSTATE_NORADAR;
-	if (!callout_pending(&dfs->nol_timer))
-		callout_reset(&dfs->nol_timer, NOL_TIMEOUT, dfs_timeout, ic);
 
 	/*
 	 * If radar is detected on the bss channel while
@@ -310,7 +352,15 @@ ieee80211_dfs_notify_radar(struct ieee80
 	 */
 	if (chan == ic->ic_bsschan) {
 		/* XXX need a way to defer to user app */
-		dfs->newchan = ieee80211_dfs_pickchannel(ic);
+
+		/*
+		 * Don't flip over to a new channel if
+		 * we are currently doing DFS debugging.
+		 */
+		if (ieee80211_dfs_debug == DFS_DBG_NONE)
+			dfs->newchan = ieee80211_dfs_pickchannel(ic);
+		else
+			dfs->newchan = chan;
 
 		announce_radar(ic->ic_ifp, chan, dfs->newchan);
 

Modified: head/sys/net80211/ieee80211_dfs.h
==============================================================================
--- head/sys/net80211/ieee80211_dfs.h	Mon Jan 30 23:37:17 2012	(r230792)
+++ head/sys/net80211/ieee80211_dfs.h	Tue Jan 31 00:03:49 2012	(r230793)
@@ -31,6 +31,12 @@
  * 802.11h/DFS definitions.
  */
 
+typedef enum {
+	DFS_DBG_NONE		= 0,
+	DFS_DBG_NONOL		= 1,
+	DFS_DBG_NOCSANOL	= 2
+} dfs_debug_t;
+
 struct ieee80211_dfs_state {
 	int		nol_event[IEEE80211_CHAN_MAX];
 	struct callout	nol_timer;		/* NOL list processing */



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201201310003.q0V03nXG008570>