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