From bea10c649a353f725dde8bc4ca001f7392ba16e3 Mon Sep 17 00:00:00 2001
From: Arnaud Lacombe <[email protected]>
Date: Thu, 27 May 2010 01:23:43 -0400
Subject: [PATCH 5/6] net80211: non-intrusive headers upgrade

From FreeBSD as of $AFEWDAYSAGO.
---
sys/net80211/_ieee80211.h          |  302 +++++++++++++++++++++++++++++-------
sys/net80211/ieee80211.c           |    6 +-
sys/net80211/ieee80211_regdomain.h |  282 +++++++++++++++++++++++++++++++++
3 files changed, 534 insertions(+), 56 deletions(-)
create mode 100644 sys/net80211/ieee80211_regdomain.h

diff --git a/sys/net80211/_ieee80211.h b/sys/net80211/_ieee80211.h
index d80a5d2..80e40fb 100644
--- a/sys/net80211/_ieee80211.h
+++ b/sys/net80211/_ieee80211.h
@@ -1,6 +1,6 @@
/*-
 * Copyright (c) 2001 Atsushi Onoe
- * Copyright (c) 2002-2005 Sam Leffler, Errno Consulting
+ * Copyright (c) 2002-2008 Sam Leffler, Errno Consulting
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
@@ -11,12 +11,6 @@
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- *    derived from this software without specific prior written permission.
- *
- * Alternatively, this software may be distributed under the terms of the
- * GNU General Public License ("GPL") version 2 as published by the Free
- * Software Foundation.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
@@ -29,20 +23,38 @@
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
- * $FreeBSD: src/sys/net80211/_ieee80211.h,v 1.3 2005/08/10 17:42:13 sam Exp $
+ * $FreeBSD$
 */
#ifndef _NET80211__IEEE80211_H_
#define _NET80211__IEEE80211_H_

+/*
+ * 802.11 implementation definitions.
+ *
+ * NB: this file is used by applications.
+ */
+
+/*
+ * PHY type; mostly used to identify FH phys.
+ */
enum ieee80211_phytype {
       IEEE80211_T_DS,                 /* direct sequence spread spectrum */
       IEEE80211_T_FH,                 /* frequency hopping */
       IEEE80211_T_OFDM,               /* frequency division multiplexing */
-       IEEE80211_T_TURBO               /* high rate OFDM, aka turbo mode */
+       IEEE80211_T_TURBO,              /* high rate OFDM, aka turbo mode */
+       IEEE80211_T_HT,                 /* high throughput */
+       IEEE80211_T_OFDM_HALF,          /* 1/2 rate OFDM */
+       IEEE80211_T_OFDM_QUARTER,       /* 1/4 rate OFDM */
};
#define        IEEE80211_T_CCK IEEE80211_T_DS  /* more common nomenclature */

