0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc/*
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * Use is subject to license terms.
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc
976d66ab3c04344d31957f85ffb1600cf5847fc9Hans Rosenfeld/*
976d66ab3c04344d31957f85ffb1600cf5847fc9Hans Rosenfeld * Copyright 2016 Hans Rosenfeld <rosenfeld@grumpf.hope-2000.org>
976d66ab3c04344d31957f85ffb1600cf5847fc9Hans Rosenfeld */
976d66ab3c04344d31957f85ffb1600cf5847fc9Hans Rosenfeld
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc/*
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * Copyright (c) 2001 Atsushi Onoe
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * Copyright (c) 2002-2005 Sam Leffler, Errno Consulting
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * All rights reserved.
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc *
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * Redistribution and use in source and binary forms, with or without
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * modification, are permitted provided that the following conditions
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * are met:
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * 1. Redistributions of source code must retain the above copyright
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * notice, this list of conditions and the following disclaimer.
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * 2. Redistributions in binary form must reproduce the above copyright
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * notice, this list of conditions and the following disclaimer in the
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * documentation and/or other materials provided with the distribution.
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * 3. The name of the author may not be used to endorse or promote products
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * derived from this software without specific prior written permission.
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc *
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * Alternatively, this software may be distributed under the terms of the
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * GNU General Public License ("GPL") version 2 as published by the Free
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * Software Foundation.
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc *
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#ifndef _SYS_NET80211_H
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#define _SYS_NET80211_H
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#include <sys/mac.h>
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer#include <sys/mac_provider.h>
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#include <sys/ethernet.h>
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#include <sys/net80211_proto.h>
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#include <sys/net80211_crypto.h>
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang#include <sys/net80211_ht.h>
976d66ab3c04344d31957f85ffb1600cf5847fc9Hans Rosenfeld#include <sys/net80211_amrr.h>
a399b7655a1d835aa8606c2b29e4e777baac8635zf#include <net/wpa.h>
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc/*
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * IEEE802.11 kernel support module
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#ifdef __cplusplus
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxcextern "C" {
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#endif
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc/* ic_caps */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#define IEEE80211_C_WEP 0x00000001 /* CAPABILITY: WEP available */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#define IEEE80211_C_TKIP 0x00000002 /* CAPABILITY: TKIP available */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#define IEEE80211_C_AES 0x00000004 /* CAPABILITY: AES OCB avail */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#define IEEE80211_C_AES_CCM 0x00000008 /* CAPABILITY: AES CCM avail */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#define IEEE80211_C_CKIP 0x00000010 /* CAPABILITY: CKIP available */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#define IEEE80211_C_FF 0x00000040 /* CAPABILITY: ATH FF avail */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#define IEEE80211_C_TURBOP 0x00000080
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc /* CAPABILITY: ATH Turbo available */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#define IEEE80211_C_IBSS 0x00000100 /* CAPABILITY: IBSS available */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#define IEEE80211_C_PMGT 0x00000200 /* CAPABILITY: Power mgmt */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#define IEEE80211_C_HOSTAP 0x00000400 /* CAPABILITY: HOSTAP avail */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#define IEEE80211_C_AHDEMO 0x00000800 /* CAPABILITY: Old Adhoc Demo */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#define IEEE80211_C_SWRETRY 0x00001000 /* CAPABILITY: sw tx retry */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#define IEEE80211_C_TXPMGT 0x00002000 /* CAPABILITY: tx power mgmt */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#define IEEE80211_C_SHSLOT 0x00004000 /* CAPABILITY: short slottime */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#define IEEE80211_C_SHPREAMBLE 0x00008000 /* CAPABILITY: short preamble */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#define IEEE80211_C_MONITOR 0x00010000 /* CAPABILITY: monitor mode */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#define IEEE80211_C_TKIPMIC 0x00020000 /* CAPABILITY: TKIP MIC avail */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#define IEEE80211_C_WPA1 0x00800000 /* CAPABILITY: WPA1 avail */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#define IEEE80211_C_WPA2 0x01000000 /* CAPABILITY: WPA2 avail */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#define IEEE80211_C_WPA 0x01800000
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc /* CAPABILITY: WPA1+WPA2 avail */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#define IEEE80211_C_BURST 0x02000000 /* CAPABILITY: frame bursting */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#define IEEE80211_C_WME 0x04000000 /* CAPABILITY: WME avail */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#define IEEE80211_C_WDS 0x08000000 /* CAPABILITY: 4-addr support */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc/* 0x10000000 reserved */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#define IEEE80211_C_BGSCAN 0x20000000 /* CAPABILITY: bg scanning */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#define IEEE80211_C_TXFRAG 0x40000000 /* CAPABILITY: tx fragments */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc/* XXX protection/barker? */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#define IEEE80211_C_CRYPTO 0x0000001f /* CAPABILITY: crypto alg's */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang/*
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang * ic_htcaps: HT-specific device/driver capabilities
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang *
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang * NB: the low 16-bits are the 802.11 definitions, the upper
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang * 16-bits are used to define s/w/driver capabilities.
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang#define IEEE80211_HTC_AMPDU 0x00010000 /* CAPABILITY: A-MPDU tx */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang#define IEEE80211_HTC_AMSDU 0x00020000 /* CAPABILITY: A-MSDU tx */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang/* NB: HT40 is implied by IEEE80211_HTCAP_CHWIDTH40 */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang#define IEEE80211_HTC_HT 0x00040000 /* CAPABILITY: HT operation */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc/* ic_flags */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc/* NB: bits 0x4c available */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#define IEEE80211_F_FF 0x00000001 /* CONF: ATH FF enabled */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#define IEEE80211_F_TURBOP 0x00000002 /* CONF: ATH Turbo enabled */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#define IEEE80211_F_BURST 0x00000004 /* CONF: bursting enabled */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc/* NB: this is intentionally setup to be IEEE80211_CAPINFO_PRIVACY */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#define IEEE80211_F_PRIVACY 0x00000010 /* CONF: privacy enabled */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#define IEEE80211_F_PUREG 0x00000020 /* CONF: 11g w/o 11b sta's */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#define IEEE80211_F_SCANONLY 0x00000040 /* CONF: scan only */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#define IEEE80211_F_SCAN 0x00000080 /* STATUS: scanning */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#define IEEE80211_F_ASCAN 0x00000100 /* STATUS: active scan */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#define IEEE80211_F_SIBSS 0x00000200 /* STATUS: start IBSS */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc/* NB: this is intentionally setup to be IEEE80211_CAPINFO_SHORT_SLOTTIME */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#define IEEE80211_F_SHSLOT 0x00000400
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc /* STATUS: use short slot time */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#define IEEE80211_F_PMGTON 0x00000800 /* CONF: Power mgmt enable */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#define IEEE80211_F_DESBSSID 0x00001000 /* CONF: des_bssid is set */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#define IEEE80211_F_WME 0x00002000 /* CONF: enable WME use */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#define IEEE80211_F_BGSCAN 0x00004000
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc /* CONF: bg scan enabled (???) */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#define IEEE80211_F_SWRETRY 0x00008000 /* CONF: sw tx retry enabled */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#define IEEE80211_F_TXPOW_FIXED 0x00010000 /* TX Power: fixed rate */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#define IEEE80211_F_IBSSON 0x00020000 /* CONF: IBSS creation enable */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#define IEEE80211_F_SHPREAMBLE 0x00040000 /* STATUS: use short preamble */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#define IEEE80211_F_DATAPAD 0x00080000 /* CONF: do alignment pad */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#define IEEE80211_F_USEPROT 0x00100000 /* STATUS: protection enabled */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#define IEEE80211_F_USEBARKER 0x00200000
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc /* STATUS: use barker preamble */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#define IEEE80211_F_TIMUPDATE 0x00400000 /* STATUS: update beacon tim */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#define IEEE80211_F_WPA1 0x00800000 /* CONF: WPA enabled */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#define IEEE80211_F_WPA2 0x01000000 /* CONF: WPA2 enabled */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#define IEEE80211_F_WPA 0x01800000 /* CONF: WPA/WPA2 enabled */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#define IEEE80211_F_DROPUNENC 0x02000000 /* CONF: drop unencrypted */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#define IEEE80211_F_COUNTERM 0x04000000 /* CONF: TKIP countermeasures */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#define IEEE80211_F_HIDESSID 0x08000000 /* CONF: hide SSID in beacon */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#define IEEE80211_F_NOBRIDGE 0x10000000 /* CONF: dis. internal bridge */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#define IEEE80211_F_WMEUPDATE 0x20000000 /* STATUS: update beacon wme */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc/* ic_flags_ext */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang#define IEEE80211_FEXT_NONHT_PR 0x00000001 /* STATUS: non-HT sta present */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang#define IEEE80211_FEXT_INACT 0x00000002 /* CONF: sta inact handling */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc/* 0x00000006 reserved */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#define IEEE80211_FEXT_BGSCAN 0x00000008
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc /* STATUS: enable full bgscan completion */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#define IEEE80211_FEXT_ERPUPDATE 0x00000200 /* STATUS: update ERP element */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#define IEEE80211_FEXT_SWBMISS 0x00000400 /* CONF: do bmiss in s/w */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang#define IEEE80211_FEXT_PROBECHAN 0x00020000 /* CONF: probe passive chan */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang#define IEEE80211_FEXT_HT 0x00080000 /* CONF: HT supported */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang#define IEEE80211_FEXT_AMPDU_TX 0x00100000 /* CONF: A-MPDU tx supported */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang#define IEEE80211_FEXT_AMPDU_RX 0x00200000 /* CONF: A-MPDU tx supported */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang#define IEEE80211_FEXT_AMSDU_TX 0x00400000 /* CONF: A-MSDU tx supported */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang#define IEEE80211_FEXT_AMSDU_RX 0x00800000 /* CONF: A-MSDU tx supported */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang#define IEEE80211_FEXT_USEHT40 0x01000000 /* CONF: 20/40 use enabled */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang#define IEEE80211_FEXT_PUREN 0x02000000 /* CONF: 11n w/o legacy sta's */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang#define IEEE80211_FEXT_SHORTGI20 0x04000000 /* CONF: short GI in HT20 */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang#define IEEE80211_FEXT_SHORTGI40 0x08000000 /* CONF: short GI in HT40 */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang#define IEEE80211_FEXT_HTCOMPAT 0x10000000 /* CONF: HT vendor OUI's */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc/*
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * Channel attributes (ich_flags)
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * bits 0-3 are for private use by drivers
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang#define IEEE80211_CHAN_TURBO 0x00000010 /* Turbo channel */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang#define IEEE80211_CHAN_CCK 0x00000020 /* CCK channel */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang#define IEEE80211_CHAN_OFDM 0x00000040 /* OFDM channel */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang#define IEEE80211_CHAN_2GHZ 0x00000080 /* 2 GHz spectrum channel. */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang#define IEEE80211_CHAN_5GHZ 0x00000100 /* 5 GHz spectrum channel */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang#define IEEE80211_CHAN_PASSIVE 0x00000200 /* Only passive scan allowed */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang#define IEEE80211_CHAN_DYN 0x00000400 /* Dynamic CCK-OFDM channel */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang#define IEEE80211_CHAN_GFSK 0x00000800 /* GFSK channel (FHSS PHY) */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang#define IEEE80211_CHAN_GSM 0x00001000 /* 900 MHz spectrum channel */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang#define IEEE80211_CHAN_STURBO 0x00002000 /* 11a static turbo channel only */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang#define IEEE80211_CHAN_HALF 0x00004000 /* Half rate channel */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang#define IEEE80211_CHAN_QUARTER 0x00008000 /* Quarter rate channel */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang#define IEEE80211_CHAN_HT20 0x00010000 /* HT 20 channel */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang#define IEEE80211_CHAN_HT40U 0x00020000 /* HT 40 channel w/ ext above */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang#define IEEE80211_CHAN_HT40D 0x00040000 /* HT 40 channel w/ ext below */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang#define IEEE80211_CHAN_DFS 0x00080000 /* DFS required */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang#define IEEE80211_CHAN_4MSXMIT 0x00100000 /* 4ms limit on frame length */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang#define IEEE80211_CHAN_NOADHOC 0x00200000 /* adhoc mode not allowed */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang#define IEEE80211_CHAN_NOHOSTAP 0x00400000 /* hostap mode not allowed */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang#define IEEE80211_CHAN_11D 0x00800000 /* 802.11d required */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang#define IEEE80211_CHAN_HT40 (IEEE80211_CHAN_HT40U | IEEE80211_CHAN_HT40D)
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang#define IEEE80211_CHAN_HT (IEEE80211_CHAN_HT20 | IEEE80211_CHAN_HT40)
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#define IEEE80211_CHAN_MAX 255
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#define IEEE80211_CHAN_BYTES 32 /* howmany(IEEE80211_CHAN_MAX, NBBY) */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#define IEEE80211_CHAN_ANY 0xffff /* token for ``any channel'' */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#define IEEE80211_CHAN_ANYC \
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc ((struct ieee80211_channel *)IEEE80211_CHAN_ANY)
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#define IEEE80211_IS_CHAN_2GHZ(_c) \
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc (((_c)->ich_flags & IEEE80211_CHAN_2GHZ) != 0)
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#define IEEE80211_IS_CHAN_5GHZ(_c) \
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc (((_c)->ich_flags & IEEE80211_CHAN_5GHZ) != 0)
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang#define IEEE80211_NODE_CHWUPDATE 0x0400 /* 11n channel width change */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#define IEEE80211_NODE_HASHSIZE 32
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang#define IEEE80211_NODE_AUTH 0x0001 /* authorized for data */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang#define IEEE80211_NODE_QOS 0x0002 /* QoS enabled */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang#define IEEE80211_NODE_ERP 0x0004 /* ERP enabled */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang/* NB: this must have the same value as IEEE80211_FC1_PWR_MGT */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang#define IEEE80211_NODE_PWR_MGT 0x0010 /* power save mode enabled */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang#define IEEE80211_NODE_AREF 0x0020 /* authentication ref held */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang#define IEEE80211_NODE_HT 0x0040 /* HT enabled */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang#define IEEE80211_NODE_HTCOMPAT 0x0080 /* HT setup w/ vendor OUI's */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang#define IEEE80211_NODE_AMPDU_RX 0x0400 /* AMPDU rx enabled */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang#define IEEE80211_NODE_AMPDU_TX 0x0800 /* AMPDU tx enabled */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang#define IEEE80211_NODE_AMPDU \
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang (IEEE80211_NODE_AMPDU_RX | IEEE80211_NODE_AMPDU_TX)
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#define IEEE80211_FIXED_RATE_NONE 0
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang#define WME_OUI 0xf25000
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang#define WME_OUI_TYPE 0x02
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang#define WME_INFO_OUI_SUBTYPE 0x00
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang#define WME_PARAM_OUI_SUBTYPE 0x01
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang#define WME_VERSION 1
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc/* WME stream classes */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#define WME_AC_BE 0 /* best effort */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#define WME_AC_BK 1 /* background */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#define WME_AC_VI 2 /* video */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#define WME_AC_VO 3 /* voice */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc
a399b7655a1d835aa8606c2b29e4e777baac8635zf#define MAX_EVENT 16
a399b7655a1d835aa8606c2b29e4e777baac8635zf#define MAX_IEEE80211STR 256
a399b7655a1d835aa8606c2b29e4e777baac8635zf
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang/* For IEEE80211_RADIOTAP_FLAGS */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang#define IEEE80211_RADIOTAP_F_CFP 0x01
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang /* sent/received during CFP */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang#define IEEE80211_RADIOTAP_F_SHORTPRE 0x02
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang /* sent/received with short preamble */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang#define IEEE80211_RADIOTAP_F_WEP 0x04
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang /* sent/received with WEP encryption */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang#define IEEE80211_RADIOTAP_F_FRAG 0x08
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang /* sent/received with fragmentation */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang#define IEEE80211_RADIOTAP_F_DATAPAD 0x20
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang /*
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang * frame has padding between 802.11
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang * header and payload (to 32-bit
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang * boundary
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang#define IEEE80211_RADIOTAP_F_FCS 0x10 /* frame includes FCS */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang#define IEEE80211_RADIOTAP_F_BADFCS 0x40 /* does not pass FCS check */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang#define IEEE80211_RADIOTAP_F_SHORTGI 0x80 /* HT short GI */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc/*
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * Authentication mode.
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxcenum ieee80211_authmode {
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc IEEE80211_AUTH_NONE = 0,
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc IEEE80211_AUTH_OPEN = 1, /* open */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc IEEE80211_AUTH_SHARED = 2, /* shared-key */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc IEEE80211_AUTH_8021X = 3, /* 802.1x */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc IEEE80211_AUTH_AUTO = 4, /* auto-select/accept */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc /* NB: these are used only for ioctls */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc IEEE80211_AUTH_WPA = 5 /* WPA/RSN w/ 802.1x/PSK */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc};
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxcenum ieee80211_state {
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc IEEE80211_S_INIT = 0, /* default state */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc IEEE80211_S_SCAN = 1, /* scanning */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc IEEE80211_S_AUTH = 2, /* try to authenticate */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc IEEE80211_S_ASSOC = 3, /* try to assoc */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc IEEE80211_S_RUN = 4 /* associated */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc};
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#define IEEE80211_S_MAX (IEEE80211_S_RUN+1)
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc/*
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * 802.11 rate set.
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#define IEEE80211_RATE_MAXSIZE 15 /* max rates we'll handle */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#define IEEE80211_RATE_SIZE 8 /* 802.11 standard */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#define IEEE80211_XRATE_SIZE (IEEE80211_RATE_MAXSIZE - IEEE80211_RATE_SIZE)
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc /* size of extended supported rates */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxcstruct ieee80211_rateset {
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc uint8_t ir_nrates;
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc uint8_t ir_rates[IEEE80211_RATE_MAXSIZE];
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc};
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang/*
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang * 802.11n variant of ieee80211_rateset. Instead
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang * legacy rates the entries are MCS rates. We define
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang * the structure such that it can be used interchangeably
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang * with an ieee80211_rateset (modulo structure size).
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang#define IEEE80211_HTRATE_MAXSIZE 127
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fangstruct ieee80211_htrateset {
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang uint8_t rs_nrates;
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang uint8_t rs_rates[IEEE80211_HTRATE_MAXSIZE];
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang};
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang#define IEEE80211_RATE_MCS 0x80
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc/*
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * Channels are specified by frequency and attributes.
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxcstruct ieee80211_channel {
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc uint16_t ich_freq; /* setting in Mhz */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang uint32_t ich_flags; /* see below */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc};
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxcstruct ieee80211_device_stats {
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc uint32_t is_tx_frags;
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc uint32_t is_tx_bytes;
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc uint32_t is_tx_mcast;
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc uint32_t is_tx_failed;
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc uint32_t is_tx_retries;
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc uint32_t is_rts_success;
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc uint32_t is_rts_failure;
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc uint32_t is_ack_failure;
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc uint32_t is_rx_frags;
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc uint32_t is_rx_bytes;
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc uint32_t is_rx_mcast;
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc uint32_t is_rx_dups;
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc uint32_t is_fcs_errors;
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc uint32_t is_wep_errors;
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc uint32_t is_tx_nobuf;
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc uint32_t is_tx_unknownmgt;
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc};
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxcstruct ieee80211_crypto_state;
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxctypedef struct ieee80211_node_table ieee80211_node_table_t;
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxctypedef struct ieee80211_node ieee80211_node_t;
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxctypedef struct ieee80211com ieee80211com_t;
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxcstruct ieee80211_node_table {
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc struct ieee80211com *nt_ic; /* back reference */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc const char *nt_name; /* for debugging */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc /* For node inactivity processing */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc int nt_inact_timer; /* inactivity timer */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc int nt_inact_init; /* initial node inact setting */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc void (*nt_timeout)(struct ieee80211_node_table *);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc uint32_t nt_scangen; /* gen# for timeout scan */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc kmutex_t nt_scanlock; /* on nt_scangen */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc kmutex_t nt_nodelock; /* on node table */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc int nt_keyixmax; /* keyixmap size */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc struct ieee80211_node **nt_keyixmap; /* key ix -> node map */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc list_t nt_node; /* information of all nodes */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc list_t nt_hash[IEEE80211_NODE_HASHSIZE];
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc};
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang#define IEEE80211_TID_SIZE (WME_NUM_TID+1) /* WME TID's +1 for non-QoS */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang#define IEEE80211_NONQOS_TID WME_NUM_TID /* index for non-QoS sta */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc/*
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * Node specific information. Note that drivers are expected
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * to derive from this structure to add device-specific per-node
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * state. This is done by overriding the ic_node_* methods in
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * the ieee80211com structure.
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxcstruct ieee80211_node {
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc struct ieee80211com *in_ic;
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc struct ieee80211_node_table *in_table;
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc uint8_t in_authmode; /* authentication algorithm */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc uint16_t in_flags; /* special purpose state */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc uint16_t in_associd; /* assoc response */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc uint16_t in_txpower; /* current transmit power */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc uint16_t in_vlan; /* vlan tag */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc /*
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * Tx/Rx sequence number.
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * index 0 is used when QoS is not enabled. index 1-16 is used
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * when QoS is enabled. 1-16 corresponds to TID 0-15.
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang uint16_t in_txseqs[IEEE80211_TID_SIZE];
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang uint16_t in_rxseqs[IEEE80211_TID_SIZE];
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc clock_t in_rxfragstamp; /* time stamp of last rx frag */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc mblk_t *in_rxfrag; /* rx frag reassembly */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc uint32_t in_scangen; /* gen# for timeout scan */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc uint32_t in_refcnt;
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc /* hardware */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc uint32_t in_rstamp; /* recv timestamp */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc uint8_t in_rssi; /* recv ssi */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc /* header */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc uint8_t in_macaddr[IEEE80211_ADDR_LEN];
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc uint8_t in_bssid[IEEE80211_ADDR_LEN];
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc /* beacon, probe response */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc union {
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc uint8_t data[8];
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc uint64_t tsf;
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc } in_tstamp; /* from last rcv'd beacon */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc uint16_t in_intval; /* beacon interval */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc uint16_t in_capinfo; /* capabilities */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc uint8_t in_esslen;
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc uint8_t in_essid[IEEE80211_NWID_LEN];
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc struct ieee80211_rateset in_rates; /* negotiated rate set */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc struct ieee80211_channel *in_chan; /* XXX multiple uses */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc enum ieee80211_phytype in_phytype;
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc uint16_t in_fhdwell; /* FH only */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc uint8_t in_fhindex; /* FH only */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc uint8_t in_erp; /* ERP from beacon/probe resp */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc uint16_t in_tim_off; /* byte offset to TIM ie */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc uint8_t in_dtim_period; /* DTIM period */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc uint8_t in_dtim_count; /* DTIM count for last bcn */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc uint32_t *in_challenge; /* shared-key challenge */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc struct ieee80211_key in_ucastkey; /* unicast key */
a399b7655a1d835aa8606c2b29e4e777baac8635zf uint8_t *in_wpa_ie; /* captured WPA/RSN ie */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang uint8_t *in_wme_ie; /* captured WME ie */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang /* 11n state */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang uint8_t *in_htcap_ie; /* captured HTCAP ie */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang uint16_t in_htcap; /* HT capabilities */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang uint8_t in_htparam; /* HT params */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang uint8_t in_htctlchan; /* HT control channel */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang uint8_t in_ht2ndchan; /* HT 2nd channel */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang uint8_t in_htopmode; /* HT operating mode */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang uint8_t in_htstbc; /* HT */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang uint8_t in_reqcw; /* requested tx channel width */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang uint8_t in_chw; /* negotiated channel width */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang struct ieee80211_htrateset in_htrates; /* negotiated ht rate set */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang struct ieee80211_tx_ampdu in_tx_ampdu[WME_NUM_AC];
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang struct ieee80211_rx_ampdu in_rx_ampdu[WME_NUM_TID];
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc /* others */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc int32_t in_fails; /* failure count to associate */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc int16_t in_inact; /* inactivity mark count */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc int16_t in_inact_reload; /* inactivity reload value */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang int32_t in_txrate; /* index to in_rates[] */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc list_node_t in_node; /* element of nt->nt_node */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc list_node_t in_hash; /* element of nt->nt_hash */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc};
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang/*
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang * WME/WMM support.
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fangstruct wmeParams {
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang uint8_t wmep_acm;
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang uint8_t wmep_aifsn;
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang uint8_t wmep_logcwmin; /* log2(cwmin) */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang uint8_t wmep_logcwmax; /* log2(cwmax) */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang uint8_t wmep_txopLimit;
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang uint8_t wmep_noackPolicy; /* 0 (ack), 1 (no ack) */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang};
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang#define IEEE80211_TXOP_TO_US(_txop) ((_txop)<<5)
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang#define IEEE80211_US_TO_TXOP(_us) ((_us)>>5)
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fangstruct chanAccParams {
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang uint8_t cap_info; /* version of the current set */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang struct wmeParams cap_wmeParams[WME_NUM_AC];
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang};
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fangstruct ieee80211_wme_state {
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang uint_t wme_flags;
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang#define WME_F_AGGRMODE 0x00000001 /* STATUS: WME agressive mode */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang uint_t wme_hipri_traffic; /* VI/VO frames in beacon interval */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang uint_t wme_hipri_switch_thresh; /* agressive mode switch thresh */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang uint_t wme_hipri_switch_hysteresis;
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang /* agressive mode switch hysteresis */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang struct wmeParams wme_params[4]; /* from assoc resp for each AC */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang struct chanAccParams wme_wmeChanParams; /* WME params applied to self */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang struct chanAccParams wme_wmeBssChanParams;
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang /* WME params bcast to stations */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang struct chanAccParams wme_chanParams; /* params applied to self */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang struct chanAccParams wme_bssChanParams; /* params bcast to stations */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang int (*wme_update)(struct ieee80211com *);
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang};
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxcstruct ieee80211com {
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc mac_handle_t ic_mach;
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc /* Initialized by driver */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc uint8_t ic_macaddr[IEEE80211_ADDR_LEN];
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc uint32_t ic_caps; /* capabilities */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang uint32_t ic_htcaps; /* HT capabilities */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc enum ieee80211_phytype ic_phytype; /* XXX wrong for multi-mode */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc enum ieee80211_opmode ic_opmode; /* current operation mode */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc enum ieee80211_state ic_state; /* current 802.11 state */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc struct ieee80211_channel ic_sup_channels[IEEE80211_CHAN_MAX+1];
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc struct ieee80211_rateset ic_sup_rates[IEEE80211_MODE_MAX];
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc enum ieee80211_phymode ic_curmode; /* OPT current mode */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc struct ieee80211_channel *ic_curchan; /* OPT current channel */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc struct ieee80211_channel *ic_ibss_chan; /* OPT bss channel */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc uint8_t ic_maxrssi; /* maximum hardware RSSI */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc /* INITIALIZED by IEEE80211, used/overridden by driver */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc uint16_t ic_modecaps; /* set of mode capabilities */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc uint8_t ic_chan_active[IEEE80211_CHAN_BYTES];
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc enum ieee80211_protmode ic_protmode; /* 802.11g protection mode */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc uint16_t ic_bintval; /* beacon interval */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc uint16_t ic_lintval; /* listen interval */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc uint16_t ic_txpowlimit; /* global tx power limit */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc uint8_t ic_bmissthreshold;
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc uint16_t ic_rtsthreshold;
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc uint16_t ic_fragthreshold;
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc uint8_t ic_fixed_rate; /* value of fixed rate */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc int32_t ic_des_esslen; /* length of desired essid */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc uint8_t ic_des_essid[IEEE80211_NWID_LEN];
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc uint8_t ic_des_bssid[IEEE80211_ADDR_LEN];
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc struct ieee80211_channel *ic_des_chan; /* desired channel */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc void *ic_opt_ie; /* user-specified IE's */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc uint16_t ic_opt_ie_len; /* length of ic_opt_ie */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc uint8_t ic_nickname[IEEE80211_NWID_LEN];
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc uint16_t ic_tim_len; /* ic_tim_bitmap size (bytes) */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc uint8_t *ic_tim_bitmap; /* powersave stations w/ data */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc timeout_id_t ic_watchdog_timer; /* watchdog timer */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc /* Cipher state/configuration. */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc struct ieee80211_crypto_state ic_crypto;
239e91abc172c1397b1e94869c5d0e8ab67bfc22hx const struct ieee80211_cipher *ic_ciphers[IEEE80211_CIPHER_MAX];
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc
a399b7655a1d835aa8606c2b29e4e777baac8635zf kmutex_t ic_doorlock;
a399b7655a1d835aa8606c2b29e4e777baac8635zf char ic_wpadoor[MAX_IEEE80211STR];
a399b7655a1d835aa8606c2b29e4e777baac8635zf
a399b7655a1d835aa8606c2b29e4e777baac8635zf wpa_event_type ic_eventq[MAX_EVENT];
a399b7655a1d835aa8606c2b29e4e777baac8635zf uint32_t ic_evq_head, ic_evq_tail;
a399b7655a1d835aa8606c2b29e4e777baac8635zf
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc /* Runtime states */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc uint32_t ic_flags; /* state/conf flags */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc uint32_t ic_flags_ext; /* extended state flags */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc struct ieee80211_node *ic_bss; /* information for this node */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc struct ieee80211_device_stats ic_stats;
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc struct ieee80211_node_table ic_scan; /* STA: scan candidates */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc struct ieee80211_node_table ic_sta; /* AP:stations/IBSS:neighbors */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang struct ieee80211_wme_state ic_wme; /* WME/WMM state */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang int ic_ampdu_rxmax; /* A-MPDU rx limit (bytes) */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang int ic_ampdu_density; /* A-MPDU density */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang int ic_ampdu_limit; /* A-MPDU tx limit (bytes) */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang int ic_amsdu_limit; /* A-MSDU tx limit (bytes) */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang uint16_t ic_sta_assoc; /* stations associated */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang uint16_t ic_ht_sta_assoc; /* HT stations associated */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang uint16_t ic_ht40_sta_assoc; /* HT40 station associated */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang uint8_t ic_curhtprotmode; /* HTINFO bss state */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang enum ieee80211_protmode ic_htprotmode; /* HT protection mode */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang int ic_lastnonerp; /* last time nonERP sta noted */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang int ic_lastnonht; /* last time non-HT sta noted */
216e0daa70a0058c5dc883bc667cd6925015df0aQuaker Fang int ic_beaconmiss; /* beacon miss counter */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc /* callback functions */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc /*
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * Functions initialized by driver before calling ieee80211_attach()
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * Those must be initialized are marked with M(andatory)
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc *
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * ic_xmit - [M] transmit a management or null data frame
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * return 0 on success, non-zero on error
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * ic_watchdog - [O] periodic run function, enabled by
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * ieee80211_start_watchdog()
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * ic_set_tim - [O] set/clear traffic indication map
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * ic_set_shortslot - [O] enable/disable short slot timing
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * ic_node_newassoc - [O] driver specific operation on a newly
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * associated or re-assoced node
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc int (*ic_xmit)(ieee80211com_t *, mblk_t *, uint8_t);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc void (*ic_watchdog)(void *);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc void (*ic_set_tim)(ieee80211com_t *,
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc ieee80211_node_t *, int);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc void (*ic_set_shortslot)(ieee80211com_t *, int);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc void (*ic_node_newassoc)(ieee80211_node_t *, int);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc /*
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * Functions initialized by ieee80211_attach(), driver could
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * override these functions after calling ieee80211_attach()
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc *
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * ic_reset - reset
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * ic_recv_mgmt - handle received management frames
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * ic_send_mgmt - construct and transmit management frames
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * ic_newstate - handle state transition
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * ic_node_alloc - allocate a new BSS info node
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * ic_node_cleanup - cleanup or free memory spaces of a node
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * ic_node_free - free a node
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * ic_node_getrssi - get node's rssi
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc int (*ic_reset)(ieee80211com_t *);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc void (*ic_recv_mgmt)(ieee80211com_t *,
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc mblk_t *, ieee80211_node_t *,
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc int, int, uint32_t);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc int (*ic_send_mgmt)(ieee80211com_t *,
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc ieee80211_node_t *, int, int);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc int (*ic_newstate)(ieee80211com_t *,
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc enum ieee80211_state, int);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc struct ieee80211_node *(*ic_node_alloc)(ieee80211com_t *);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc void (*ic_node_cleanup)(ieee80211_node_t *);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc void (*ic_node_free)(ieee80211_node_t *);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc uint8_t (*ic_node_getrssi)(const ieee80211_node_t *);
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang void (*ic_set_channel)(ieee80211com_t *);
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang /*
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang * 802.11n ADDBA support. A simple/generic implementation
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang * of A-MPDU tx aggregation is provided; the driver may
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang * override these methods to provide their own support.
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang * A-MPDU rx re-ordering happens automatically if the
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang * driver passes out-of-order frames to ieee80211_input
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang * from an assocated HT station.
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang void (*ic_recv_action)(ieee80211_node_t *,
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang const uint8_t *, const uint8_t *);
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang int (*ic_send_action)(ieee80211_node_t *,
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang int, int, uint16_t[4]);
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang /* start/stop doing A-MPDU tx aggregation for a station */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang int (*ic_addba_request)(ieee80211_node_t *,
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang struct ieee80211_tx_ampdu *,
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang int, int, int);
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang int (*ic_addba_response)(ieee80211_node_t *,
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang struct ieee80211_tx_ampdu *,
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang int, int, int);
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang void (*ic_addba_stop)(ieee80211_node_t *,
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang struct ieee80211_tx_ampdu *);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc kmutex_t ic_genlock;
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc void *ic_private; /* ieee80211 private data */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc};
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#define ic_nw_keys ic_crypto.cs_nw_keys
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#define ic_def_txkey ic_crypto.cs_def_txkey
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxcextern const char *ieee80211_state_name[IEEE80211_S_MAX];
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fangextern const char *ieee80211_wme_acnames[];
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#define IEEE80211_RATE(_ix) \
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc (in->in_rates.ir_rates[(_ix)] & IEEE80211_RATE_VAL)
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#define ieee80211_new_state(_ic, _nstate, _arg) \
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc (((_ic)->ic_newstate)((_ic), (_nstate), (_arg)))
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#define ieee80211_macaddr_sprintf(_addr) \
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc ether_sprintf((struct ether_addr *)(_addr))
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc/*
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * Node reference counting definitions.
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc *
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * ieee80211_node_initref initialize the reference count to 1
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * ieee80211_node_incref add a reference
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * ieee80211_node_decref remove a reference
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * ieee80211_node_decref_nv remove a reference and return new value
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * ieee80211_node_refcnt reference count for printing (only)
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#include <sys/atomic.h>
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#define ieee80211_node_initref(_in) \
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc ((_in)->in_refcnt = 1)
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#define ieee80211_node_incref(_in) \
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc atomic_inc_uint(&(_in)->in_refcnt)
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#define ieee80211_node_decref(_in) \
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc atomic_dec_uint(&(_in)->in_refcnt)
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#define ieee80211_node_decref_nv(_in) \
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc atomic_dec_uint_nv(&(_in)->in_refcnt)
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#define ieee80211_node_refcnt(_in) \
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc (_in)->in_refcnt
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxctypedef void ieee80211_iter_func(void *, ieee80211_node_t *);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc/* Initialization */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxcvoid ieee80211_attach(ieee80211com_t *);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxcvoid ieee80211_detach(ieee80211com_t *);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxcvoid ieee80211_media_init(ieee80211com_t *);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxcint ieee80211_ioctl(ieee80211com_t *, queue_t *, mblk_t *);
3a1a8936dac0ebe7e956fa122b0b0d15e62d4108zfvoid ieee80211_register_door(ieee80211com_t *, const char *, int);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc/* Protocol Processing */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxcint ieee80211_input(ieee80211com_t *, mblk_t *, ieee80211_node_t *,
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc int32_t, uint32_t);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxcmblk_t *ieee80211_encap(ieee80211com_t *, mblk_t *, ieee80211_node_t *);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxcmblk_t *ieee80211_beacon_alloc(ieee80211com_t *, ieee80211_node_t *,
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc struct ieee80211_beacon_offsets *);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxcint ieee80211_beacon_update(ieee80211com_t *, ieee80211_node_t *,
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc struct ieee80211_beacon_offsets *, mblk_t *, int);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxcvoid ieee80211_beacon_miss(ieee80211com_t *);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxcvoid ieee80211_begin_scan(ieee80211com_t *, boolean_t);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxcvoid ieee80211_next_scan(ieee80211com_t *);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxcvoid ieee80211_end_scan(ieee80211com_t *);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxcvoid ieee80211_cancel_scan(ieee80211com_t *);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxcvoid ieee80211_sta_join(ieee80211com_t *, ieee80211_node_t *);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxcvoid ieee80211_sta_leave(ieee80211com_t *, ieee80211_node_t *);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxcboolean_t ieee80211_ibss_merge(ieee80211_node_t *);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc/* Node Operation */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxcieee80211_node_t *ieee80211_ref_node(ieee80211_node_t *);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxcvoid ieee80211_unref_node(ieee80211_node_t **);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxcvoid ieee80211_node_authorize(ieee80211_node_t *);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxcvoid ieee80211_node_unauthorize(ieee80211_node_t *);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxcieee80211_node_t *ieee80211_alloc_node(ieee80211com_t *,
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc ieee80211_node_table_t *, const uint8_t *);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxcvoid ieee80211_free_node(ieee80211_node_t *);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxcvoid ieee80211_node_table_reset(ieee80211_node_table_t *);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxcvoid ieee80211_iterate_nodes(ieee80211_node_table_t *, ieee80211_iter_func *,
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc void *);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxcieee80211_node_t *ieee80211_find_node(ieee80211_node_table_t *,
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc const uint8_t *);
a399b7655a1d835aa8606c2b29e4e777baac8635zfieee80211_node_t *ieee80211_find_node_with_ssid(ieee80211_node_table_t *,
a399b7655a1d835aa8606c2b29e4e777baac8635zf const uint8_t *, uint32_t, const uint8_t *);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxcieee80211_node_t *ieee80211_find_txnode(ieee80211com_t *,
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc const uint8_t daddr[IEEE80211_ADDR_LEN]);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxcieee80211_node_t *ieee80211_find_rxnode(ieee80211com_t *,
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc const struct ieee80211_frame *);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc/* Crypto */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxcextern struct ieee80211_key *ieee80211_crypto_encap(ieee80211com_t *, mblk_t *);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxcextern struct ieee80211_key *ieee80211_crypto_decap(ieee80211com_t *, mblk_t *,
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc int);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxcextern int ieee80211_crypto_newkey(ieee80211com_t *, int, int,
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc struct ieee80211_key *);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxcextern int ieee80211_crypto_delkey(ieee80211com_t *, struct ieee80211_key *);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxcextern int ieee80211_crypto_setkey(ieee80211com_t *, struct ieee80211_key *,
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc const uint8_t macaddr[IEEE80211_ADDR_LEN]);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc/* Helper Functions */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxcint ieee80211_stat(ieee80211com_t *ic, uint_t stat, uint64_t *val);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxcuint32_t ieee80211_chan2ieee(ieee80211com_t *, struct ieee80211_channel *);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxcenum ieee80211_phymode ieee80211_chan2mode(ieee80211com_t *,
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc struct ieee80211_channel *);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxcuint32_t ieee80211_ieee2mhz(uint32_t, uint32_t);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxcvoid ieee80211_reset_chan(ieee80211com_t *);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxcvoid ieee80211_dump_pkt(const uint8_t *, int32_t, int32_t, int32_t);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxcvoid ieee80211_watchdog(void *);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxcvoid ieee80211_start_watchdog(ieee80211com_t *, uint32_t);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxcvoid ieee80211_stop_watchdog(ieee80211com_t *);
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fangint ieee80211_classify(struct ieee80211com *, mblk_t *,
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang struct ieee80211_node *);
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fangint ieee80211_hdrsize(const void *);
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fangint ieee80211_hdrspace(ieee80211com_t *, const void *);
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fangint ieee80211_anyhdrsize(const void *);
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fangint ieee80211_anyhdrspace(ieee80211com_t *, const void *);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc
a399b7655a1d835aa8606c2b29e4e777baac8635zfvoid *ieee80211_malloc(size_t);
a399b7655a1d835aa8606c2b29e4e777baac8635zfvoid ieee80211_free(void *);
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhanint ieee80211_setprop(void *, const char *, mac_prop_id_t, uint_t,
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhan const void *);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerint ieee80211_getprop(void *, const char *, mac_prop_id_t, uint_t, void *);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyervoid ieee80211_propinfo(void *, const char *, mac_prop_id_t,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer mac_prop_info_handle_t);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
a399b7655a1d835aa8606c2b29e4e777baac8635zf
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fangstruct ieee80211_channel *ieee80211_find_channel(ieee80211com_t *, int, int);
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fangconst struct ieee80211_rateset *ieee80211_get_suprates(ieee80211com_t *,
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang struct ieee80211_channel *);
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang/* HT */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#ifdef __cplusplus
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc}
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#endif
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc#endif /* _SYS_NET80211_H */