| /*- |
| * Copyright (c) 2001 Atsushi Onoe |
| * Copyright (c) 2002-2005 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. |
| * 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 |
| * 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. |
| * |
| * $Id: _ieee80211.h 2749 2007-10-16 08:58:14Z kelmo $ |
| */ |
| #ifndef _NET80211__IEEE80211_H_ |
| #define _NET80211__IEEE80211_H_ |
| |
| #include <compat.h> |
| #ifdef __KERNEL__ |
| #include <linux/in6.h> |
| #endif |
| |
| 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_HT, /* HT - full GI */ |
| IEEE80211_T_MAX |
| }; |
| #define IEEE80211_T_CCK IEEE80211_T_DS /* more common nomenclature */ |
| |
| /* |
| * XXX not really a mode; there are really multiple PHY's |
| * Please update ieee80211_chanflags when the definition of |
| * ieee80211_phymode changed |
| */ |
| enum ieee80211_phymode { |
| IEEE80211_MODE_AUTO = 0, /* autoselect */ |
| IEEE80211_MODE_11A = 1, /* 5GHz, OFDM */ |
| IEEE80211_MODE_11B = 2, /* 2GHz, CCK */ |
| IEEE80211_MODE_11G = 3, /* 2GHz, OFDM */ |
| IEEE80211_MODE_FH = 4, /* 2GHz, GFSK */ |
| IEEE80211_MODE_TURBO_A = 5, /* 5GHz, OFDM, 2x clock dynamic turbo */ |
| IEEE80211_MODE_TURBO_G = 6, /* 2GHz, OFDM, 2x clock dynamic turbo*/ |
| IEEE80211_MODE_11NA = 7, /* 5GHz, HT20 */ |
| IEEE80211_MODE_11NG = 8, /* 2GHz, HT20 */ |
| IEEE80211_MODE_11NG_HT40PM = 9, /* 2GHz HT40 */ |
| IEEE80211_MODE_11NA_HT40PM = 10, /* 5GHz HT40 */ |
| IEEE80211_MODE_11AC_VHT20PM = 11, /* 5GHz VHT20 */ |
| IEEE80211_MODE_11AC_VHT40PM = 12, /* 5GHz VHT40 */ |
| IEEE80211_MODE_11AC_VHT80PM = 13, /* 5GHz VHT80 */ |
| IEEE80211_MODE_11AC_VHT160PM = 14, /* 5GHz VHT160 */ |
| IEEE80211_MODE_MAX = 15, /* Always keep this last */ |
| }; |
| |
| /* |
| #define IEEE80211_BM_11A (1 << IEEE80211_MODE_11A) |
| #define IEEE80211_BM_11B (1 << IEEE80211_MODE_11B) |
| #define IEEE80211_BM_11G (1 << IEEE80211_MODE_11B) |
| #define IEEE80211_BM_11NA (1 << IEEE80211_MODE_11B) |
| #define IEEE80211_BM_11NG (1 << IEEE80211_MODE_11B) |
| #define IEEE80211_BM_11NG_PLUS (1 << IEEE80211_MODE_11B) |
| #define IEEE80211_BM_11NG_MINUS (1 << IEEE80211_MODE_11B) |
| #define IEEE80211_BM_11NA_PLUS (1 << IEEE80211_MODE_11B) |
| #define IEEE80211_BM_11NA_MINUS (1 << IEEE80211_MODE_11B) |
| */ |
| |
| |
| #define IEEE80211_IS_VHT_20(_c) \ |
| ((_c)->ic_phymode == IEEE80211_MODE_11AC_VHT20PM) |
| |
| #define IEEE80211_IS_VHT_40(_c) \ |
| ((_c)->ic_phymode == IEEE80211_MODE_11AC_VHT40PM) |
| |
| #define IEEE80211_IS_VHT_80(_c) \ |
| ((_c)->ic_phymode == IEEE80211_MODE_11AC_VHT80PM) |
| |
| #define IEEE80211_IS_VHT_160(_c) \ |
| ((_c)->ic_phymode == IEEE80211_MODE_11AC_VHT160PM) |
| |
| #define IS_IEEE80211_VHT_ENABLED(_c) \ |
| (IEEE80211_IS_VHT_160(_c) || IEEE80211_IS_VHT_80(_c)\ |
| || IEEE80211_IS_VHT_40(_c) || IEEE80211_IS_VHT_20(_c)) |
| |
| enum ieee80211_opmode { |
| IEEE80211_M_STA = 1, /* infrastructure station */ |
| IEEE80211_M_IBSS = 0, /* IBSS (adhoc) station */ |
| IEEE80211_M_AHDEMO = 3, /* Old lucent compatible adhoc demo */ |
| IEEE80211_M_HOSTAP = 6, /* Software Access Point */ |
| IEEE80211_M_MONITOR = 8, /* Monitor mode */ |
| IEEE80211_M_WDS = 2 /* WDS link */ |
| }; |
| |
| /* |
| * True if this mode must behave like a DFS master, ie do Channel |
| * Check Availability and In Service Monitoring. We need to make sure |
| * that all modes cannot send data without being authorized. Such |
| * enforcement is not done in monitor mode however. |
| */ |
| |
| #define IEEE80211_IS_MODE_DFS_MASTER(_opmode) \ |
| ((_opmode == IEEE80211_M_IBSS) || \ |
| (_opmode == IEEE80211_M_AHDEMO) || \ |
| (_opmode == IEEE80211_M_HOSTAP) || \ |
| (_opmode == IEEE80211_M_WDS)) |
| |
| /* |
| * 802.11n |
| */ |
| |
| enum ieee80211_11n_htmode { |
| IEEE80211_11N_HTAUTO = 0, |
| IEEE80211_11N_HT20 = 1, |
| IEEE80211_11N_HT40PLUS = 2, |
| IEEE80211_11N_HT40MINUS = 3 |
| }; |
| |
| enum ieee80211_cwm_mode { |
| IEEE80211_CWM_MODE20, |
| IEEE80211_CWM_MODE2040, |
| IEEE80211_CWM_MODE40, |
| IEEE80211_CWM_MODEMAX |
| |
| }; |
| |
| enum ieee80211_cwm_extprotspacing { |
| IEEE80211_CWM_EXTPROTSPACING20, |
| IEEE80211_CWM_EXTPROTSPACING25, |
| IEEE80211_CWM_EXTPROTSPACINGMAX |
| }; |
| |
| enum ieee80211_cwm_width { |
| IEEE80211_CWM_WIDTH20, |
| IEEE80211_CWM_WIDTH40, |
| IEEE80211_CWM_WIDTH80, |
| IEEE80211_CWM_WIDTH160, /* or 80+80 Mhz */ |
| }; |
| |
| enum ieee80211_cwm_extprotmode { |
| IEEE80211_CWM_EXTPROTNONE, /* no protection */ |
| IEEE80211_CWM_EXTPROTCTSONLY, /* CTS to self */ |
| IEEE80211_CWM_EXTPROTRTSCTS, /* RTS-CTS */ |
| IEEE80211_CWM_EXTPROTMAX |
| }; |
| |
| /* CWM (Channel Width Management) Information */ |
| struct ieee80211_cwm { |
| |
| /* Configuration */ |
| enum ieee80211_cwm_mode cw_mode; /* CWM mode */ |
| int8_t cw_extoffset; /* CWM Extension Channel Offset */ |
| enum ieee80211_cwm_extprotmode cw_extprotmode; /* CWM Extension Channel Protection Mode */ |
| enum ieee80211_cwm_extprotspacing cw_extprotspacing; /* CWM Extension Channel Protection Spacing */ |
| |
| /* State */ |
| enum ieee80211_cwm_width cw_width; /* CWM channel width */ |
| }; |
| |
| |
| enum ieee80211_fixed_rate_status { |
| DISABLED = 0, |
| ENABLED = 1, /* ieee rate */ |
| }; |
| |
| /* Holds the fixed rate information for each VAP */ |
| #define IEEE80211_MAX_FIXED_RATES 4 |
| struct ieee80211_fixed_rate { |
| enum ieee80211_fixed_rate_status status; |
| u_int8_t rate[IEEE80211_MAX_FIXED_RATES]; |
| u_int32_t retries; |
| u_int32_t flag; |
| #define IEEE80211_FIXED_RATE_F_11AC 0x1 |
| }; |
| |
| /* |
| * 802.11g protection mode. |
| */ |
| enum ieee80211_protmode { |
| IEEE80211_PROT_NONE = 0, /* no protection */ |
| IEEE80211_PROT_CTSONLY = 1, /* CTS to self */ |
| IEEE80211_PROT_RTSCTS = 2, /* RTS-CTS */ |
| }; |
| |
| /* |
| * Authentication mode. |
| */ |
| enum ieee80211_authmode { |
| IEEE80211_AUTH_NONE = 0, |
| IEEE80211_AUTH_OPEN = 1, /* open */ |
| IEEE80211_AUTH_SHARED = 2, /* shared-key */ |
| 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 */ |
| }; |
| |
| /* |
| * Roaming mode is effectively who controls the operation |
| * of the 802.11 state machine when operating as a station. |
| * State transitions are controlled either by the driver |
| * (typically when management frames are processed by the |
| * hardware/firmware), the host (auto/normal operation of |
| * the 802.11 layer), or explicitly through ioctl requests |
| * when applications like wpa_supplicant want control. |
| */ |
| enum ieee80211_roamingmode { |
| IEEE80211_ROAMING_DEVICE= 0, /* driver/hardware control */ |
| IEEE80211_ROAMING_AUTO = 1, /* 802.11 layer control */ |
| IEEE80211_ROAMING_MANUAL= 2, /* application control */ |
| }; |
| |
| /* |
| * Scanning mode controls station scanning work; this is |
| * used only when roaming mode permits the host to select |
| * the bss to join/channel to use. |
| */ |
| enum ieee80211_scanmode { |
| IEEE80211_SCAN_DEVICE = 0, /* driver/hardware control */ |
| IEEE80211_SCAN_BEST = 1, /* 802.11 layer selects best */ |
| IEEE80211_SCAN_FIRST = 2, /* take first suitable candidate */ |
| }; |
| |
| /* ba state describes the block ack state. block ack should only be sent if |
| * ba state is set to established |
| */ |
| enum ieee80211_ba_state { |
| IEEE80211_BA_NOT_ESTABLISHED = 0, |
| IEEE80211_BA_ESTABLISHED = 1, |
| IEEE80211_BA_REQUESTED = 2, |
| IEEE80211_BA_FAILED = 5, |
| IEEE80211_BA_BLOCKED = 6, |
| }; |
| |
| #define IEEE80211_BA_IS_COMPLETE(_state) (\ |
| (_state) == IEEE80211_BA_ESTABLISHED || \ |
| (_state) == IEEE80211_BA_BLOCKED || \ |
| (_state) == IEEE80211_BA_FAILED) \ |
| |
| /* ba type describes the block acknowledgement type */ |
| enum ieee80211_ba_type { |
| IEEE80211_BA_DELAYED = 0, |
| IEEE80211_BA_IMMEDIATE = 1, |
| }; |
| |
| #define IEEE80211_OPER_CLASS_MAX 256 |
| #define IEEE80211_OPER_CLASS_BYTES 32 /* howmany(IEEE80211_OPER_CLASS_MAX, NBBY) */ |
| |
| /* power index definition */ |
| enum ieee80211_power_index_beamforming { |
| PWR_IDX_BF_OFF = 0, |
| PWR_IDX_BF_ON = 1, |
| PWR_IDX_BF_MAX = 2 |
| }; |
| |
| enum ieee80211_power_index_spatial_stream { |
| PWR_IDX_1SS = 0, |
| PWR_IDX_2SS = 1, |
| PWR_IDX_3SS = 2, |
| PWR_IDX_4SS = 3, |
| PWR_IDX_SS_MAX = 4 |
| }; |
| |
| enum ieee80211_power_index_bandwidth { |
| PWR_IDX_20M = 0, |
| PWR_IDX_40M = 1, |
| PWR_IDX_80M = 2, |
| PWR_IDX_BW_MAX = 3 |
| }; |
| |
| /* |
| * Channels are specified by frequency and attributes. |
| */ |
| struct ieee80211_channel { |
| u_int16_t ic_freq; /* setting in Mhz */ |
| u_int32_t ic_flags; /* see below */ |
| u_int8_t ic_ieee; /* IEEE channel number */ |
| int8_t ic_maxregpower; /* maximum regulatory tx power in dBm */ |
| int8_t ic_maxpower; /* maximum tx power in dBm for the current bandwidth with beam-forming off */ |
| int8_t ic_minpower; /* minimum tx power in dBm */ |
| int8_t ic_maxpower_normal; /* backup max tx power for short-range workaround */ |
| int8_t ic_minpower_normal; /* backup min tx power for short-range workaround */ |
| int8_t ic_maxpower_table[PWR_IDX_BF_MAX][PWR_IDX_SS_MAX][PWR_IDX_BW_MAX]; /* the maximum powers for different cases */ |
| u_int32_t ic_radardetected; /* number that radar signal has been detected on this channel */ |
| u_int8_t ic_center_f_40MHz; |
| u_int8_t ic_center_f_80MHz; |
| u_int8_t ic_center_f_160MHz; |
| u_int32_t ic_ext_flags; |
| }; |
| |
| #define IEEE80211_CHAN_MAX 255 |
| #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 *) IEEE80211_CHAN_ANY) |
| |
| #define IEEE80211_RADAR_11HCOUNT 1 |
| #define IEEE80211_DEFAULT_CHANCHANGE_TBTT_COUNT 10 |
| #define IEEE80211_RADAR_TEST_MUTE_CHAN 36 /* Move to channel 36 for mute test */ |
| |
| /* bits 0-3 are for private use by drivers */ |
| /* channel attributes */ |
| #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_RADAR 0x00001000 /* Status: Radar found on 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 with ext channel above */ |
| #define IEEE80211_CHAN_HT40D 0x00040000 /* HT 40 with ext channel below */ |
| #define IEEE80211_CHAN_HT40 0x00080000 /* HT 40 with ext channel above/below */ |
| #define IEEE80211_CHAN_DFS 0x00100000 /* Configuration: DFS-required channel */ |
| #define IEEE80211_CHAN_DFS_CAC_DONE 0x00200000 /* Status: CAC completed */ |
| #define IEEE80211_CHAN_VHT80 0x00400000 /* VHT 80 */ |
| #define IEEE80211_CHAN_DFS_OCAC_DONE 0x00800000 /* Status: Off-channel CAC completed */ |
| #define IEEE80211_CHAN_DFS_CAC_IN_PROGRESS 0x01000000 /* Status: Valid CAC is in progress */ |
| #define IEEE80211_CHAN_WEATHER 0x02000000 /* Configuration: weather channel */ |
| |
| #define IEEE80211_DEFAULT_2_4_GHZ_CHANNEL 1 |
| #define IEEE80211_DEFAULT_5_GHZ_CHANNEL 36 |
| |
| #define IEEE80211_MAX_2_4_GHZ_CHANNELS 13 |
| #define IEEE80211_MAX_5_GHZ_CHANNELS 30 |
| #define IEEE80211_MAX_DUAL_CHANNELS (IEEE80211_MAX_2_4_GHZ_CHANNELS + IEEE80211_MAX_5_GHZ_CHANNELS) |
| #define CHIPID_2_4_GHZ 0 |
| #define CHIPID_5_GHZ 1 |
| #define CHIPID_DUAL 2 |
| |
| /*11AC - 40MHZ flags */ |
| #define IEEE80211_CHAN_VHT40U IEEE80211_CHAN_HT40U /* VHT 40 with ext channel above */ |
| #define IEEE80211_CHAN_VHT40D IEEE80211_CHAN_HT40D /* VHT 40 with ext channel below */ |
| #define IEEE80211_CHAN_VHT40 IEEE80211_CHAN_HT40 /* VHT 40 with ext channel above/below */ |
| /*11AC - 20MHZ flags */ |
| #define IEEE80211_CHAN_VHT20 IEEE80211_CHAN_HT20 /* VHT 20 channel */ |
| |
| /* below are channel ext attributes(ic_ext_flags) */ |
| /* 11AC - 80MHZ flags */ |
| #define IEEE80211_CHAN_VHT80_LL 0x00000001 |
| #define IEEE80211_CHAN_VHT80_LU 0x00000002 |
| #define IEEE80211_CHAN_VHT80_UL 0x00000004 |
| #define IEEE80211_CHAN_VHT80_UU 0x00000008 |
| |
| |
| /* |
| * Useful combinations of channel characteristics. |
| */ |
| #define IEEE80211_CHAN_FHSS \ |
| (IEEE80211_CHAN_2GHZ | IEEE80211_CHAN_GFSK) |
| #define IEEE80211_CHAN_A \ |
| (IEEE80211_CHAN_5GHZ | IEEE80211_CHAN_OFDM) |
| #define IEEE80211_CHAN_B \ |
| (IEEE80211_CHAN_2GHZ | IEEE80211_CHAN_CCK) |
| #define IEEE80211_CHAN_PUREG \ |
| (IEEE80211_CHAN_2GHZ | IEEE80211_CHAN_OFDM) |
| #define IEEE80211_CHAN_G \ |
| (IEEE80211_CHAN_2GHZ | IEEE80211_CHAN_DYN) |
| #define IEEE80211_CHAN_108A \ |
| (IEEE80211_CHAN_5GHZ | IEEE80211_CHAN_OFDM | IEEE80211_CHAN_TURBO) |
| #define IEEE80211_CHAN_108G \ |
| (IEEE80211_CHAN_2GHZ | IEEE80211_CHAN_OFDM | IEEE80211_CHAN_TURBO) |
| #define IEEE80211_CHAN_ST \ |
| (IEEE80211_CHAN_108A | IEEE80211_CHAN_STURBO) |
| #define IEEE80211_CHAN_11N \ |
| (IEEE80211_CHAN_HT20) |
| #define IEEE80211_CHAN_11NG \ |
| (IEEE80211_CHAN_2GHZ | IEEE80211_CHAN_OFDM | IEEE80211_CHAN_HT20) |
| #define IEEE80211_CHAN_11NA \ |
| (IEEE80211_CHAN_5GHZ | IEEE80211_CHAN_OFDM | IEEE80211_CHAN_HT20) |
| #define IEEE80211_CHAN_11NG_HT40U \ |
| (IEEE80211_CHAN_2GHZ | IEEE80211_CHAN_OFDM | IEEE80211_CHAN_HT20 | \ |
| IEEE80211_CHAN_HT40U) |
| #define IEEE80211_CHAN_11NG_HT40D \ |
| (IEEE80211_CHAN_2GHZ |IEEE80211_CHAN_OFDM | IEEE80211_CHAN_HT20 | \ |
| IEEE80211_CHAN_HT40D) |
| #define IEEE80211_CHAN_11NA_HT40U \ |
| (IEEE80211_CHAN_5GHZ |IEEE80211_CHAN_OFDM | IEEE80211_CHAN_HT20 | \ |
| IEEE80211_CHAN_HT40U) |
| #define IEEE80211_CHAN_11NA_HT40D \ |
| (IEEE80211_CHAN_5GHZ |IEEE80211_CHAN_OFDM | IEEE80211_CHAN_HT20 | \ |
| IEEE80211_CHAN_HT40D) |
| #define IEEE80211_CHAN_11NG_HT40 \ |
| (IEEE80211_CHAN_2GHZ | IEEE80211_CHAN_OFDM | IEEE80211_CHAN_HT20 | \ |
| IEEE80211_CHAN_HT40) |
| #define IEEE80211_CHAN_11NA_HT40 \ |
| (IEEE80211_CHAN_5GHZ |IEEE80211_CHAN_OFDM | IEEE80211_CHAN_HT20 | \ |
| IEEE80211_CHAN_HT40) |
| |
| #define IEEE80211_CHAN_11AC \ |
| (IEEE80211_CHAN_5GHZ |IEEE80211_CHAN_OFDM | IEEE80211_CHAN_VHT20 ) |
| #define IEEE80211_CHAN_11AC_VHT40 \ |
| (IEEE80211_CHAN_5GHZ |IEEE80211_CHAN_OFDM | IEEE80211_CHAN_VHT20 | \ |
| IEEE80211_CHAN_VHT40) |
| #define IEEE80211_CHAN_11AC_VHT80 \ |
| (IEEE80211_CHAN_5GHZ |IEEE80211_CHAN_OFDM | IEEE80211_CHAN_VHT20 | \ |
| IEEE80211_CHAN_VHT40 | IEEE80211_CHAN_VHT80 ) |
| |
| #define IEEE80211_CHAN_ALL \ |
| (IEEE80211_CHAN_2GHZ | IEEE80211_CHAN_5GHZ | IEEE80211_CHAN_HT20 | \ |
| IEEE80211_CHAN_HT40U | IEEE80211_CHAN_HT40D | IEEE80211_CHAN_HT40| \ |
| IEEE80211_CHAN_CCK | IEEE80211_CHAN_OFDM | IEEE80211_CHAN_DYN| \ |
| IEEE80211_CHAN_VHT20 | IEEE80211_CHAN_VHT40 | IEEE80211_CHAN_VHT80) |
| |
| #define IEEE80211_CHAN_ALLTURBO \ |
| (IEEE80211_CHAN_ALL | IEEE80211_CHAN_TURBO | IEEE80211_CHAN_STURBO) |
| |
| #define IEEE80211_CHAN_ANYN \ |
| (IEEE80211_CHAN_HT20 | IEEE80211_CHAN_HT40U | IEEE80211_CHAN_HT40D | \ |
| IEEE80211_CHAN_HT40 ) |
| |
| #define IEEE80211_IS_CHAN_CACDONE(_c) \ |
| (((_c)->ic_flags & IEEE80211_CHAN_DFS_CAC_DONE) != 0) |
| #define IEEE80211_IS_CHAN_CAC_IN_PROGRESS(_c) \ |
| (((_c)->ic_flags & IEEE80211_CHAN_DFS_CAC_IN_PROGRESS) != 0) |
| |
| #define IEEE80211_IS_CHAN_FHSS(_c) \ |
| (((_c)->ic_flags & IEEE80211_CHAN_FHSS) == IEEE80211_CHAN_FHSS) |
| #define IEEE80211_IS_CHAN_A(_c) \ |
| (((_c)->ic_flags & IEEE80211_CHAN_A) == IEEE80211_CHAN_A) |
| #define IEEE80211_IS_CHAN_B(_c) \ |
| (((_c)->ic_flags & IEEE80211_CHAN_B) == IEEE80211_CHAN_B) |
| #define IEEE80211_IS_CHAN_PUREG(_c) \ |
| (((_c)->ic_flags & IEEE80211_CHAN_PUREG) == IEEE80211_CHAN_PUREG) |
| #define IEEE80211_IS_CHAN_G(_c) \ |
| (((_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_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) |
| |
| #define IEEE80211_IS_CHAN_2GHZ(_c) \ |
| (((_c)->ic_flags & IEEE80211_CHAN_2GHZ) != 0) |
| #define IEEE80211_IS_CHAN_5GHZ(_c) \ |
| (((_c)->ic_flags & IEEE80211_CHAN_5GHZ) != 0) |
| #define IEEE80211_IS_CHAN_OFDM(_c) \ |
| (((_c)->ic_flags & IEEE80211_CHAN_OFDM) != 0) |
| #define IEEE80211_IS_CHAN_CCK(_c) \ |
| (((_c)->ic_flags & IEEE80211_CHAN_CCK) != 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) \ |
| (((_c)->ic_flags & IEEE80211_CHAN_QUARTER) != 0) |
| #define IEEE80211_IS_CHAN_11N(_c) \ |
| (((_c)->ic_flags & IEEE80211_CHAN_11N) == IEEE80211_CHAN_11N) |
| #define IEEE80211_IS_CHAN_11NG(_c) \ |
| (((_c)->ic_flags & IEEE80211_CHAN_11NG) == IEEE80211_CHAN_11NG) |
| #define IEEE80211_IS_CHAN_11NA(_c) \ |
| (((_c)->ic_flags & IEEE80211_CHAN_11NA) == IEEE80211_CHAN_11NA) |
| #define IEEE80211_IS_CHAN_11AC(_c) \ |
| (((_c)->ic_flags & IEEE80211_CHAN_11AC) == IEEE80211_CHAN_11AC) |
| #define IEEE80211_IS_CHAN_HT40PLUS(_c) \ |
| (((_c)->ic_flags & IEEE80211_CHAN_HT40U) == IEEE80211_CHAN_HT40U) |
| #define IEEE80211_IS_CHAN_HT40MINUS(_c) \ |
| (((_c)->ic_flags & IEEE80211_CHAN_HT40D) == IEEE80211_CHAN_HT40D) |
| #define IEEE80211_IS_CHAN_HT40(_c) \ |
| (IEEE80211_IS_CHAN_HT40PLUS((_c)) || IEEE80211_IS_CHAN_HT40MINUS((_c))) |
| #define IEEE80211_IS_CHAN_11NG_HT40PLUS(_c) \ |
| (IEEE80211_IS_CHAN_11NG((_c)) && IEEE80211_IS_CHAN_HT40PLUS((_c))) |
| #define IEEE80211_IS_CHAN_11NG_HT40MINUS(_c) \ |
| (IEEE80211_IS_CHAN_11NG((_c)) && IEEE80211_IS_CHAN_HT40MINUS((_c))) |
| #define IEEE80211_IS_CHAN_11NA_HT40PLUS(_c) \ |
| (IEEE80211_IS_CHAN_11NA((_c)) && IEEE80211_IS_CHAN_HT40PLUS((_c))) |
| #define IEEE80211_IS_CHAN_11NA_HT40MINUS(_c) \ |
| (IEEE80211_IS_CHAN_11NA((_c)) && IEEE80211_IS_CHAN_HT40MINUS((_c))) |
| #define IEEE80211_IS_CHAN_ANYN(_c) 1 |
| //(((_c)->ic_flags & IEEE80211_CHAN_ANYN)) |
| |
| #define IEEE80211_IS_CHAN_VHT40PLUS(_c) \ |
| (((_c)->ic_flags & IEEE80211_CHAN_VHT40U) == IEEE80211_CHAN_VHT40U) |
| #define IEEE80211_IS_CHAN_VHT40MINUS(_c) \ |
| (((_c)->ic_flags & IEEE80211_CHAN_VHT40D) == IEEE80211_CHAN_VHT40D) |
| #define IEEE80211_IS_CHAN_VHT40(_c) \ |
| (IEEE80211_IS_CHAN_VHT40PLUS(_c) || IEEE80211_IS_CHAN_VHT40MINUS(_c)) |
| #define IEEE80211_IS_CHAN_11AC_VHT40PLUS(_c) \ |
| (IEEE80211_IS_CHAN_11AC(_c) && IEEE80211_IS_CHAN_VHT40PLUS(_c)) |
| #define IEEE80211_IS_CHAN_11AC_VHT40MINUS(_c) \ |
| (IEEE80211_IS_CHAN_11AC(_c) && IEEE80211_IS_CHAN_VHT40MINUS(_c)) |
| |
| #define IEEE80211_IS_CHAN_VHT80_EDGEPLUS(_c) \ |
| (((_c)->ic_ext_flags & IEEE80211_CHAN_VHT80_LL) == IEEE80211_CHAN_VHT80_LL) |
| #define IEEE80211_IS_CHAN_VHT80_CNTRPLUS(_c) \ |
| (((_c)->ic_ext_flags & IEEE80211_CHAN_VHT80_LU) == IEEE80211_CHAN_VHT80_LU) |
| #define IEEE80211_IS_CHAN_VHT80_CNTRMINUS(_c) \ |
| (((_c)->ic_ext_flags & IEEE80211_CHAN_VHT80_UL) == IEEE80211_CHAN_VHT80_UL) |
| #define IEEE80211_IS_CHAN_VHT80_EDGEMINUS(_c) \ |
| (((_c)->ic_ext_flags & IEEE80211_CHAN_VHT80_UU) == IEEE80211_CHAN_VHT80_UU) |
| #define IEEE80211_IS_CHAN_VHT80(_c) \ |
| (IEEE80211_IS_CHAN_VHT80_EDGEPLUS(_c) || IEEE80211_IS_CHAN_VHT80_EDGEMINUS(_c) || \ |
| IEEE80211_IS_CHAN_VHT80_CNTRPLUS(_c) || IEEE80211_IS_CHAN_VHT80_CNTRMINUS(_c)) |
| #define IEEE80211_IS_CHAN_11AC_VHT80_EDGEPLUS(_c) \ |
| (IEEE80211_IS_CHAN_11AC(_c) && IEEE80211_IS_CHAN_VHT80_EDGEPLUS(_c)) |
| #define IEEE80211_IS_CHAN_11AC_VHT80_CNTRPLUS(_c) \ |
| (IEEE80211_IS_CHAN_11AC(_c) && IEEE80211_IS_CHAN_VHT80_CNTRPLUS(_c)) |
| #define IEEE80211_IS_CHAN_11AC_VHT80_CNTRMINUS(_c) \ |
| (IEEE80211_IS_CHAN_11AC(_c) && IEEE80211_IS_CHAN_VHT80_CNTRMINUS(_c)) |
| #define IEEE80211_IS_CHAN_11AC_VHT80_EDGEMINUS(_c) \ |
| (IEEE80211_IS_CHAN_11AC(_c) && IEEE80211_IS_CHAN_VHT80_EDGEMINUS(_c)) |
| |
| /* mode specific macros */ |
| |
| #define IEEE80211_IS_11NG_MODE(_mode) \ |
| (((_mode) == IEEE80211_MODE_11NG) || \ |
| ((_mode) == IEEE80211_MODE_11NG_HT40PLM)) |
| |
| #define IEEE80211_IS_11NA_MODE(_mode) \ |
| (((_mode) == IEEE80211_MODE_11NA) || \ |
| ((_mode) == IEEE80211_MODE_11NA_HT40PM) ) |
| |
| #define IEEE80211_IS_11N_MODE(_mode) \ |
| (IEEE80211_IS_11NA_MODE((_mode)) || IEEE80211_IS_11NG_MODE((_mode))) |
| |
| /* ni_chan encoding for FH phy */ |
| #define IEEE80211_FH_CHANMOD 80 |
| #define IEEE80211_FH_CHAN(set,pat) (((set) - 1) * IEEE80211_FH_CHANMOD + (pat)) |
| #define IEEE80211_FH_CHANSET(chan) ((chan) / IEEE80211_FH_CHANMOD + 1) |
| #define IEEE80211_FH_CHANPAT(chan) ((chan) % IEEE80211_FH_CHANMOD) |
| |
| #define IEEE80211_HTCAP_TXBF_CAP_LEN 4 |
| |
| /* Peer RTS config */ |
| #define IEEE80211_PEER_RTS_OFF 0 |
| #define IEEE80211_PEER_RTS_PMP 1 |
| #define IEEE80211_PEER_RTS_DYN 2 |
| #define IEEE80211_PEER_RTS_MAX 2 |
| #define IEEE80211_PEER_RTS_DEFAULT IEEE80211_PEER_RTS_DYN |
| |
| /* Dynamic WMM */ |
| #define IEEE80211_DYN_WMM_OFF 0 |
| #define IEEE80211_DYN_WMM_ON 1 |
| #define IEEE80211_DYN_WMM_DEFAULT IEEE80211_DYN_WMM_ON |
| |
| #define IEEE80211_DYN_WMM_LOCAL_AIFS_DELTA -2 |
| #define IEEE80211_DYN_WMM_LOCAL_CWMIN_DELTA -2 |
| #define IEEE80211_DYN_WMM_LOCAL_CWMAX_DELTA -3 |
| #define IEEE80211_DYN_WMM_LOCAL_AIFS_MIN {3, 3, 2, 1} |
| #define IEEE80211_DYN_WMM_LOCAL_CWMIN_MIN {2, 4, 2, 2} |
| #define IEEE80211_DYN_WMM_LOCAL_CWMAX_MIN {4, 6, 3, 3} |
| #define IEEE80211_DYN_WMM_BSS_AIFS_DELTA 2 |
| #define IEEE80211_DYN_WMM_BSS_CWMIN_DELTA 2 |
| #define IEEE80211_DYN_WMM_BSS_CWMAX_DELTA 3 |
| #define IEEE80211_DYN_WMM_BSS_AIFS_MAX {4, 5, 4, 3} |
| #define IEEE80211_DYN_WMM_BSS_CWMIN_MAX {4, 6, 4, 3} |
| #define IEEE80211_DYN_WMM_BSS_CWMAX_MAX {6, 8, 6, 5} |
| |
| /* |
| * 802.11 rate set. |
| */ |
| #define IEEE80211_RATE_SIZE 8 /* 802.11 standard */ |
| #define IEEE80211_AG_RATE_MAXSIZE 12 /* Non 11n Rates */ |
| |
| #define IEEE80211_RATE_MAXSIZE 30 /* max rates we'll handle */ |
| #define IEEE80211_HT_RATE_MAXSIZE 77 /* Total number of 802.11n rates */ |
| #define IEEE80211_HT_RATE_SIZE 128 |
| #define IEEE80211_SANITISE_RATESIZE(_rsz) \ |
| ((_rsz > IEEE80211_RATE_MAXSIZE) ? IEEE80211_RATE_MAXSIZE : _rsz) |
| |
| |
| /* For legacy hardware - leaving it as is for now */ |
| |
| #define IEEE80211_RATE_MCS 0x8000 |
| #define IEEE80211_RATE_MCS_VAL 0x7FFF |
| |
| //#define IEEE80211_RATE_IDX_ENTRY(val, idx) (val&(0xff<<(8*idx))>>(idx*8)) |
| #define IEEE80211_RATE_IDX_ENTRY(val, idx) (((val&(0xff<<(idx*8)))>>(idx*8))) |
| |
| /* |
| * 11n A-MPDU & A-MSDU limits . XXX |
| */ |
| #define IEEE80211_AMPDU_LIMIT_MIN (1 * 1024) |
| #define IEEE80211_AMPDU_LIMIT_MAX (64 * 1024 - 1) |
| #define IEEE80211_AMSDU_LIMIT_MAX 4096 |
| |
| |
| /* |
| * 11ac MPDU size limit |
| */ |
| #define IEEE80211_MPDU_VHT_1K 1500 |
| #define IEEE80211_MPDU_VHT_4K 3895 |
| #define IEEE80211_MPDU_VHT_8K 7991 |
| #define IEEE80211_MPDU_VHT_11K 11454 |
| #define IEEE80211_MPDU_ENCAP_OVERHEAD_MAX 64 /* enough for mpdu header 36 + crypto 20 + fcs 4 */ |
| |
| /* |
| * 11n and 11ac AMSDU sizes |
| */ |
| #define IEEE80211_AMSDU_NONE 0 |
| #define IEEE80211_AMSDU_HT_4K 3839 |
| #define IEEE80211_AMSDU_HT_8K 7935 |
| #define IEEE80211_AMSDU_VHT_1K (IEEE80211_MPDU_VHT_1K - IEEE80211_MPDU_ENCAP_OVERHEAD_MAX) |
| #define IEEE80211_AMSDU_VHT_4K (IEEE80211_MPDU_VHT_4K - IEEE80211_MPDU_ENCAP_OVERHEAD_MAX) |
| #define IEEE80211_AMSDU_VHT_8K (IEEE80211_MPDU_VHT_8K - IEEE80211_MPDU_ENCAP_OVERHEAD_MAX) |
| #define IEEE80211_AMSDU_VHT_11K (IEEE80211_MPDU_VHT_11K - IEEE80211_MPDU_ENCAP_OVERHEAD_MAX) |
| |
| /* |
| * 11n MCS set limits |
| */ |
| #define IEEE80211_HT_MAXMCS_SET 10 |
| #define IEEE80211_HT_MAXMCS_SET_SUPPORTED 10 |
| #define IEEE80211_HT_MAXMCS_BASICSET_SUPPORTED 2 |
| #define IEEE80211_MCS_PER_STREAM 8 |
| /* |
| * B0-B2: MCS index, B3-B6: MCS set index, B8: BASIC RATE |
| */ |
| #define IEEE80211_HT_BASIC_RATE 0x80 |
| #define IEEE80211_HT_MCS_MASK 0x07 |
| #define IEEE80211_HT_MCS_SET_MASK 0x78 |
| #define IEEE80211_HT_RATE_TABLE_IDX_MASK 0x7F |
| |
| #define IEEE80211_HT_MCS_VALUE(_v) \ |
| ((_v) & IEEE80211_HT_MCS_MASK) |
| |
| #define IEEE80211_HT_MCS_SET_IDX(_v) \ |
| (((_v) & IEEE80211_HT_MCS_SET_MASK) >> 3) |
| |
| #define IEEE80211_HT_IS_BASIC_RATE(_v) \ |
| (((_v) & IEEE80211_HT_BASIC_RATE) == IEEE80211_HT_BASIC_RATE) |
| |
| /* index number in the set will be (_i - 1) if (_i != 0) */ |
| #define IEEE80211_HT_MCS_IDX(_m,_i) \ |
| { \ |
| u_int8_t temp = (_m); \ |
| _i = 0; \ |
| while (temp) \ |
| { \ |
| temp = temp >> 1; \ |
| _i++; \ |
| } \ |
| if(_i) \ |
| _i--; \ |
| else \ |
| _i = 0xFF; \ |
| } |
| |
| /* rate table index = (MCS set index << 3) + MCS index */ |
| #define IEEE80211_HT_RATE_TABLE_IDX(_s,_i) \ |
| (((_s) << 3) + (_i)) |
| |
| /* Supported rate label */ |
| #define IEEE80211_RATE_11MBPS 22 |
| |
| #if 0 |
| /* integer portion of HT rates */ |
| u_int16_t ht_rate_table_20MHz_400[] = { |
| 7, |
| 14, |
| 21, |
| 28, |
| 43, |
| 57, |
| 65, |
| 72, |
| 14, |
| 28, |
| 43, |
| 57, |
| 86, |
| 115, |
| 130, |
| 144 |
| }; |
| |
| u_int16_t ht_rate_table_20MHz_800[] = { |
| 6, |
| 13, |
| 19, |
| 26, |
| 39, |
| 52, |
| 58, |
| 65, |
| 13, |
| 26, |
| 39, |
| 52, |
| 78, |
| 104, |
| 117, |
| 130 |
| }; |
| |
| u_int16_t ht_rate_table_40MHz_400[] = { |
| 15, |
| 30, |
| 45, |
| 60, |
| 90, |
| 120, |
| 135, |
| 150, |
| 30, |
| 60, |
| 90, |
| 120, |
| 180, |
| 240, |
| 270, |
| 300 |
| }; |
| |
| u_int16_t ht_rate_table_40MHz_800[] = { |
| 13, |
| 27, |
| 40, |
| 54, |
| 81, |
| 108, |
| 121, |
| 135, |
| 27, |
| 54, |
| 81, |
| 108, |
| 162, |
| 216, |
| 243, |
| 270 |
| }; |
| #endif |
| |
| struct ieee80211_rateset { |
| u_int8_t rs_legacy_nrates; /* Number of legacy rates */ |
| u_int8_t rs_nrates; /* Total rates = Legacy + 11n */ |
| u_int8_t rs_rates[IEEE80211_RATE_MAXSIZE]; |
| }; |
| |
| struct ieee80211_ht_rateset { |
| u_int8_t rs_legacy_nrates; /* Number of legacy rates */ |
| u_int8_t rs_nrates; /* Total rates = Legacy + 11n */ |
| u_int8_t rs_rates[IEEE80211_HT_RATE_MAXSIZE]; |
| }; |
| |
| struct ieee80211_roam { |
| int8_t rssi11a; /* rssi thresh for 11a bss */ |
| int8_t rssi11b; /* for 11g sta in 11b bss */ |
| int8_t rssi11bOnly; /* for 11b sta */ |
| u_int8_t pad1; |
| u_int8_t rate11a; /* rate thresh for 11a bss */ |
| u_int8_t rate11b; /* for 11g sta in 11b bss */ |
| u_int8_t rate11bOnly; /* for 11b sta */ |
| u_int8_t pad2; |
| }; |
| struct ieee80211_htcap { |
| u_int16_t cap; /* HT capabilities */ |
| u_int8_t numtxspstr; /* Number of Tx spatial streams */ |
| u_int8_t numrxstbcstr; /* Number of Rx stbc streams */ |
| u_int8_t pwrsave; /* HT power save mode */ |
| u_int8_t mpduspacing; /* MPDU density */ |
| u_int16_t maxmsdu; /* Max MSDU size */ |
| u_int16_t maxampdu; /* maximum rx A-MPDU factor */ |
| u_int8_t mcsset[IEEE80211_HT_MAXMCS_SET_SUPPORTED]; /* HT MCS set */ |
| u_int16_t maxdatarate; /* HT max data rate */ |
| u_int16_t extcap; /* HT extended capability */ |
| u_int8_t mcsparams; /* HT MCS params */ |
| u_int8_t hc_txbf[IEEE80211_HTCAP_TXBF_CAP_LEN]; /* HT transmit beamforming capabilities */ |
| } __packed; |
| |
| struct ieee80211_htinfo { |
| u_int8_t ctrlchannel; /* control channel */ |
| u_int8_t byte1; /* ht ie byte 1 */ |
| u_int8_t byte2; /* ht ie byte 2 */ |
| u_int8_t byte3; /* ht ie byte 3 */ |
| u_int8_t byte4; /* ht ie byte 4 */ |
| u_int8_t byte5; /* ht ie byte 5 */ |
| u_int8_t sigranularity; /* signal granularity */ |
| u_int8_t choffset; /* external channel offset */ |
| u_int8_t opmode; /* operational mode */ |
| u_int8_t basicmcsset[IEEE80211_HT_MAXMCS_BASICSET_SUPPORTED]; /* basic MCS set */ |
| } __packed; |
| |
| /* VHT capabilities MIB */ |
| |
| /* Maximum MPDU Length B0-1 */ |
| enum ieee80211_vht_maxmpdu { |
| IEEE80211_VHTCAP_MAX_MPDU_3895 = 0, |
| IEEE80211_VHTCAP_MAX_MPDU_7991, |
| IEEE80211_VHTCAP_MAX_MPDU_11454, |
| IEEE80211_VHTCAP_MAX_MPDU_RESERVED, |
| }; |
| |
| /* Supported Channel Width Set B2-3 */ |
| enum ieee80211_vht_chanwidth { |
| IEEE80211_VHTCAP_CW_80M_ONLY = 0, |
| IEEE80211_VHTCAP_CW_160M, |
| IEEE80211_VHTCAP_CW_160_AND_80P80M, |
| IEEE80211_VHTCAP_CW_RESERVED, |
| }; |
| |
| /* RX STBC B8-10 */ |
| enum ieee80211_vht_rxstbc { |
| IEEE80211_VHTCAP_RX_STBC_NA = 0, |
| IEEE80211_VHTCAP_RX_STBC_UPTO_1, |
| IEEE80211_VHTCAP_RX_STBC_UPTO_2, |
| IEEE80211_VHTCAP_RX_STBC_UPTO_3, |
| IEEE80211_VHTCAP_RX_STBC_UPTO_4, |
| }; |
| |
| /* RX STS B13-15 */ |
| enum ieee80211_vht_rxsts { |
| IEEE80211_VHTCAP_RX_STS_1 = 0, |
| IEEE80211_VHTCAP_RX_STS_2, |
| IEEE80211_VHTCAP_RX_STS_3, |
| IEEE80211_VHTCAP_RX_STS_4, |
| IEEE80211_VHTCAP_RX_STS_5, |
| IEEE80211_VHTCAP_RX_STS_6, |
| IEEE80211_VHTCAP_RX_STS_7, |
| IEEE80211_VHTCAP_RX_STS_8 |
| }; |
| |
| /* SOUNDING DIM B16-18 */ |
| enum ieee80211_vht_numsnd { |
| IEEE80211_VHTCAP_SNDDIM_1 = 0, |
| IEEE80211_VHTCAP_SNDDIM_2, |
| IEEE80211_VHTCAP_SNDDIM_3, |
| IEEE80211_VHTCAP_SNDDIM_4, |
| IEEE80211_VHTCAP_SNDDIM_5, |
| IEEE80211_VHTCAP_SNDDIM_6, |
| IEEE80211_VHTCAP_SNDDIM_7, |
| IEEE80211_VHTCAP_SNDDIM_8 |
| }; |
| |
| /* Maximum A-MPDU Length exponent B23-25 */ |
| /* 2^(13 + Max A-MPDU) -1 */ |
| enum ieee80211_vht_maxampduexp { |
| IEEE80211_VHTCAP_MAX_A_MPDU_8191, /* (2^13) -1 */ |
| IEEE80211_VHTCAP_MAX_A_MPDU_16383, /* (2^14) -1 */ |
| IEEE80211_VHTCAP_MAX_A_MPDU_32767, /* (2^15) -1 */ |
| IEEE80211_VHTCAP_MAX_A_MPDU_65535, /* (2^16) -1 */ |
| IEEE80211_VHTCAP_MAX_A_MPDU_131071, /* (2^17) -1 */ |
| IEEE80211_VHTCAP_MAX_A_MPDU_262143, /* (2^18) -1 */ |
| IEEE80211_VHTCAP_MAX_A_MPDU_524287, /* (2^19) -1 */ |
| IEEE80211_VHTCAP_MAX_A_MPDU_1048575, /* (2^20) -1 */ |
| }; |
| |
| /* VHT link Adaptation capable B26-27 */ |
| enum ieee80211_vht_lnkadptcap { |
| IEEE80211_VHTCAP_LNKADAPTCAP_NO_FEEDBACK, |
| IEEE80211_VHTCAP_LNKADAPTCAP_RESERVED, |
| IEEE80211_VHTCAP_LNKADAPTCAP_UNSOLICITED, |
| IEEE80211_VHTCAP_LNKADAPTCAP_BOTH, |
| }; |
| |
| /* VHT MCS supported */ |
| enum ieee80211_vht_mcs_supported { |
| IEEE80211_VHT_MCS_0_7, |
| IEEE80211_VHT_MCS_0_8, |
| IEEE80211_VHT_MCS_0_9, |
| IEEE80211_VHT_MCS_NA, // Spatial stream not supported |
| }; |
| |
| /* VHT NSS */ |
| enum ieee80211_vht_nss { |
| IEEE80211_VHT_NSS1 = 1, |
| IEEE80211_VHT_NSS2, |
| IEEE80211_VHT_NSS3, |
| IEEE80211_VHT_NSS4, |
| IEEE80211_VHT_NSS5, |
| IEEE80211_VHT_NSS6, |
| IEEE80211_VHT_NSS7, |
| IEEE80211_VHT_NSS8, |
| }; |
| |
| struct ieee80211_vhtcap { |
| u_int32_t cap_flags; |
| u_int32_t maxmpdu; |
| u_int32_t chanwidth; |
| u_int32_t rxstbc; |
| u_int8_t bfstscap; |
| u_int8_t numsounding; |
| u_int32_t maxampduexp; |
| u_int32_t lnkadptcap; |
| u_int16_t rxmcsmap; |
| u_int16_t rxlgimaxrate; |
| u_int16_t txmcsmap; |
| u_int16_t txlgimaxrate; |
| u_int8_t bfstscap_save; |
| } __packed; |
| |
| /* VHT capability macros */ |
| #define VHT_SUPPORTS_MCS0_9_FOR_4SS_BIT 0x0080 |
| #define VHT_SUPPORTS_MCS0_8_FOR_4SS_BIT 0x0040 |
| #define VHT_SUPPORTS_MCS0_9_FOR_3SS_BIT 0x0020 |
| #define VHT_SUPPORTS_MCS0_8_FOR_3SS_BIT 0x0010 |
| #define VHT_SUPPORTS_MCS0_9_FOR_2SS_BIT 0x0008 |
| #define VHT_SUPPORTS_MCS0_8_FOR_2SS_BIT 0x0004 |
| #define VHT_SUPPORTS_MCS0_9_FOR_1SS_BIT 0x0002 |
| #define VHT_SUPPORTS_MCS0_8_FOR_1SS_BIT 0x0001 |
| |
| #define IEEE80211_VHT_HAS_4SS(rxmcsmap) \ |
| !((rxmcsmap & VHT_SUPPORTS_MCS0_9_FOR_4SS_BIT) && \ |
| (rxmcsmap & VHT_SUPPORTS_MCS0_8_FOR_4SS_BIT)) |
| |
| #define IEEE80211_VHT_HAS_3SS(rxmcsmap) \ |
| !((rxmcsmap & VHT_SUPPORTS_MCS0_9_FOR_3SS_BIT) && \ |
| (rxmcsmap & VHT_SUPPORTS_MCS0_8_FOR_3SS_BIT)) |
| |
| #define IEEE80211_VHT_HAS_2SS(rxmcsmap) \ |
| !((rxmcsmap & VHT_SUPPORTS_MCS0_9_FOR_2SS_BIT) && \ |
| (rxmcsmap & VHT_SUPPORTS_MCS0_8_FOR_2SS_BIT)) |
| |
| #define IEEE80211_VHT_SUPPORTS_MCS0_8_FOR_4SS(rxmcsmap) \ |
| ((rxmcsmap & VHT_SUPPORTS_MCS0_8_FOR_4SS_BIT) && \ |
| !(rxmcsmap & VHT_SUPPORTS_MCS0_9_FOR_4SS_BIT)) |
| |
| #define IEEE80211_VHT_SUPPORTS_MCS0_9_FOR_4SS(rxmcsmap) \ |
| ((rxmcsmap & VHT_SUPPORTS_MCS0_9_FOR_4SS_BIT) && \ |
| !(rxmcsmap & VHT_SUPPORTS_MCS0_8_FOR_4SS_BIT)) |
| |
| #define IEEE80211_VHT_SUPPORTS_MCS0_8_FOR_3SS(rxmcsmap) \ |
| ((rxmcsmap & VHT_SUPPORTS_MCS0_8_FOR_3SS_BIT) && \ |
| !(rxmcsmap & VHT_SUPPORTS_MCS0_9_FOR_3SS_BIT)) |
| |
| #define IEEE80211_VHT_SUPPORTS_MCS0_9_FOR_3SS(rxmcsmap) \ |
| ((rxmcsmap & VHT_SUPPORTS_MCS0_9_FOR_3SS_BIT) && \ |
| !(rxmcsmap & VHT_SUPPORTS_MCS0_8_FOR_3SS_BIT)) |
| |
| #define IEEE80211_VHT_SUPPORTS_MCS0_8_FOR_2SS(rxmcsmap) \ |
| ((rxmcsmap & VHT_SUPPORTS_MCS0_8_FOR_2SS_BIT) && \ |
| !(rxmcsmap & VHT_SUPPORTS_MCS0_9_FOR_2SS_BIT)) |
| |
| #define IEEE80211_VHT_SUPPORTS_MCS0_9_FOR_2SS(rxmcsmap) \ |
| ((rxmcsmap & VHT_SUPPORTS_MCS0_9_FOR_2SS_BIT) && \ |
| !(rxmcsmap & VHT_SUPPORTS_MCS0_8_FOR_2SS_BIT)) |
| |
| #define IEEE80211_VHT_SUPPORTS_MCS0_8_FOR_1SS(rxmcsmap) \ |
| ((rxmcsmap & VHT_SUPPORTS_MCS0_8_FOR_1SS_BIT) && \ |
| !(rxmcsmap & VHT_SUPPORTS_MCS0_9_FOR_1SS_BIT)) |
| |
| #define IEEE80211_VHT_SUPPORTS_MCS0_9_FOR_1SS(rxmcsmap) \ |
| ((rxmcsmap & VHT_SUPPORTS_MCS0_9_FOR_1SS_BIT) && \ |
| !(rxmcsmap & VHT_SUPPORTS_MCS0_8_FOR_1SS_BIT)) |
| |
| /* VHT Operation element */ |
| /* VHT Operation Information subfields */ |
| enum ieee80211_vhtop_chanwidth { |
| IEEE80211_VHTOP_CHAN_WIDTH_20_40MHZ, |
| IEEE80211_VHTOP_CHAN_WIDTH_80MHZ, |
| IEEE80211_VHTOP_CHAN_WIDTH_160MHZ, |
| IEEE80211_VHTOP_CHAN_WIDTH_80PLUS80MHZ, |
| }; |
| |
| #define IEEE80211_VHT_MAXMCS_SET_SUPPORTED 10 |
| |
| struct ieee80211_vhtop { |
| u_int32_t chanwidth; |
| u_int8_t centerfreq0; |
| u_int8_t centerfreq1; |
| u_int16_t basicvhtmcsnssset; |
| } __packed; |
| |
| /* Max number of MU groups */ |
| #define IEEE80211_MU_GRP_NUM_MAX 64 |
| |
| /* Max number of nodes in a MU group */ |
| #define IEEE80211_MU_GRP_NODES_MAX 4 |
| |
| /* VHT MU membership & user position arrays */ |
| struct ieee80211_vht_mu_grp { |
| #define IEEE80211_VHT_GRP_1ST_BIT_OFFSET 1 |
| #define IEEE80211_VHT_GRP_MAX_BIT_OFFSET 62 |
| #define IEEE80211_VHT_GRP_MEMBERSHIP_ARRAY_SIZE (IEEE80211_MU_GRP_NUM_MAX/(sizeof(u_int8_t)*8)) |
| #define IEEE80211_VHT_USR_POS_ARRAY_SIZE ((IEEE80211_MU_GRP_NODES_MAX >> 1)* \ |
| IEEE80211_MU_GRP_NUM_MAX/(sizeof(u_int8_t)*8)) |
| u_int8_t member[IEEE80211_VHT_GRP_MEMBERSHIP_ARRAY_SIZE]; |
| u_int8_t pos[IEEE80211_VHT_USR_POS_ARRAY_SIZE]; |
| } __packed; |
| |
| struct ieee80211_action_data { |
| u_int8_t cat; /* category identifier */ |
| u_int8_t action; /* action identifier */ |
| void *params; |
| }; |
| |
| struct ba_action_req { |
| u_int8_t tid; /* TID */ |
| u_int16_t seq; /* sequence number of first frame to be block acked */ |
| u_int8_t frag; /* fragment number of first frame to be block acked */ |
| enum ieee80211_ba_type type;/* block ack type */ |
| u_int16_t buff_size; /* suggested re-order buffer size */ |
| u_int16_t timeout; /* block ack timeout if no transfer */ |
| }; |
| |
| struct ba_action_resp { |
| u_int8_t tid; /* TID */ |
| u_int16_t seq; /* sequence number of first frame to be block acked */ |
| u_int8_t frag; /* fragment number of first frame to be block acked */ |
| enum ieee80211_ba_type type;/* block ack type */ |
| u_int16_t buff_size; /* actual re-order buffer size */ |
| u_int16_t reason; /* block ack negotiation status */ |
| u_int16_t timeout; /* negotiated block ack timeout if no transfer */ |
| }; |
| |
| struct ba_action_del { |
| u_int8_t tid; /* TID */ |
| u_int16_t reason; /* block ack termination reason */ |
| u_int8_t initiator; /* initiator/ recipient of block ack negotiation */ |
| }; |
| |
| struct ht_action_nc_beamforming { |
| u_int16_t num_sts; /* number of space time streams, Nc */ |
| u_int16_t num_txchains; /* number of transmit chains, Nr */ |
| u_int8_t snr[2]; /* SNR for received space time streams */ |
| u_int16_t size_matrices; /* size of beamforming matrices in bytes */ |
| u_int8_t *matrices; /* pointer to beamforming matrices */ |
| u_int8_t bw_mode; /* bwmode = 0 for 20Mhz and 1 for 40 M */ |
| |
| }; |
| |
| struct ht_action_channelswitch { |
| u_int8_t ch_width; /* switched channel width */ |
| }; |
| |
| struct ht_action_sm_powersave { |
| u_int8_t sm_power_mode; /* new power mode */ |
| u_int8_t sm_power_enabled; /* power save enabled */ |
| }; |
| |
| struct ht_action_antennasel { |
| u_int8_t antenna_sel; /* antenna selection: bit number corresponds |
| to antenna number */ |
| }; |
| |
| struct ht_action_mimo_ctrl { |
| u_int8_t num_columns; /* Nc in received beamforming matrices */ |
| u_int8_t num_rows; /* Nr in received beamforming matrices */ |
| u_int8_t chan_width; /* Channel Width 0=20, 1 =40 */ |
| u_int8_t num_grouping; /* Ng in received beamforming matrices */ |
| u_int8_t num_coeffsize; /* Nb in received beamforming matrices */ |
| u_int8_t snr[2]; /* SNR as seen by sender of action frame */ |
| u_int32_t matrices[1024]; /* pointer to beamforming matrices, |
| contents must be copied */ |
| }; |
| |
| #ifdef CONFIG_QVSP |
| /** |
| * The following structure definitions are for passing in data to the |
| * management send function to generate action frames for VSP. |
| */ |
| struct ieee80211_qvsp_act { |
| uint8_t oui[3]; |
| uint8_t type; |
| }; |
| |
| struct ieee80211_qvsp_strm_id { |
| union { |
| struct in6_addr ipv6; |
| __be32 ipv4; |
| } saddr; |
| union { |
| struct in6_addr ipv6; |
| __be32 ipv4; |
| } daddr; |
| __be16 sport; |
| __be16 dport; |
| uint8_t ip_version; |
| uint8_t ip_proto; |
| uint8_t ac; |
| } __packed; |
| |
| #define IEEE8021_QVSP_MAX_ACT_ITEMS 32 |
| |
| struct ieee80211_qvsp_strm_dis_attr { |
| uint32_t throt_policy; |
| uint32_t throt_rate; |
| uint32_t demote_rule; |
| uint32_t demote_state; |
| }; |
| |
| struct ieee80211_qvsp_act_strm_ctrl { |
| struct ieee80211_qvsp_act header; |
| uint8_t strm_state; |
| uint8_t count; |
| struct ieee80211_qvsp_strm_dis_attr dis_attr; |
| struct ieee80211_qvsp_strm_id strm_items[IEEE8021_QVSP_MAX_ACT_ITEMS]; |
| }; |
| |
| struct ieee80211_qvsp_act_cfg_item { |
| uint32_t index; |
| uint32_t value; |
| }; |
| |
| struct ieee80211_qvsp_act_cfg { |
| struct ieee80211_qvsp_act header; |
| uint8_t count; |
| struct ieee80211_qvsp_act_cfg_item cfg_items[IEEE8021_QVSP_MAX_ACT_ITEMS]; |
| }; |
| #endif |
| |
| typedef void (*ppq_callback_success)(void *ctx); |
| typedef void (*ppq_callback_fail)(void *ctx, int32_t reason); |
| |
| struct ieee80211_meas_request_ctrl { |
| u_int8_t meas_type; |
| unsigned long expire; |
| ppq_callback_success fn_success; |
| ppq_callback_fail fn_fail; |
| union { |
| struct _req_basic { |
| u_int64_t start_tsf; |
| u_int16_t duration_ms; |
| u_int8_t channel; |
| } basic; |
| struct _req_cca { |
| u_int64_t start_tsf; |
| u_int16_t duration_ms; |
| u_int8_t channel; |
| } cca; |
| struct _req_rpi { |
| u_int64_t start_tsf; |
| u_int16_t duration_ms; |
| u_int8_t channel; |
| } rpi; |
| struct _req_sta_stats { |
| void *sub_item; |
| u_int16_t duration_tu; |
| u_int8_t group_id; |
| } sta_stats; |
| struct _req_qtn_cca { |
| u_int16_t duration_tu; |
| } qtn_cca; |
| struct _req_chan_load { |
| u_int8_t channel; |
| u_int16_t duration_ms; |
| } chan_load; |
| struct _req_noise_his { |
| u_int8_t channel; |
| u_int16_t duration_ms; |
| } noise_his; |
| struct _req_beacon { |
| u_int8_t op_class; |
| u_int8_t channel; |
| u_int8_t duration_ms; |
| u_int8_t mode; |
| u_int8_t bssid[6]; |
| } beacon; |
| struct _req_frame { |
| u_int8_t op_class; |
| u_int8_t channel; |
| u_int16_t duration_ms; |
| u_int8_t type; |
| u_int8_t mac_address[6]; |
| } frame; |
| struct _req_tran_stream_cat { |
| u_int16_t duration_ms; |
| u_int8_t peer_sta[6]; |
| u_int8_t tid; |
| u_int8_t bin0; |
| } tran_stream_cat; |
| struct _req_multicast_diag { |
| u_int16_t duration_ms; |
| u_int8_t group_mac[6]; |
| } multicast_diag; |
| } u; |
| }; |
| |
| struct ieee80211_meas_report_ctrl { |
| u_int8_t meas_type; |
| u_int8_t report_mode; |
| u_int8_t token; /* dialog token */ |
| u_int8_t meas_token; /* measurement token */ |
| u_int8_t autonomous; /* 1: autonomous report */ |
| union { |
| struct _rep_basic { |
| u_int8_t channel; |
| u_int8_t basic_report; |
| u_int16_t duration_tu; |
| u_int64_t start_tsf; |
| } basic; |
| struct _rep_cca { |
| u_int8_t channel; |
| u_int8_t cca_report; |
| u_int16_t duration_tu; |
| u_int64_t start_tsf; |
| } cca; |
| struct _rep_rpi { |
| u_int64_t start_tsf; |
| u_int16_t duration_tu; |
| u_int8_t channel; |
| u_int8_t rpi_report[8]; |
| } rpi; |
| struct _rep_sta_stats { |
| void *sub_item; |
| u_int16_t duration_tu; |
| u_int8_t group_id; |
| } sta_stats; |
| struct _rep_qtn_cca { |
| u_int64_t start_tsf; |
| u_int16_t duration_ms; |
| u_int8_t channel; |
| u_int8_t qtn_cca_report; |
| u_int32_t sp_fail; |
| u_int32_t lp_fail; |
| u_int16_t others_time; |
| u_int8_t *extra_ie; |
| u_int16_t extra_ie_len; |
| } qtn_cca; |
| struct _rep_chan_load { |
| u_int8_t op_class; |
| u_int8_t channel; |
| u_int16_t duration_tu; |
| u_int8_t channel_load; |
| } chan_load; |
| struct _rep_noise_his { |
| u_int8_t op_class; |
| u_int8_t channel; |
| u_int16_t duration_tu; |
| u_int8_t antenna_id; |
| u_int8_t anpi; |
| u_int8_t ipi[11]; |
| } noise_his; |
| struct _rep_beacon { |
| u_int8_t op_class; |
| u_int8_t channel; |
| u_int16_t duration_tu; |
| u_int8_t reported_frame_info; |
| u_int8_t rcpi; |
| u_int8_t rsni; |
| u_int8_t bssid[6]; |
| u_int8_t antenna_id; |
| u_int8_t parent_tsf[4]; |
| } beacon; |
| struct _rep_frame { |
| void *sub_item; |
| u_int8_t op_class; |
| u_int8_t channel; |
| u_int16_t duration_tu; |
| } frame; |
| struct _rep_tran_stream_cat { |
| u_int16_t duration_tu; |
| u_int8_t peer_sta[6]; |
| u_int8_t tid; |
| u_int8_t reason; |
| u_int32_t tran_msdu_cnt; |
| u_int32_t msdu_discard_cnt; |
| u_int32_t msdu_fail_cnt; |
| u_int32_t msdu_mul_retry_cnt; |
| u_int32_t qos_lost_cnt; |
| u_int32_t avg_queue_delay; |
| u_int32_t avg_tran_delay; |
| u_int8_t bin0_range; |
| u_int32_t bins[6]; |
| } tran_stream_cat; |
| struct _rep_multicast_diag { |
| u_int16_t duration_tu; |
| u_int8_t group_mac[6]; |
| u_int8_t reason; |
| u_int32_t mul_rec_msdu_cnt; |
| u_int16_t first_seq_num; |
| u_int16_t last_seq_num; |
| u_int16_t mul_rate; |
| } multicast_diag; |
| } u; |
| }; |
| |
| struct stastats_subele_vendor { |
| u_int32_t flags; |
| u_int8_t sequence; |
| }; |
| |
| struct frame_report_subele_frame_count { |
| u_int8_t ta[6]; |
| u_int8_t bssid[6]; |
| u_int8_t phy_type; |
| u_int8_t avg_rcpi; |
| u_int8_t last_rsni; |
| u_int8_t last_rcpi; |
| u_int8_t antenna_id; |
| u_int16_t frame_count; |
| }; |
| |
| /* TPC actions */ |
| struct ieee80211_action_tpc_request { |
| unsigned long expire; |
| ppq_callback_success fn_success; |
| ppq_callback_fail fn_fail; |
| }; |
| |
| struct ieee80211_action_tpc_report { |
| uint8_t rx_token; |
| int8_t tx_power; |
| int8_t link_margin; |
| }; |
| |
| struct ppq_request_param { |
| unsigned long expire; |
| ppq_callback_success fn_success; |
| ppq_callback_fail fn_fail; |
| }; |
| |
| struct ieee80211_link_measure_request { |
| struct ppq_request_param ppq; |
| }; |
| |
| struct ieee80211_link_measure_report { |
| uint8_t token; |
| struct ieee80211_action_tpc_report tpc_report; |
| uint8_t recv_antenna_id; |
| uint8_t tran_antenna_id; |
| uint8_t rcpi; |
| uint8_t rsni; |
| }; |
| |
| struct ieee80211_neighbor_report_request { |
| struct ppq_request_param ppq; |
| }; |
| |
| struct ieee80211_neighbor_report_request_item { |
| uint8_t bssid[6]; |
| uint32_t bssid_info; |
| uint8_t operating_class; |
| uint8_t channel; |
| uint8_t phy_type; |
| }; |
| |
| struct ieee80211_neighbor_report_response { |
| uint8_t token; |
| uint8_t bss_num; |
| struct ieee80211_neighbor_report_request_item *neighbor_report_ptr[32]; |
| }; |
| |
| #define IEEE80211_MAXIMUM_TIMESTAMP_DIFF_NC_BF 1000000 |
| |
| #define IEEE80211_TXPOWER_MAX 100 /* .5 dBm units */ |
| #define IEEE80211_TXPOWER_MIN 0 /* kill radio */ |
| |
| #define IEEE80211_DTIM_MAX 15 /* max DTIM period */ |
| #define IEEE80211_DTIM_MIN 1 /* min DTIM period */ |
| #define IEEE80211_DTIM_DEFAULT 3 /* default DTIM period */ |
| |
| #define IEEE80211_BINTVAL_MAX 5000 /* max beacon interval (TU's) */ |
| #define IEEE80211_BINTVAL_MIN 25 /* min beacon interval (TU's) */ |
| #define IEEE80211_BINTVAL_DEFAULT 100 /* default beacon interval (TU's) */ |
| #define IEEE80211_BINTVAL_VALID(_bi) \ |
| ((IEEE80211_BINTVAL_MIN <= (_bi)) && \ |
| ((_bi) <= IEEE80211_BINTVAL_MAX)) |
| #define IEEE80211_BINTVAL_SANITISE(_bi) \ |
| (IEEE80211_BINTVAL_VALID(_bi) ? \ |
| (_bi) : IEEE80211_BINTVAL_DEFAULT) |
| |
| #define IEEE80211_SCAN_TBL_LEN_MAX_DFLT 2000 |
| |
| #define IEEE80211_BWSTR_20 "20" |
| #define IEEE80211_BWSTR_40 "40" |
| #define IEEE80211_BWSTR_80 "80" |
| #define IEEE80211_BWSTR_160 "160" |
| #define IEEE80211_BWSTR_80P80 "80+80" |
| |
| #endif /* _NET80211__IEEE80211_H_ */ |