1*e2cf88acSQuaker Fang /* 2*e2cf88acSQuaker Fang * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 3*e2cf88acSQuaker Fang * Use is subject to license terms. 4*e2cf88acSQuaker Fang */ 5*e2cf88acSQuaker Fang 6*e2cf88acSQuaker Fang /* 7*e2cf88acSQuaker Fang * Copyright (c) 2007 Sam Leffler, Errno Consulting 8*e2cf88acSQuaker Fang * All rights reserved. 9*e2cf88acSQuaker Fang * 10*e2cf88acSQuaker Fang * Redistribution and use in source and binary forms, with or without 11*e2cf88acSQuaker Fang * modification, are permitted provided that the following conditions 12*e2cf88acSQuaker Fang * are met: 13*e2cf88acSQuaker Fang * 1. Redistributions of source code must retain the above copyright 14*e2cf88acSQuaker Fang * notice, this list of conditions and the following disclaimer. 15*e2cf88acSQuaker Fang * 2. Redistributions in binary form must reproduce the above copyright 16*e2cf88acSQuaker Fang * notice, this list of conditions and the following disclaimer in the 17*e2cf88acSQuaker Fang * documentation and/or other materials provided with the distribution. 18*e2cf88acSQuaker Fang * 19*e2cf88acSQuaker Fang * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 20*e2cf88acSQuaker Fang * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 21*e2cf88acSQuaker Fang * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 22*e2cf88acSQuaker Fang * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 23*e2cf88acSQuaker Fang * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 24*e2cf88acSQuaker Fang * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25*e2cf88acSQuaker Fang * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26*e2cf88acSQuaker Fang * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27*e2cf88acSQuaker Fang * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 28*e2cf88acSQuaker Fang * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29*e2cf88acSQuaker Fang */ 30*e2cf88acSQuaker Fang 31*e2cf88acSQuaker Fang #ifndef _SYS_NET80211_HT_H 32*e2cf88acSQuaker Fang #define _SYS_NET80211_HT_H 33*e2cf88acSQuaker Fang 34*e2cf88acSQuaker Fang /* 35*e2cf88acSQuaker Fang * 802.11n protocol implementation definitions. 36*e2cf88acSQuaker Fang */ 37*e2cf88acSQuaker Fang 38*e2cf88acSQuaker Fang #ifdef __cplusplus 39*e2cf88acSQuaker Fang extern "C" { 40*e2cf88acSQuaker Fang #endif 41*e2cf88acSQuaker Fang 42*e2cf88acSQuaker Fang struct ieee80211com; 43*e2cf88acSQuaker Fang struct ieee80211_node; 44*e2cf88acSQuaker Fang struct ieee80211_channel; 45*e2cf88acSQuaker Fang 46*e2cf88acSQuaker Fang #define IEEE80211_AGGR_BAWMAX 64 /* max block ack window size */ 47*e2cf88acSQuaker Fang /* threshold for aging overlapping non-HT bss */ 48*e2cf88acSQuaker Fang #define IEEE80211_NONHT_PRESENT_AGE (60*1000) /* msec */ 49*e2cf88acSQuaker Fang 50*e2cf88acSQuaker Fang #define M_AMPDU 0x8000 /* A-MPDU processing done */ 51*e2cf88acSQuaker Fang #define M_WEP 0x4000 /* WEP done by hardware */ 52*e2cf88acSQuaker Fang #define M_80211_RX (M_AMPDU | M_WEP) 53*e2cf88acSQuaker Fang 54*e2cf88acSQuaker Fang typedef uint16_t ieee80211_seq; 55*e2cf88acSQuaker Fang 56*e2cf88acSQuaker Fang struct ieee80211_tx_ampdu { 57*e2cf88acSQuaker Fang ushort_t txa_flags; 58*e2cf88acSQuaker Fang #define IEEE80211_AGGR_IMMEDIATE 0x0001 /* BA policy */ 59*e2cf88acSQuaker Fang #define IEEE80211_AGGR_XCHGPEND 0x0002 /* ADDBA response pending */ 60*e2cf88acSQuaker Fang #define IEEE80211_AGGR_RUNNING 0x0004 /* ADDBA response received */ 61*e2cf88acSQuaker Fang #define IEEE80211_AGGR_SETUP 0x0008 /* deferred state setup */ 62*e2cf88acSQuaker Fang #define IEEE80211_AGGR_NAK 0x0010 /* peer NAK'd ADDBA request */ 63*e2cf88acSQuaker Fang uint8_t txa_ac; 64*e2cf88acSQuaker Fang uint8_t txa_token; /* dialog token */ 65*e2cf88acSQuaker Fang int txa_qbytes; /* data queued (bytes) */ 66*e2cf88acSQuaker Fang short txa_qframes; /* data queued (frames) */ 67*e2cf88acSQuaker Fang ieee80211_seq txa_seqstart; 68*e2cf88acSQuaker Fang ieee80211_seq txa_start; 69*e2cf88acSQuaker Fang uint16_t txa_wnd; /* BA window size */ 70*e2cf88acSQuaker Fang uint8_t txa_attempts; /* # setup attempts */ 71*e2cf88acSQuaker Fang clock_t txa_lastrequest; /* time of last ADDBA request */ 72*e2cf88acSQuaker Fang timeout_id_t txa_timer; 73*e2cf88acSQuaker Fang }; 74*e2cf88acSQuaker Fang 75*e2cf88acSQuaker Fang /* return non-zero if AMPDU tx for the TID is running */ 76*e2cf88acSQuaker Fang #define IEEE80211_AMPDU_RUNNING(tap) \ 77*e2cf88acSQuaker Fang (((tap)->txa_flags & IEEE80211_AGGR_RUNNING) != 0) 78*e2cf88acSQuaker Fang 79*e2cf88acSQuaker Fang /* return non-zero if AMPDU tx for the TID is running or started */ 80*e2cf88acSQuaker Fang #define IEEE80211_AMPDU_REQUESTED(tap) \ 81*e2cf88acSQuaker Fang (((tap)->txa_flags & (IEEE80211_AGGR_RUNNING | \ 82*e2cf88acSQuaker Fang IEEE80211_AGGR_XCHGPEND | IEEE80211_AGGR_NAK)) != 0) 83*e2cf88acSQuaker Fang 84*e2cf88acSQuaker Fang struct ieee80211_rx_ampdu { 85*e2cf88acSQuaker Fang int rxa_flags; 86*e2cf88acSQuaker Fang int rxa_qbytes; /* data queued (bytes) */ 87*e2cf88acSQuaker Fang short rxa_qframes; /* data queued (frames) */ 88*e2cf88acSQuaker Fang ieee80211_seq rxa_seqstart; 89*e2cf88acSQuaker Fang ieee80211_seq rxa_start; /* start of current BA window */ 90*e2cf88acSQuaker Fang uint16_t rxa_wnd; /* BA window size */ 91*e2cf88acSQuaker Fang clock_t rxa_age; /* age of oldest frame in window */ 92*e2cf88acSQuaker Fang int rxa_nframes; /* frames since ADDBA */ 93*e2cf88acSQuaker Fang mblk_t *rxa_m[IEEE80211_AGGR_BAWMAX]; 94*e2cf88acSQuaker Fang }; 95*e2cf88acSQuaker Fang 96*e2cf88acSQuaker Fang void ieee80211_ht_attach(struct ieee80211com *); 97*e2cf88acSQuaker Fang void ieee80211_ht_detach(struct ieee80211com *); 98*e2cf88acSQuaker Fang 99*e2cf88acSQuaker Fang void ieee80211_ht_announce(struct ieee80211com *); 100*e2cf88acSQuaker Fang 101*e2cf88acSQuaker Fang extern const int ieee80211_htrates[16]; 102*e2cf88acSQuaker Fang const struct ieee80211_htrateset *ieee80211_get_suphtrates( 103*e2cf88acSQuaker Fang struct ieee80211com *, const struct ieee80211_channel *); 104*e2cf88acSQuaker Fang 105*e2cf88acSQuaker Fang int ieee80211_setup_htrates(struct ieee80211_node *, 106*e2cf88acSQuaker Fang const uint8_t *htcap, int flags); 107*e2cf88acSQuaker Fang void ieee80211_setup_basic_htrates(struct ieee80211_node *, 108*e2cf88acSQuaker Fang const uint8_t *htinfo); 109*e2cf88acSQuaker Fang 110*e2cf88acSQuaker Fang mblk_t *ieee80211_decap_amsdu(struct ieee80211_node *, mblk_t *); 111*e2cf88acSQuaker Fang 112*e2cf88acSQuaker Fang int ieee80211_ampdu_reorder(struct ieee80211_node *, mblk_t *); 113*e2cf88acSQuaker Fang void ieee80211_recv_bar(struct ieee80211_node *, mblk_t *); 114*e2cf88acSQuaker Fang void ieee80211_ht_node_init(struct ieee80211_node *, const uint8_t *); 115*e2cf88acSQuaker Fang void ieee80211_ht_node_cleanup(struct ieee80211_node *); 116*e2cf88acSQuaker Fang struct ieee80211_channel *ieee80211_ht_adjust_channel(struct ieee80211com *, 117*e2cf88acSQuaker Fang struct ieee80211_channel *, int); 118*e2cf88acSQuaker Fang 119*e2cf88acSQuaker Fang void ieee80211_ht_wds_init(struct ieee80211_node *); 120*e2cf88acSQuaker Fang void ieee80211_ht_node_join(struct ieee80211_node *); 121*e2cf88acSQuaker Fang void ieee80211_ht_node_leave(struct ieee80211_node *); 122*e2cf88acSQuaker Fang void ieee80211_htinfo_update(struct ieee80211com *, int protmode); 123*e2cf88acSQuaker Fang void ieee80211_ht_timeout(struct ieee80211com *); 124*e2cf88acSQuaker Fang void ieee80211_parse_htcap(struct ieee80211_node *, const uint8_t *); 125*e2cf88acSQuaker Fang void ieee80211_parse_htinfo(struct ieee80211_node *, const uint8_t *); 126*e2cf88acSQuaker Fang void ieee80211_recv_action(struct ieee80211_node *, 127*e2cf88acSQuaker Fang const uint8_t *, const uint8_t *); 128*e2cf88acSQuaker Fang int ieee80211_ampdu_request(struct ieee80211_node *, 129*e2cf88acSQuaker Fang struct ieee80211_tx_ampdu *); 130*e2cf88acSQuaker Fang void ieee80211_ampdu_stop(struct ieee80211_node *, 131*e2cf88acSQuaker Fang struct ieee80211_tx_ampdu *); 132*e2cf88acSQuaker Fang int ieee80211_send_bar(struct ieee80211_node *, 133*e2cf88acSQuaker Fang const struct ieee80211_tx_ampdu *); 134*e2cf88acSQuaker Fang int ieee80211_send_action(struct ieee80211_node *, int, int, uint16_t [4]); 135*e2cf88acSQuaker Fang 136*e2cf88acSQuaker Fang uint8_t *ieee80211_add_htcap(uint8_t *, struct ieee80211_node *); 137*e2cf88acSQuaker Fang uint8_t *ieee80211_add_htcap_vendor(uint8_t *, struct ieee80211_node *); 138*e2cf88acSQuaker Fang uint8_t *ieee80211_add_htinfo(uint8_t *, struct ieee80211_node *); 139*e2cf88acSQuaker Fang uint8_t *ieee80211_add_htinfo_vendor(uint8_t *, struct ieee80211_node *); 140*e2cf88acSQuaker Fang 141*e2cf88acSQuaker Fang struct ieee80211_beacon_offsets; 142*e2cf88acSQuaker Fang void ieee80211_ht_update_beacon(struct ieee80211com *, 143*e2cf88acSQuaker Fang struct ieee80211_beacon_offsets *); 144*e2cf88acSQuaker Fang 145*e2cf88acSQuaker Fang #ifdef __cplusplus 146*e2cf88acSQuaker Fang } 147*e2cf88acSQuaker Fang #endif 148*e2cf88acSQuaker Fang 149*e2cf88acSQuaker Fang #endif /* _SYS_NET80211_HT_H */ 150