-/* XXX not really a mode; there are really multiple PHY's */
+/*
+ * PHY mode; this is not really a mode as multi-mode devices
+ * have multiple PHY's.  Mode is mostly used as a shorthand
+ * for constraining which channels to consider in setting up
+ * operation.  Modes used to be used more extensively when
+ * channels were identified as IEEE channel numbers.
+ */
enum ieee80211_phymode {
       IEEE80211_MODE_AUTO     = 0,    /* autoselect */
       IEEE80211_MODE_11A      = 1,    /* 5GHz, OFDM */
@@ -50,29 +62,60 @@ enum ieee80211_phymode {
       IEEE80211_MODE_11G      = 3,    /* 2GHz, OFDM */
       IEEE80211_MODE_FH       = 4,    /* 2GHz, GFSK */
       IEEE80211_MODE_TURBO_A  = 5,    /* 5GHz, OFDM, 2x clock */
-       IEEE80211_MODE_TURBO_G  = 6     /* 2GHz, OFDM, 2x clock */
+       IEEE80211_MODE_TURBO_G  = 6,    /* 2GHz, OFDM, 2x clock */
+#ifdef notyet
+       IEEE80211_MODE_STURBO_A = 7,    /* 5GHz, OFDM, 2x clock, static */
+       IEEE80211_MODE_11NA     = 8,    /* 5GHz, w/ HT */
+       IEEE80211_MODE_11NG     = 9,    /* 2GHz, w/ HT */
+       IEEE80211_MODE_HALF     = 10,   /* OFDM, 1/2x clock */
+       IEEE80211_MODE_QUARTER  = 11,   /* OFDM, 1/4x clock */
+#endif
};
-#define        IEEE80211_MODE_MAX      ((int)IEEE80211_MODE_TURBO_G + 1)
+#ifdef notyet
+#define        IEEE80211_MODE_MAX      (IEEE80211_MODE_QUARTER+1)
+#else
+#define        IEEE80211_MODE_MAX      (IEEE80211_MODE_TURBO_G+1)
+#endif

+/*
+ * Operating mode.  Devices do not necessarily support
+ * all modes; they indicate which are supported in their
+ * capabilities.
+ */
enum ieee80211_opmode {
-       IEEE80211_M_STA         = 1,    /* infrastructure station */
       IEEE80211_M_IBSS        = 0,    /* IBSS (adhoc) station */
+       IEEE80211_M_STA         = 1,    /* infrastructure station */
+#ifdef notyet
+       IEEE80211_M_WDS         = 2,    /* WDS link */
+#endif
       IEEE80211_M_AHDEMO      = 3,    /* Old lucent compatible adhoc demo */
-       IEEE80211_M_HOSTAP      = 6,    /* Software Access Point */
-       IEEE80211_M_MONITOR     = 8     /* Monitor mode */
+       IEEE80211_M_HOSTAP      = 4,    /* Software Access Point */
+       IEEE80211_M_MONITOR     = 5,    /* Monitor mode */
+#ifdef notyet
+       IEEE80211_M_MBSS        = 6,    /* MBSS (Mesh Point) link */
+#endif
};
+#ifdef notyet
+#define        IEEE80211_OPMODE_MAX    (IEEE80211_M_MBSS+1)
+#else
+#define        IEEE80211_OPMODE_MAX    (IEEE80211_M_MONITOR+1)
+#endif

/*
- * 802.11g protection mode.
+ * 802.11g/802.11n protection mode.
 */
enum ieee80211_protmode {
       IEEE80211_PROT_NONE     = 0,    /* no protection */
       IEEE80211_PROT_CTSONLY  = 1,    /* CTS to self */
-       IEEE80211_PROT_RTSCTS   = 2     /* RTS-CTS */
+       IEEE80211_PROT_RTSCTS   = 2,    /* RTS-CTS */
};

/*
- * Authentication mode.
+ * Authentication mode.  The open and shared key authentication
+ * modes are implemented within the 802.11 layer.  802.1x and
+ * WPA/802.11i are implemented in user mode by setting the
+ * 802.11 layer into IEEE80211_AUTH_8021X and deferring
+ * authentication to user space programs.
 */
enum ieee80211_authmode {
       IEEE80211_AUTH_NONE     = 0,
@@ -81,7 +124,7 @@ enum ieee80211_authmode {
       IEEE80211_AUTH_8021X    = 3,            /* 802.1x */
       IEEE80211_AUTH_AUTO     = 4,            /* auto-select/accept */
       /* NB: these are used only for ioctls */
-       IEEE80211_AUTH_WPA      = 5             /* WPA/RSN w/ 802.1x/PSK */
+       IEEE80211_AUTH_WPA      = 5,            /* WPA/RSN w/ 802.1x/PSK */
};

/*
@@ -96,36 +139,65 @@ enum ieee80211_authmode {
enum ieee80211_roamingmode {
       IEEE80211_ROAMING_DEVICE= 0,    /* driver/hardware control */
       IEEE80211_ROAMING_AUTO  = 1,    /* 802.11 layer control */
-       IEEE80211_ROAMING_MANUAL= 2     /* application control */
+       IEEE80211_ROAMING_MANUAL= 2,    /* application control */
};

/*
 * Channels are specified by frequency and attributes.
 */
struct ieee80211_channel {
-       u_int16_t       ic_freq;        /* setting in MHz */
-       u_int16_t       ic_flags;       /* see below */
+       uint32_t        ic_flags;       /* see below */
+       uint16_t        ic_freq;        /* setting in Mhz */
+       uint8_t         ic_ieee;        /* IEEE channel number */
+       int8_t          ic_maxregpower; /* maximum regulatory tx power in dBm */
+       int8_t          ic_maxpower;    /* maximum tx power in .5 dBm */
+       int8_t          ic_minpower;    /* minimum tx power in .5 dBm */
+       uint8_t         ic_state;       /* dynamic state */
+       uint8_t         ic_extieee;     /* HT40 extension channel number */
+       int8_t          ic_maxantgain;  /* maximum antenna gain in .5 dBm */
+       uint8_t         ic_pad;
+       uint16_t        ic_devdata;     /* opaque device/driver data */
};

-#define        IEEE80211_CHAN_MAX      255
+#define        IEEE80211_CHAN_MAX      256
#define        IEEE80211_CHAN_BYTES    32      /* howmany(IEEE80211_CHAN_MAX, NBBY) */
#define        IEEE80211_CHAN_ANY      0xffff  /* token for ``any channel'' */
#define        IEEE80211_CHAN_ANYC \
-       ((struct ieee80211_channel *) 0x1)
+       ((struct ieee80211_channel *) IEEE80211_CHAN_ANY)

-/* bits 0-3 are for private use by drivers */
/* channel attributes */
-#define        IEEE80211_CHAN_TURBO    0x0010  /* Turbo channel */
-#define        IEEE80211_CHAN_CCK      0x0020  /* CCK channel */
-#define        IEEE80211_CHAN_OFDM     0x0040  /* OFDM channel */
-#define        IEEE80211_CHAN_2GHZ     0x0080  /* 2 GHz spectrum channel. */
-#define        IEEE80211_CHAN_5GHZ     0x0100  /* 5 GHz spectrum channel */
-#define        IEEE80211_CHAN_PASSIVE  0x0200  /* Only passive scan allowed */
-#define        IEEE80211_CHAN_DYN      0x0400  /* Dynamic CCK-OFDM channel */
-#define        IEEE80211_CHAN_GFSK     0x0800  /* GFSK channel (FHSS PHY) */
-#define        IEEE80211_CHAN_GSM      0x1000  /* 900 MHz spectrum channel */
-#define        IEEE80211_CHAN_HALF     0x4000  /* Half rate channel */
-#define        IEEE80211_CHAN_QUARTER  0x8000  /* Quarter rate channel */
+#define        IEEE80211_CHAN_PRIV0    0x00000001 /* driver private bit 0 */
+#define        IEEE80211_CHAN_PRIV1    0x00000002 /* driver private bit 1 */
+#define        IEEE80211_CHAN_PRIV2    0x00000004 /* driver private bit 2 */
+#define        IEEE80211_CHAN_PRIV3    0x00000008 /* driver private bit 3 */
+#define        IEEE80211_CHAN_TURBO    0x00000010 /* Turbo channel */
+#define        IEEE80211_CHAN_CCK      0x00000020 /* CCK channel */
+#define        IEEE80211_CHAN_OFDM     0x00000040 /* OFDM channel */
+#define        IEEE80211_CHAN_2GHZ     0x00000080 /* 2 GHz spectrum channel. */
+#define        IEEE80211_CHAN_5GHZ     0x00000100 /* 5 GHz spectrum channel */
+#define        IEEE80211_CHAN_PASSIVE  0x00000200 /* Only passive scan allowed */
+#define        IEEE80211_CHAN_DYN      0x00000400 /* Dynamic CCK-OFDM channel */
+#define        IEEE80211_CHAN_GFSK     0x00000800 /* GFSK channel (FHSS PHY) */
+#define        IEEE80211_CHAN_GSM      0x00001000 /* 900 MHz spectrum channel */
+#define        IEEE80211_CHAN_STURBO   0x00002000 /* 11a static turbo channel only */
+#define        IEEE80211_CHAN_HALF     0x00004000 /* Half rate channel */
+#define        IEEE80211_CHAN_QUARTER  0x00008000 /* Quarter rate channel */
+#define        IEEE80211_CHAN_HT20     0x00010000 /* HT 20 channel */
+#define        IEEE80211_CHAN_HT40U    0x00020000 /* HT 40 channel w/ ext above */
+#define        IEEE80211_CHAN_HT40D    0x00040000 /* HT 40 channel w/ ext below */
+#define        IEEE80211_CHAN_DFS      0x00080000 /* DFS required */
+#define        IEEE80211_CHAN_4MSXMIT  0x00100000 /* 4ms limit on frame length */
+#define        IEEE80211_CHAN_NOADHOC  0x00200000 /* adhoc mode not allowed */
+#define        IEEE80211_CHAN_NOHOSTAP 0x00400000 /* hostap mode not allowed */
+#define        IEEE80211_CHAN_11D      0x00800000 /* 802.11d required */
+
+#define        IEEE80211_CHAN_HT40     (IEEE80211_CHAN_HT40U | IEEE80211_CHAN_HT40D)
+#define        IEEE80211_CHAN_HT       (IEEE80211_CHAN_HT20 | IEEE80211_CHAN_HT40)
+
+#define        IEEE80211_CHAN_BITS \
+       "\20\1PRIV0\2PRIV2\3PRIV3\4PRIV4\5TURBO\6CCK\7OFDM\0102GHZ\0115GHZ" \
+       "\12PASSIVE\13DYN\14GFSK\15GSM\16STURBO\17HALF\20QUARTER\21HT20" \
+       "\22HT40U\23HT40D\24DFS\0254MSXMIT\26NOADHOC\27NOHOSTAP\03011D"

/*
 * Useful combinations of channel characteristics.
@@ -140,16 +212,20 @@ struct ieee80211_channel {
       (IEEE80211_CHAN_2GHZ | IEEE80211_CHAN_OFDM)
#define        IEEE80211_CHAN_G \
       (IEEE80211_CHAN_2GHZ | IEEE80211_CHAN_DYN)
-#define        IEEE80211_CHAN_T \
-       (IEEE80211_CHAN_5GHZ | IEEE80211_CHAN_OFDM | IEEE80211_CHAN_TURBO)
+#define IEEE80211_CHAN_108A \
+       (IEEE80211_CHAN_A | IEEE80211_CHAN_TURBO)
#define        IEEE80211_CHAN_108G \
-       (IEEE80211_CHAN_2GHZ | IEEE80211_CHAN_OFDM | IEEE80211_CHAN_TURBO)
+       (IEEE80211_CHAN_PUREG | IEEE80211_CHAN_TURBO)
+#define        IEEE80211_CHAN_ST \
+       (IEEE80211_CHAN_108A | IEEE80211_CHAN_STURBO)

#define        IEEE80211_CHAN_ALL \
       (IEEE80211_CHAN_2GHZ | IEEE80211_CHAN_5GHZ | IEEE80211_CHAN_GFSK | \
-        IEEE80211_CHAN_CCK | IEEE80211_CHAN_OFDM | IEEE80211_CHAN_DYN)
+        IEEE80211_CHAN_CCK | IEEE80211_CHAN_OFDM | IEEE80211_CHAN_DYN | \
+        IEEE80211_CHAN_HALF | IEEE80211_CHAN_QUARTER | \
+        IEEE80211_CHAN_HT)
#define        IEEE80211_CHAN_ALLTURBO \
-       (IEEE80211_CHAN_ALL | IEEE80211_CHAN_TURBO)
+       (IEEE80211_CHAN_ALL | IEEE80211_CHAN_TURBO | IEEE80211_CHAN_STURBO)

#define        IEEE80211_IS_CHAN_FHSS(_c) \
       (((_c)->ic_flags & IEEE80211_CHAN_FHSS) == IEEE80211_CHAN_FHSS)
@@ -163,8 +239,10 @@ struct ieee80211_channel {
       (((_c)->ic_flags & IEEE80211_CHAN_G) == IEEE80211_CHAN_G)
#define        IEEE80211_IS_CHAN_ANYG(_c) \
       (IEEE80211_IS_CHAN_PUREG(_c) || IEEE80211_IS_CHAN_G(_c))
-#define        IEEE80211_IS_CHAN_T(_c) \
-       (((_c)->ic_flags & IEEE80211_CHAN_T) == IEEE80211_CHAN_T)
+#define        IEEE80211_IS_CHAN_ST(_c) \
+       (((_c)->ic_flags & IEEE80211_CHAN_ST) == IEEE80211_CHAN_ST)
+#define        IEEE80211_IS_CHAN_108A(_c) \
+       (((_c)->ic_flags & IEEE80211_CHAN_108A) == IEEE80211_CHAN_108A)
#define        IEEE80211_IS_CHAN_108G(_c) \
       (((_c)->ic_flags & IEEE80211_CHAN_108G) == IEEE80211_CHAN_108G)

@@ -172,12 +250,21 @@ struct ieee80211_channel {
       (((_c)->ic_flags & IEEE80211_CHAN_2GHZ) != 0)
#define        IEEE80211_IS_CHAN_5GHZ(_c) \
       (((_c)->ic_flags & IEEE80211_CHAN_5GHZ) != 0)
+#define        IEEE80211_IS_CHAN_PASSIVE(_c) \
+       (((_c)->ic_flags & IEEE80211_CHAN_PASSIVE) != 0)
#define        IEEE80211_IS_CHAN_OFDM(_c) \
-       (((_c)->ic_flags & IEEE80211_CHAN_OFDM) != 0)
+       (((_c)->ic_flags & (IEEE80211_CHAN_OFDM | IEEE80211_CHAN_DYN)) != 0)
#define        IEEE80211_IS_CHAN_CCK(_c) \
-       (((_c)->ic_flags & IEEE80211_CHAN_CCK) != 0)
+       (((_c)->ic_flags & (IEEE80211_CHAN_CCK | IEEE80211_CHAN_DYN)) != 0)
#define        IEEE80211_IS_CHAN_GFSK(_c) \
       (((_c)->ic_flags & IEEE80211_CHAN_GFSK) != 0)
+#define        IEEE80211_IS_CHAN_TURBO(_c) \
+       (((_c)->ic_flags & IEEE80211_CHAN_TURBO) != 0)
+#define        IEEE80211_IS_CHAN_STURBO(_c) \
+       (((_c)->ic_flags & IEEE80211_CHAN_STURBO) != 0)
+#define        IEEE80211_IS_CHAN_DTURBO(_c) \
+       (((_c)->ic_flags & \
+       (IEEE80211_CHAN_TURBO | IEEE80211_CHAN_STURBO)) == IEEE80211_CHAN_TURBO)
#define        IEEE80211_IS_CHAN_HALF(_c) \
       (((_c)->ic_flags & IEEE80211_CHAN_HALF) != 0)
#define        IEEE80211_IS_CHAN_QUARTER(_c) \
@@ -186,9 +273,45 @@ struct ieee80211_channel {
       (((_c)->ic_flags & (IEEE80211_CHAN_QUARTER | IEEE80211_CHAN_HALF)) == 0)
#define        IEEE80211_IS_CHAN_GSM(_c) \
       (((_c)->ic_flags & IEEE80211_CHAN_GSM) != 0)
-#define        IEEE80211_IS_CHAN_PASSIVE(_c) \
-       (((_c)->ic_flags & IEEE80211_CHAN_PASSIVE) != 0)
+#define        IEEE80211_IS_CHAN_HT(_c) \
+       (((_c)->ic_flags & IEEE80211_CHAN_HT) != 0)
+#define        IEEE80211_IS_CHAN_HT20(_c) \
+       (((_c)->ic_flags & IEEE80211_CHAN_HT20) != 0)
+#define        IEEE80211_IS_CHAN_HT40(_c) \
+       (((_c)->ic_flags & IEEE80211_CHAN_HT40) != 0)
+#define        IEEE80211_IS_CHAN_HT40U(_c) \
+       (((_c)->ic_flags & IEEE80211_CHAN_HT40U) != 0)
+#define        IEEE80211_IS_CHAN_HT40D(_c) \
+       (((_c)->ic_flags & IEEE80211_CHAN_HT40D) != 0)
+#define        IEEE80211_IS_CHAN_HTA(_c) \
+       (IEEE80211_IS_CHAN_5GHZ(_c) && \
+        ((_c)->ic_flags & IEEE80211_CHAN_HT) != 0)
+#define        IEEE80211_IS_CHAN_HTG(_c) \
+       (IEEE80211_IS_CHAN_2GHZ(_c) && \
+        ((_c)->ic_flags & IEEE80211_CHAN_HT) != 0)
+#define        IEEE80211_IS_CHAN_DFS(_c) \
+       (((_c)->ic_flags & IEEE80211_CHAN_DFS) != 0)
+#define        IEEE80211_IS_CHAN_NOADHOC(_c) \
+       (((_c)->ic_flags & IEEE80211_CHAN_NOADHOC) != 0)
+#define        IEEE80211_IS_CHAN_NOHOSTAP(_c) \
+       (((_c)->ic_flags & IEEE80211_CHAN_NOHOSTAP) != 0)
+#define        IEEE80211_IS_CHAN_11D(_c) \
+       (((_c)->ic_flags & IEEE80211_CHAN_11D) != 0)
+
+#define        IEEE80211_CHAN2IEEE(_c)         (_c)->ic_ieee
+
+/* dynamic state */
+#define        IEEE80211_CHANSTATE_RADAR       0x01    /* radar detected */
+#define        IEEE80211_CHANSTATE_CACDONE     0x02    /* CAC completed */
+#define        IEEE80211_CHANSTATE_CWINT       0x04    /* interference detected */
+#define        IEEE80211_CHANSTATE_NORADAR     0x10    /* post notify on radar clear */

+#define        IEEE80211_IS_CHAN_RADAR(_c) \
+       (((_c)->ic_state & IEEE80211_CHANSTATE_RADAR) != 0)
+#define        IEEE80211_IS_CHAN_CACDONE(_c) \
+       (((_c)->ic_state & IEEE80211_CHANSTATE_CACDONE) != 0)
+#define        IEEE80211_IS_CHAN_CWINT(_c) \
+       (((_c)->ic_state & IEEE80211_CHANSTATE_CWINT) != 0)

/* ni_chan encoding for FH phy */
#define        IEEE80211_FH_CHANMOD    80
@@ -196,6 +319,19 @@ struct ieee80211_channel {
#define        IEEE80211_FH_CHANSET(chan)      ((chan)/IEEE80211_FH_CHANMOD+1)
#define        IEEE80211_FH_CHANPAT(chan)      ((chan)%IEEE80211_FH_CHANMOD)

+#define        IEEE80211_TID_SIZE      (WME_NUM_TID+1) /* WME TID's +1 for non-QoS */
+#define        IEEE80211_NONQOS_TID    WME_NUM_TID     /* index for non-QoS sta */
+
+/*
+ * The 802.11 spec says at most 2007 stations may be
+ * associated at once.  For most AP's this is way more
+ * than is feasible so we use a default of 128.  This
+ * number may be overridden by the driver and/or by
+ * user configuration but may not be less than IEEE80211_AID_MIN.
+ */
+#define        IEEE80211_AID_DEF               128
+#define        IEEE80211_AID_MIN               16
+
/*
 * 802.11 rate set.
 */
@@ -203,12 +339,72 @@ struct ieee80211_channel {
#define        IEEE80211_RATE_MAXSIZE  15              /* max rates we'll handle */

struct ieee80211_rateset {
-       u_int8_t                rs_nrates;
-       u_int8_t                rs_rates[IEEE80211_RATE_MAXSIZE];
+       uint8_t         rs_nrates;
+       uint8_t         rs_rates[IEEE80211_RATE_MAXSIZE];
+};
+
+/*
+ * 802.11n variant of ieee80211_rateset.  Instead of
+ * legacy rates the entries are MCS rates.  We define
+ * the structure such that it can be used interchangeably
+ * with an ieee80211_rateset (modulo structure size).
+ */
+#define        IEEE80211_HTRATE_MAXSIZE 127
+
+struct ieee80211_htrateset {
+       uint8_t         rs_nrates;
+       uint8_t         rs_rates[IEEE80211_HTRATE_MAXSIZE];
};

-extern const struct ieee80211_rateset ieee80211_std_rateset_11a;
-extern const struct ieee80211_rateset ieee80211_std_rateset_11b;
-extern const struct ieee80211_rateset ieee80211_std_rateset_11g;
+#define        IEEE80211_RATE_MCS      0x80
+
+/*
+ * Per-mode transmit parameters/controls visible to user space.
+ * These can be used to set fixed transmit rate for all operating
+ * modes or on a per-client basis according to the capabilities
+ * of the client (e.g. an 11b client associated to an 11g ap).
+ *
+ * MCS are distinguished from legacy rates by or'ing in 0x80.
+ */
+struct ieee80211_txparam {
+       uint8_t         ucastrate;      /* ucast data rate (legacy/MCS|0x80) */
+       uint8_t         mgmtrate;       /* mgmt frame rate (legacy/MCS|0x80) */
+       uint8_t         mcastrate;      /* multicast rate (legacy/MCS|0x80) */
+       uint8_t         maxretry;       /* max unicast data retry count */
+};

-#endif /* !_NET80211__IEEE80211_H_ */
+/*
+ * Per-mode roaming state visible to user space.  There are two
+ * thresholds that control whether roaming is considered; when
+ * either is exceeded the 802.11 layer will check the scan cache
+ * for another AP.  If the cache is stale then a scan may be
+ * triggered.
+ */
+struct ieee80211_roamparam {
+       int8_t          rssi;           /* rssi thresh (.5 dBm) */
+       uint8_t         rate;           /* tx rate thresh (.5 Mb/s or MCS) */
+       uint16_t        pad;            /* reserve */
+};
+
+/*
+ * Regulatory Information.
+ */
+struct ieee80211_regdomain {
+       uint16_t        regdomain;      /* SKU */
+       uint16_t        country;        /* ISO country code */
+       uint8_t         location;       /* I (indoor), O (outdoor), other */
+       uint8_t         ecm;            /* Extended Channel Mode */
+       char            isocc[2];       /* country code string */
+       short           pad[2];
+};
+
+/*
+ * MIMO antenna/radio state.
+ */
+struct ieee80211_mimo_info {
+       int8_t          rssi[3];        /* per-antenna rssi */
+       int8_t          noise[3];       /* per-antenna noise floor */
+       uint8_t         pad[2];
+       uint32_t        evm[3];         /* EVM data */
+};
+#endif /* _NET80211__IEEE80211_H_ */
diff --git a/sys/net80211/ieee80211.c b/sys/net80211/ieee80211.c
index ec52b21..feec8f7 100644
--- a/sys/net80211/ieee80211.c
+++ b/sys/net80211/ieee80211.c
@@ -195,7 +195,7 @@ ieee80211_ifattach(struct ieee80211com *ic)
                               ic->ic_modecaps |= 1<<IEEE80211_MODE_11G;
                       if (IEEE80211_IS_CHAN_FHSS(c))
                               ic->ic_modecaps |= 1<<IEEE80211_MODE_FH;
-                       if (IEEE80211_IS_CHAN_T(c))
+                       if (IEEE80211_IS_CHAN_TURBO(c))
                               ic->ic_modecaps |= 1<<IEEE80211_MODE_TURBO_A;
                       if (IEEE80211_IS_CHAN_108G(c))
                               ic->ic_modecaps |= 1<<IEEE80211_MODE_TURBO_G;
@@ -859,7 +859,7 @@ ieee80211_setmode(struct ieee80211com *ic, enum ieee80211_phymode mode)
               IEEE80211_CHAN_B,       /* IEEE80211_MODE_11B */
               IEEE80211_CHAN_PUREG,   /* IEEE80211_MODE_11G */
               IEEE80211_CHAN_FHSS,    /* IEEE80211_MODE_FH */
-               IEEE80211_CHAN_T,       /* IEEE80211_MODE_TURBO_A */
+               IEEE80211_CHAN_TURBO,   /* IEEE80211_MODE_TURBO_A */
               IEEE80211_CHAN_108G,    /* IEEE80211_MODE_TURBO_G */
       };
       struct ieee80211_channel *c;
@@ -984,7 +984,7 @@ ieee80211_setmode(struct ieee80211com *ic, enum ieee80211_phymode mode)
enum ieee80211_phymode
ieee80211_chan2mode(struct ieee80211com *ic, struct ieee80211_channel *chan)
{
-       if (IEEE80211_IS_CHAN_T(chan)) {
+       if (IEEE80211_IS_CHAN_TURBO(chan)) {
               return IEEE80211_MODE_TURBO_A;
       } else if (IEEE80211_IS_CHAN_5GHZ(chan)) {
               return IEEE80211_MODE_11A;
diff --git a/sys/net80211/ieee80211_regdomain.h b/sys/net80211/ieee80211_regdomain.h
new file mode 100644
index 0000000..8942dd9
--- /dev/null
+++ b/sys/net80211/ieee80211_regdomain.h
@@ -0,0 +1,282 @@
+/*-
+ * Copyright (c) 2005-2008 Sam Leffler, Errno Consulting
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+#ifndef _NET80211_IEEE80211_REGDOMAIN_H_
+#define _NET80211_IEEE80211_REGDOMAIN_H_
+
+/*
+ * 802.11 regulatory domain definitions.
+ */
+
+/*
+ * ISO 3166 Country/Region Codes
+ * http://ftp.ics.uci.edu/pub/ietf/http/related/iso3166.txt
+ */
+enum ISOCountryCode {
+       CTRY_AFGHANISTAN        = 4,
+       CTRY_ALBANIA            = 8,    /* Albania */
+       CTRY_ALGERIA            = 12,   /* Algeria */
+       CTRY_AMERICAN_SAMOA     = 16,
+       CTRY_ANDORRA            = 20,
+       CTRY_ANGOLA             = 24,
+       CTRY_ANGUILLA           = 660,
+       CTRY_ANTARTICA          = 10,
+       CTRY_ANTIGUA            = 28,   /* Antigua and Barbuda */
+       CTRY_ARGENTINA          = 32,   /* Argentina */
+       CTRY_ARMENIA            = 51,   /* Armenia */
+       CTRY_ARUBA              = 533,  /* Aruba */
+       CTRY_AUSTRALIA          = 36,   /* Australia */
+       CTRY_AUSTRIA            = 40,   /* Austria */
+       CTRY_AZERBAIJAN         = 31,   /* Azerbaijan */
+       CTRY_BAHAMAS            = 44,   /* Bahamas */
+       CTRY_BAHRAIN            = 48,   /* Bahrain */
+       CTRY_BANGLADESH         = 50,   /* Bangladesh */
+       CTRY_BARBADOS           = 52,
+       CTRY_BELARUS            = 112,  /* Belarus */
+       CTRY_BELGIUM            = 56,   /* Belgium */
+       CTRY_BELIZE             = 84,
+       CTRY_BENIN              = 204,
+       CTRY_BERMUDA            = 60,
+       CTRY_BHUTAN             = 64,
+       CTRY_BOLIVIA            = 68,   /* Bolivia */
+       CTRY_BOSNIA_AND_HERZEGOWINA = 70,
+       CTRY_BOTSWANA           = 72,
+       CTRY_BOUVET_ISLAND      = 74,
+       CTRY_BRAZIL             = 76,   /* Brazil */
+       CTRY_BRITISH_INDIAN_OCEAN_TERRITORY = 86,
+       CTRY_BRUNEI_DARUSSALAM  = 96,   /* Brunei Darussalam */
+       CTRY_BULGARIA           = 100,  /* Bulgaria */
+       CTRY_BURKINA_FASO       = 854,
+       CTRY_BURUNDI            = 108,
+       CTRY_CAMBODIA           = 116,
+       CTRY_CAMEROON           = 120,
+       CTRY_CANADA             = 124,  /* Canada */
+       CTRY_CAPE_VERDE         = 132,
+       CTRY_CAYMAN_ISLANDS     = 136,
+       CTRY_CENTRAL_AFRICAN_REPUBLIC = 140,
+       CTRY_CHAD               = 148,
+       CTRY_CHILE              = 152,  /* Chile */
+       CTRY_CHINA              = 156,  /* People's Republic of China */
+       CTRY_CHRISTMAS_ISLAND   = 162,
+       CTRY_COCOS_ISLANDS      = 166,
+       CTRY_COLOMBIA           = 170,  /* Colombia */
+       CTRY_COMOROS            = 174,
+       CTRY_CONGO              = 178,
+       CTRY_COOK_ISLANDS       = 184,
+       CTRY_COSTA_RICA         = 188,  /* Costa Rica */
+       CTRY_COTE_DIVOIRE       = 384,
+       CTRY_CROATIA            = 191,  /* Croatia (local name: Hrvatska) */
+       CTRY_CYPRUS             = 196,  /* Cyprus */
+       CTRY_CZECH              = 203,  /* Czech Republic */
+       CTRY_DENMARK            = 208,  /* Denmark */
+       CTRY_DJIBOUTI           = 262,
+       CTRY_DOMINICA           = 212,
+       CTRY_DOMINICAN_REPUBLIC = 214,  /* Dominican Republic */
+       CTRY_EAST_TIMOR         = 626,
+       CTRY_ECUADOR            = 218,  /* Ecuador */
+       CTRY_EGYPT              = 818,  /* Egypt */
+       CTRY_EL_SALVADOR        = 222,  /* El Salvador */
+       CTRY_EQUATORIAL_GUINEA  = 226,
+       CTRY_ERITREA            = 232,
+       CTRY_ESTONIA            = 233,  /* Estonia */
+       CTRY_ETHIOPIA           = 210,
+       CTRY_FALKLAND_ISLANDS   = 238,  /* (Malvinas) */
+       CTRY_FAEROE_ISLANDS     = 234,  /* Faeroe Islands */
+       CTRY_FIJI               = 242,
+       CTRY_FINLAND            = 246,  /* Finland */
+       CTRY_FRANCE             = 250,  /* France */
+       CTRY_FRANCE2            = 255,  /* France (Metropolitan) */
+       CTRY_FRENCH_GUIANA      = 254,
+       CTRY_FRENCH_POLYNESIA   = 258,
+       CTRY_FRENCH_SOUTHERN_TERRITORIES        = 260,
+       CTRY_GABON              = 266,
+       CTRY_GAMBIA             = 270,
+       CTRY_GEORGIA            = 268,  /* Georgia */
+       CTRY_GERMANY            = 276,  /* Germany */
+       CTRY_GHANA              = 288,
+       CTRY_GIBRALTAR          = 292,
+       CTRY_GREECE             = 300,  /* Greece */
+       CTRY_GREENLAND          = 304,
+       CTRY_GRENADA            = 308,
+       CTRY_GUADELOUPE         = 312,
+       CTRY_GUAM               = 316,
+       CTRY_GUATEMALA          = 320,  /* Guatemala */
+       CTRY_GUINEA             = 324,
+       CTRY_GUINEA_BISSAU      = 624,
+       CTRY_GUYANA             = 328,
+       /* XXX correct remainder */
+       CTRY_HAITI              = 332,
+       CTRY_HONDURAS           = 340,  /* Honduras */
+       CTRY_HONG_KONG          = 344,  /* Hong Kong S.A.R., P.R.C. */
+       CTRY_HUNGARY            = 348,  /* Hungary */
+       CTRY_ICELAND            = 352,  /* Iceland */
+       CTRY_INDIA              = 356,  /* India */
+       CTRY_INDONESIA          = 360,  /* Indonesia */
+       CTRY_IRAN               = 364,  /* Iran */
+       CTRY_IRAQ               = 368,  /* Iraq */
+       CTRY_IRELAND            = 372,  /* Ireland */
+       CTRY_ISRAEL             = 376,  /* Israel */
+       CTRY_ITALY              = 380,  /* Italy */
+       CTRY_JAMAICA            = 388,  /* Jamaica */
+       CTRY_JAPAN              = 392,  /* Japan */
+       CTRY_JORDAN             = 400,  /* Jordan */
+       CTRY_KAZAKHSTAN         = 398,  /* Kazakhstan */
+       CTRY_KENYA              = 404,  /* Kenya */
+       CTRY_KOREA_NORTH        = 408,  /* North Korea */
+       CTRY_KOREA_ROC          = 410,  /* South Korea */
+       CTRY_KOREA_ROC2         = 411,  /* South Korea */
+       CTRY_KUWAIT             = 414,  /* Kuwait */
+       CTRY_LATVIA             = 428,  /* Latvia */
+       CTRY_LEBANON            = 422,  /* Lebanon */
+       CTRY_LIBYA              = 434,  /* Libya */
+       CTRY_LIECHTENSTEIN      = 438,  /* Liechtenstein */
+       CTRY_LITHUANIA          = 440,  /* Lithuania */
+       CTRY_LUXEMBOURG         = 442,  /* Luxembourg */
+       CTRY_MACAU              = 446,  /* Macau */
+       CTRY_MACEDONIA          = 807,  /* the Former Yugoslav Republic of Macedonia */
+       CTRY_MALAYSIA           = 458,  /* Malaysia */
+       CTRY_MALTA              = 470,  /* Malta */
+       CTRY_MEXICO             = 484,  /* Mexico */
+       CTRY_MONACO             = 492,  /* Principality of Monaco */
+       CTRY_MOROCCO            = 504,  /* Morocco */
+       CTRY_NEPAL              = 524,  /* Nepal */
+       CTRY_NETHERLANDS        = 528,  /* Netherlands */
+       CTRY_NEW_ZEALAND        = 554,  /* New Zealand */
+       CTRY_NICARAGUA          = 558,  /* Nicaragua */
+       CTRY_NORWAY             = 578,  /* Norway */
+       CTRY_OMAN               = 512,  /* Oman */
+       CTRY_PAKISTAN           = 586,  /* Islamic Republic of Pakistan */
+       CTRY_PANAMA             = 591,  /* Panama */
+       CTRY_PARAGUAY           = 600,  /* Paraguay */
+       CTRY_PERU               = 604,  /* Peru */
+       CTRY_PHILIPPINES        = 608,  /* Republic of the Philippines */
+       CTRY_POLAND             = 616,  /* Poland */
+       CTRY_PORTUGAL           = 620,  /* Portugal */
+       CTRY_PUERTO_RICO        = 630,  /* Puerto Rico */
+       CTRY_QATAR              = 634,  /* Qatar */
+       CTRY_ROMANIA            = 642,  /* Romania */
+       CTRY_RUSSIA             = 643,  /* Russia */
+       CTRY_SAUDI_ARABIA       = 682,  /* Saudi Arabia */
+       CTRY_SINGAPORE          = 702,  /* Singapore */
+       CTRY_SLOVAKIA           = 703,  /* Slovak Republic */
+       CTRY_SLOVENIA           = 705,  /* Slovenia */
+       CTRY_SOUTH_AFRICA       = 710,  /* South Africa */
+       CTRY_SPAIN              = 724,  /* Spain */
+       CTRY_SRILANKA           = 144,  /* Sri Lanka */
+       CTRY_SWEDEN             = 752,  /* Sweden */
+       CTRY_SWITZERLAND        = 756,  /* Switzerland */
+       CTRY_SYRIA              = 760,  /* Syria */
+       CTRY_TAIWAN             = 158,  /* Taiwan */
+       CTRY_THAILAND           = 764,  /* Thailand */
+       CTRY_TRINIDAD_Y_TOBAGO  = 780,  /* Trinidad y Tobago */
+       CTRY_TUNISIA            = 788,  /* Tunisia */
+       CTRY_TURKEY             = 792,  /* Turkey */
+       CTRY_UAE                = 784,  /* U.A.E. */
+       CTRY_UKRAINE            = 804,  /* Ukraine */
+       CTRY_UNITED_KINGDOM     = 826,  /* United Kingdom */
+       CTRY_UNITED_STATES      = 840,  /* United States */
+       CTRY_URUGUAY            = 858,  /* Uruguay */
+       CTRY_UZBEKISTAN         = 860,  /* Uzbekistan */
+       CTRY_VENEZUELA          = 862,  /* Venezuela */
+       CTRY_VIET_NAM           = 704,  /* Viet Nam */
+       CTRY_YEMEN              = 887,  /* Yemen */
+       CTRY_ZIMBABWE           = 716,  /* Zimbabwe */
+
+       /* NB: from here down not listed in 3166; they come from Atheros */
+       CTRY_DEBUG              = 0x1ff, /* debug */
+       CTRY_DEFAULT            = 0,     /* default */
+
+       CTRY_UNITED_STATES_FCC49 = 842, /* United States (Public Safety)*/
+       CTRY_KOREA_ROC3         = 412,  /* South Korea */
+
+       CTRY_JAPAN1             = 393,  /* Japan (JP1) */
+       CTRY_JAPAN2             = 394,  /* Japan (JP0) */
+       CTRY_JAPAN3             = 395,  /* Japan (JP1-1) */
+       CTRY_JAPAN4             = 396,  /* Japan (JE1) */
+       CTRY_JAPAN5             = 397,  /* Japan (JE2) */
+       CTRY_JAPAN6             = 399,  /* Japan (JP6) */
+       CTRY_JAPAN7             = 4007, /* Japan (J7) */
+       CTRY_JAPAN8             = 4008, /* Japan (J8) */
+       CTRY_JAPAN9             = 4009, /* Japan (J9) */
+       CTRY_JAPAN10            = 4010, /* Japan (J10) */
+       CTRY_JAPAN11            = 4011, /* Japan (J11) */
+       CTRY_JAPAN12            = 4012, /* Japan (J12) */
+       CTRY_JAPAN13            = 4013, /* Japan (J13) */
+       CTRY_JAPAN14            = 4014, /* Japan (J14) */
+       CTRY_JAPAN15            = 4015, /* Japan (J15) */
+       CTRY_JAPAN16            = 4016, /* Japan (J16) */
+       CTRY_JAPAN17            = 4017, /* Japan (J17) */
+       CTRY_JAPAN18            = 4018, /* Japan (J18) */
+       CTRY_JAPAN19            = 4019, /* Japan (J19) */
+       CTRY_JAPAN20            = 4020, /* Japan (J20) */
+       CTRY_JAPAN21            = 4021, /* Japan (J21) */
+       CTRY_JAPAN22            = 4022, /* Japan (J22) */
+       CTRY_JAPAN23            = 4023, /* Japan (J23) */
+       CTRY_JAPAN24            = 4024, /* Japan (J24) */
+};
+
+enum RegdomainCode {
+       SKU_FCC                 = 0x10, /* FCC, aka United States */
+       SKU_CA                  = 0x20, /* North America, aka Canada */
+       SKU_ETSI                = 0x30, /* Europe */
+       SKU_ETSI2               = 0x32, /* Europe w/o HT40 in 5GHz */
+       SKU_ETSI3               = 0x33, /* Europe - channel 36 */
+       SKU_FCC3                = 0x3a, /* FCC w/5470 band, 11h, DFS */
+       SKU_JAPAN               = 0x40,
+       SKU_KOREA               = 0x45,
+       SKU_APAC                = 0x50, /* Asia Pacific */
+       SKU_APAC2               = 0x51, /* Asia Pacific w/ DFS on mid-band */
+       SKU_APAC3               = 0x5d, /* Asia Pacific w/o ISM band */
+       SKU_ROW                 = 0x81, /* China/Taiwan/Rest of World */
+       SKU_NONE                = 0xf0, /* "Region Free" */
+       SKU_DEBUG               = 0x1ff,
+
+       /* NB: from here down private */
+       SKU_SR9                 = 0x0298, /* Ubiquiti SR9 (900MHz/GSM) */
+       SKU_XR9                 = 0x0299, /* Ubiquiti XR9 (900MHz/GSM) */
+       SKU_GZ901               = 0x029a, /* Zcomax GZ-901 (900MHz/GSM) */
+};
+
+#if defined(__KERNEL__) || defined(_KERNEL)
+struct ieee80211com;
+void   ieee80211_regdomain_attach(struct ieee80211com *);
+void   ieee80211_regdomain_detach(struct ieee80211com *);
+struct ieee80211vap;
+void   ieee80211_regdomain_vattach(struct ieee80211vap *);
+void   ieee80211_regdomain_vdetach(struct ieee80211vap *);
+
+struct ieee80211_regdomain;
+int    ieee80211_init_channels(struct ieee80211com *,
+           const struct ieee80211_regdomain *, const uint8_t bands[]);
+struct ieee80211_channel;
+void   ieee80211_sort_channels(struct ieee80211_channel *chans, int nchans);
+struct ieee80211_appie;
+struct ieee80211_appie *ieee80211_alloc_countryie(struct ieee80211com *);
+struct ieee80211_regdomain_req;
+int    ieee80211_setregdomain(struct ieee80211vap *,
+           struct ieee80211_regdomain_req *);
+#endif /* defined(__KERNEL__) || defined(_KERNEL) */
+#endif /* _NET80211_IEEE80211_REGDOMAIN_H_ */
--
1.7.1.rc0.7.g02125bc