19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * Use is subject to license terms.
034536e9c476303015b9836aca06e46531705f2aHans Rosenfeld * Copyright 2016 Hans Rosenfeld <rosenfeld@grumpf.hope-2000.org>
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * Copyright (c) 2001 Atsushi Onoe
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China * Copyright (c) 2002-2008 Sam Leffler, Errno Consulting
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * All rights reserved.
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 * 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 * 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 * IEEE 802.11 protocol support
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang/* tunables */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang#define AGGRESSIVE_MODE_SWITCH_HYSTERESIS 3 /* pkts / 100ms */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang#define HIGH_PRI_SWITCH_THRESH 10 /* pkts / 100ms */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang#define IEEE80211_RATE2MBS(r) (((r) & IEEE80211_RATE_VAL) / 2)
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc "assoc_req", "assoc_resp", "reassoc_req", "reassoc_resp",
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang "WME_AC_BE",
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang "WME_AC_BK",
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang "WME_AC_VI",
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang "WME_AC_VO",
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxcstatic int ieee80211_newstate(ieee80211com_t *, enum ieee80211_state, int);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * Initialize the interface softc, ic, with protocol management
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * related data structures and functions.
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc /* protocol state change handler */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc /* initialize management frame handlers */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * Print a 802.11 frame header
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxcieee80211_dump_pkt(const uint8_t *buf, int32_t len, int32_t rate, int32_t rssi)
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China ieee80211_macaddr_sprintf(wh->i_addr2));
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China ieee80211_macaddr_sprintf(wh->i_addr1));
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China ieee80211_macaddr_sprintf(wh->i_addr3));
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China ieee80211_macaddr_sprintf(wh->i_addr2));
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China ieee80211_macaddr_sprintf(wh->i_addr3));
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China ieee80211_macaddr_sprintf(wh->i_addr1));
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China ieee80211_macaddr_sprintf(wh->i_addr3));
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China ieee80211_macaddr_sprintf(wh->i_addr1));
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China ieee80211_macaddr_sprintf(wh->i_addr2));
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China ieee80211_macaddr_sprintf((uint8_t *)&wh[1]));
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China ieee80211_macaddr_sprintf(wh->i_addr3));
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China ieee80211_macaddr_sprintf(wh->i_addr2));
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China ieee80211_macaddr_sprintf(wh->i_addr1));
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc ieee80211_dbg(IEEE80211_MSG_ANY, "ieee80211_dump_pkt(): %s", buf1);
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China ieee80211_mgt_subtype_name[
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China (wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK)
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China >> IEEE80211_FC0_SUBTYPE_SHIFT]);
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc if (rate >= 0) {
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc if (rssi >= 0) {
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc ieee80211_dbg(IEEE80211_MSG_ANY, "ieee80211_dump_pkt(): %s", buf1);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc if (len > 0) {
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc if ((i & 0x03) == 0)
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc ieee80211_dbg(IEEE80211_MSG_ANY, "ieee80211_dump_pkt(): %s",
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * Adjust/Fix the specified node's rate table
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * flag IEEE80211_F_DOSORT : sort the node's rate table
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * IEEE80211_F_DONEGO : mark a rate as basic rate if it is
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * a device's basic rate
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * IEEE80211_F_DODEL : delete rates not supported by the device
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * IEEE80211_F_DOFRATE: check if the fixed rate is supported by
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * the device
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * The highest bit of returned rate value is set to 1 on failure.
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * If the fixed rate check was requested but no
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * fixed has been defined then just remove it.
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc srs = &ic->ic_sup_rates[ieee80211_chan2mode(ic, in->in_chan)];
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * Sort rates.
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * Check against supported rates.
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * Overwrite with the supported rate
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * value so any basic rate bit is set.
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * This insures that response we send
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * to stations have the necessary basic
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * rate bit set.
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * A rate in the node's rate set is not
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * supported. We just discard/ignore the rate.
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * Note that this is important for 11b stations
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * when they want to associate with an 11g AP.
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * Delete unacceptable rates.
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * Check any fixed rate is included.
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc if (okrate == 0 || ((flags & IEEE80211_F_DOFRATE) && fixedrate == 0))
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * Reset 11g-related state.
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * Short slot time is enabled only when operating in 11g
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * and not in an IBSS. We must also honor whether or not
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * the driver is capable of doing it.
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China ic->ic_curmode == IEEE80211_MODE_11A);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * Set short preamble and ERP barker-preamble flags.
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * Change current channel to be the next available channel
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * Set the short slot time state and notify the driver.
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxcieee80211_set_shortslottime(ieee80211com_t *ic, boolean_t on)
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc /* notify driver */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * Mark the basic rates for the 11g rate table based on the
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * operating mode. For real 11g we mark all the 11b rates
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * and 6, 12, and 24 OFDM. For 11b compatibility we mark only
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * 11b rates. There's also a pseudo 11a-mode used to mark only
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * the basic OFDM rates.
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc { 0 }, /* IEEE80211_MODE_AUTO */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc { 4, { 2, 4, 11, 22 } }, /* IEEE80211_MODE_11G mixed b/g */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc { 0 }, /* IEEE80211_MODE_FH */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang /* IEEE80211_MODE_TURBO_G (mixed b/g) */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang { 0 }, /* IEEE80211_MODE_STURBO_A */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang { 3, { 12, 24, 48 } }, /* IEEE80211_MODE_11NA */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang /* IEEE80211_MODE_11NG (mixed b/g) */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang * WME protocol support. The following parameters come from the spec.
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fangstatic const paramType phyParamForAC_BE[IEEE80211_MODE_MAX] = {
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang { 2, 3, 5, 0, 0 }, /* IEEE80211_MODE_STURBO_A */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fangstatic const struct phyParamType phyParamForAC_BK[IEEE80211_MODE_MAX] = {
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang { 7, 3, 10, 0, 0 }, /* IEEE80211_MODE_TURBO_A */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang { 7, 3, 10, 0, 0 }, /* IEEE80211_MODE_TURBO_G */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang { 7, 3, 10, 0, 0 }, /* IEEE80211_MODE_STURBO_A */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fangstatic const struct phyParamType phyParamForAC_VI[IEEE80211_MODE_MAX] = {
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang { 1, 2, 3, 94, 0 }, /* IEEE80211_MODE_TURBO_A */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang { 1, 2, 3, 94, 0 }, /* IEEE80211_MODE_TURBO_G */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang { 1, 2, 3, 94, 0 }, /* IEEE80211_MODE_STURBO_A */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fangstatic const struct phyParamType phyParamForAC_VO[IEEE80211_MODE_MAX] = {
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang { 1, 2, 2, 47, 0 }, /* IEEE80211_MODE_TURBO_A */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang { 1, 2, 2, 47, 0 }, /* IEEE80211_MODE_TURBO_G */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang { 1, 2, 2, 47, 0 }, /* IEEE80211_MODE_STURBO_A */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fangstatic const struct phyParamType bssPhyParamForAC_BE[IEEE80211_MODE_MAX] = {
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang { 2, 3, 10, 0, 0 }, /* IEEE80211_MODE_TURBO_A */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang { 2, 3, 10, 0, 0 }, /* IEEE80211_MODE_TURBO_G */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang { 2, 3, 10, 0, 0 }, /* IEEE80211_MODE_STURBO_A */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fangstatic const struct phyParamType bssPhyParamForAC_VI[IEEE80211_MODE_MAX] = {
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang { 2, 2, 3, 94, 0 }, /* IEEE80211_MODE_TURBO_A */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang { 2, 2, 3, 94, 0 }, /* IEEE80211_MODE_TURBO_G */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang { 2, 2, 3, 94, 0 }, /* IEEE80211_MODE_STURBO_A */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fangstatic const struct phyParamType bssPhyParamForAC_VO[IEEE80211_MODE_MAX] = {
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang { 1, 2, 2, 47, 0 }, /* IEEE80211_MODE_TURBO_A */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang { 1, 2, 2, 47, 0 }, /* IEEE80211_MODE_TURBO_G */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang { 1, 2, 2, 47, 0 }, /* IEEE80211_MODE_STURBO_A */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fangieee80211_wme_initparams(struct ieee80211com *ic)
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang * Select mode; we can be called early in which case we
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang * always use auto mode. We know we'll be called when
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang * entering the RUN state with bsschan setup properly
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang * so state will eventually get set correctly
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang for (i = 0; i < WME_NUM_AC; i++) {
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang switch (i) {
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang wmep = &wme->wme_wmeChanParams.cap_wmeParams[i];
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang ieee80211_dbg(IEEE80211_MSG_WME, "ieee80211_wme_initparams: "
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang "%s chan [acm %u aifsn %u log2(cwmin) %u "
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang "log2(cwmax) %u txpoLimit %u]\n",
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang wmep = &wme->wme_wmeBssChanParams.cap_wmeParams[i];
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang ieee80211_dbg(IEEE80211_MSG_WME, "ieee80211_wme_initparams: "
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang "%s bss [acm %u aifsn %u log2(cwmin) %u "
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang "log2(cwmax) %u txpoLimit %u]\n",
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang /* NB: check ic_bss to avoid NULL deref on initial attach */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang * Calculate agressive mode switching threshold based
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang * on beacon interval. This doesn't need locking since
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang * we're only called before entering the RUN state at
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang * which point we start sending beacon frames.
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang (HIGH_PRI_SWITCH_THRESH * ic->ic_bss->in_intval) / 100;
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang * Update WME parameters for ourself and the BSS.
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fangieee80211_wme_updateparams(struct ieee80211com *ic)
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang static const paramType phyParam[IEEE80211_MODE_MAX] = {
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang { 1, 3, 10, 64, 0 }, /* IEEE80211_MODE_TURBO_A */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang { 1, 3, 10, 64, 0 }, /* IEEE80211_MODE_TURBO_G */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang { 1, 3, 10, 64, 0 }, /* IEEE80211_MODE_STURBO_A */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang /* set up the channel access parameters for the physical device */
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang for (i = 0; i < WME_NUM_AC; i++) {
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang wmep = &wme->wme_wmeChanParams.cap_wmeParams[i];
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang chanp = &wme->wme_bssChanParams.cap_wmeParams[i];
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang wmep = &wme->wme_wmeBssChanParams.cap_wmeParams[i];
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang * Select mode; we can be called early in which case we
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang * always use auto mode. We know we'll be called when
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang * entering the RUN state with bsschan setup properly
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang * so state will eventually get set correctly
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang * This implements agressive mode as found in certain
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang * vendors' AP's. When there is significant high
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang * priority (VI/VO) traffic in the BSS throttle back BE
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang * traffic by using conservative parameters. Otherwise
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang * BE uses agressive params to optimize performance of
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang (ic->ic_bss->in_flags & IEEE80211_NODE_QOS) == 0) ||
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang chanp = &wme->wme_chanParams.cap_wmeParams[WME_AC_BE];
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang bssp = &wme->wme_bssChanParams.cap_wmeParams[WME_AC_BE];
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang chanp->wmep_aifsn = bssp->wmep_aifsn = phyParam[mode].aifsn;
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang "ieee80211_wme_updateparams_locked: "
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang "%s [acm %u aifsn %u log2(cwmin) %u "
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang "log2(cwmax) %u txpoLimit %u]\n",
e2cf88ac9d753a00c17aa235f6afdc76574fe3a6Quaker Fang ieee80211_dbg(IEEE80211_MSG_WME, "ieee80211_wme_updateparams(): "
034536e9c476303015b9836aca06e46531705f2aHans Rosenfeld "WME params updated, cap_info 0x%x\n",
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * Process STA mode beacon miss events. Send a direct probe request
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * frame to the current ap bmiss_max times (w/o answer) before
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * scanning for a new ap.
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China "%s\n", "beacon miss");
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * Our handling is only meaningful for stations that are
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * associated; any other conditions else will be handled
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * through different means (e.g. the tx timeout on mgt frames).
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * Send a directed probe req before falling back to a scan;
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * if we receive a response ic_bmiss_count will be reset.
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * Some cards mistakenly report beacon miss so this avoids
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * the expensive scan if the ap is still there.
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc (void) ieee80211_send_probereq(ic->ic_bss, ic->ic_macaddr,
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China ic->ic_bss->in_bssid, ic->ic_bss->in_bssid,
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China ic->ic_bss->in_essid, ic->ic_bss->in_esslen,
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China ic->ic_opt_ie, ic->ic_opt_ie_len);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * Manage state transition between INIT | AUTH | ASSOC | RUN.
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxcieee80211_newstate(ieee80211com_t *ic, enum ieee80211_state nstate, int arg)
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc ieee80211_dbg(IEEE80211_MSG_STATE, "ieee80211_newstate(): "
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China ieee80211_state_name[ostate], ieee80211_state_name[nstate]);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc im->im_swbmiss_period = 0; /* Reset software beacon miss period */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc switch (nstate) {
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc switch (ostate) {
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc return (0);
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China IEEE80211_FC0_SUBTYPE_DEAUTH,
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China IEEE80211_REASON_AUTH_LEAVE);
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China switch (ic->ic_opmode) {
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China case IEEE80211_M_STA:
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China case IEEE80211_M_IBSS:
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China ieee80211_notify_node_leave(ic, in);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc switch (ostate) {
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China IEEE80211_UNLOCK(ic);
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China ieee80211_begin_scan(ic, (arg == 0) ? B_FALSE : B_TRUE);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * Scan next. If doing an active scan and the
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * channel is not marked passive-only then send
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * a probe request. Otherwise just listen for
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * beacons on the channel.
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China ic->ic_macaddr, wifi_bcastaddr,
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China ic->ic_des_essid, ic->ic_des_esslen,
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China ic->ic_opt_ie, ic->ic_opt_ie_len);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc return (0);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc /* beacon miss */
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China "no recent beacons from %s, rescanning\n",
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China ieee80211_macaddr_sprintf(in->in_macaddr));
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc /* FALLTHRU */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc /* timeout restart scan */
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China ic->ic_bss->in_macaddr);
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China ASSERT(ic->ic_opmode == IEEE80211_M_STA);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc switch (ostate) {
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc return (0);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc switch (arg) {
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China IEEE80211_FC0_SUBTYPE_AUTH, 2);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc return (0);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc /* ignore and retry scan on timeout */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc switch (arg) {
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China IEEE80211_FC0_SUBTYPE_AUTH, 2);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc return (0);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc /* try to re-auth */
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China IEEE80211_FC0_SUBTYPE_AUTH, 1);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc return (0);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc switch (ostate) {
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China "invalid transition\n");
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China IEEE80211_FC0_SUBTYPE_ASSOC_REQ, 0);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc return (0);
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China IEEE80211_FC0_SUBTYPE_ASSOC_REQ, 1);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc return (0);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc switch (ostate) {
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China "invalid transition\n");
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China "invalid transition\n");
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China ieee80211_notify_node_join(ic, in);
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * We can send data now; update the fastpath with our
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * current associated BSSID and other relevant settings.
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * When 802.1x is not in use mark the port authorized
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * at this point so traffic can flow.
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc * Enable inactivity processing.
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc break; /* IEEE80211_S_RUN */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc } /* switch nstate */
0ba2cbe97e0678a691742f98d2532caed0a2c4aaxc return (0);