summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/sys/net80211_ht.h
blob: 449726aa0feae79d6bcea0f73e0625a7078a150e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
/*
 * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

/*
 * Copyright (c) 2007 Sam Leffler, Errno Consulting
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

#ifndef _SYS_NET80211_HT_H
#define	_SYS_NET80211_HT_H

/*
 * 802.11n protocol implementation definitions.
 */

#ifdef	__cplusplus
extern "C" {
#endif

struct ieee80211com;
struct ieee80211_node;
struct ieee80211_channel;

#define	IEEE80211_AGGR_BAWMAX	64	/* max block ack window size */
/* threshold for aging overlapping non-HT bss */
#define	IEEE80211_NONHT_PRESENT_AGE	(60*1000)	/* msec */

#define	M_AMPDU			0x8000	/* A-MPDU processing done */
#define	M_WEP			0x4000	/* WEP done by hardware */
#define	M_80211_RX		(M_AMPDU | M_WEP)

typedef uint16_t ieee80211_seq;

struct ieee80211_tx_ampdu {
	ushort_t	txa_flags;
#define	IEEE80211_AGGR_IMMEDIATE	0x0001	/* BA policy */
#define	IEEE80211_AGGR_XCHGPEND		0x0002	/* ADDBA response pending */
#define	IEEE80211_AGGR_RUNNING		0x0004	/* ADDBA response received */
#define	IEEE80211_AGGR_SETUP		0x0008	/* deferred state setup */
#define	IEEE80211_AGGR_NAK		0x0010	/* peer NAK'd ADDBA request */
	uint8_t		txa_ac;
	uint8_t		txa_token;		/* dialog token */
	int		txa_qbytes;		/* data queued (bytes) */
	short		txa_qframes;		/* data queued (frames) */
	ieee80211_seq	txa_seqstart;
	ieee80211_seq	txa_start;
	uint16_t	txa_wnd;		/* BA window size */
	uint8_t		txa_attempts;		/* # setup attempts */
	clock_t		txa_lastrequest;	/* time of last ADDBA request */
	timeout_id_t	txa_timer;
};

/* return non-zero if AMPDU tx for the TID is running */
#define	IEEE80211_AMPDU_RUNNING(tap) \
	(((tap)->txa_flags & IEEE80211_AGGR_RUNNING) != 0)

/* return non-zero if AMPDU tx for the TID is running or started */
#define	IEEE80211_AMPDU_REQUESTED(tap) \
	(((tap)->txa_flags & (IEEE80211_AGGR_RUNNING |	\
	IEEE80211_AGGR_XCHGPEND | IEEE80211_AGGR_NAK)) != 0)

struct ieee80211_rx_ampdu {
	int		rxa_flags;
	int		rxa_qbytes;	/* data queued (bytes) */
	short		rxa_qframes;	/* data queued (frames) */
	ieee80211_seq	rxa_seqstart;
	ieee80211_seq	rxa_start;	/* start of current BA window */
	uint16_t	rxa_wnd;	/* BA window size */
	clock_t		rxa_age;	/* age of oldest frame in window */
	int		rxa_nframes;	/* frames since ADDBA */
	mblk_t		*rxa_m[IEEE80211_AGGR_BAWMAX];
};

void ieee80211_ht_attach(struct ieee80211com *);
void ieee80211_ht_detach(struct ieee80211com *);

void ieee80211_ht_announce(struct ieee80211com *);

extern const int ieee80211_htrates[16];
const struct ieee80211_htrateset *ieee80211_get_suphtrates(
    struct ieee80211com *, const struct ieee80211_channel *);

int ieee80211_setup_htrates(struct ieee80211_node *,
    const uint8_t *htcap, int flags);
void ieee80211_setup_basic_htrates(struct ieee80211_node *,
    const uint8_t *htinfo);

mblk_t *ieee80211_decap_amsdu(struct ieee80211_node *, mblk_t *);

int ieee80211_ampdu_reorder(struct ieee80211_node *, mblk_t *);
void ieee80211_recv_bar(struct ieee80211_node *, mblk_t *);
void ieee80211_ht_node_init(struct ieee80211_node *, const uint8_t *);
void ieee80211_ht_node_cleanup(struct ieee80211_node *);
struct ieee80211_channel *ieee80211_ht_adjust_channel(struct ieee80211com *,
    struct ieee80211_channel *, int);

void ieee80211_ht_wds_init(struct ieee80211_node *);
void ieee80211_ht_node_join(struct ieee80211_node *);
void ieee80211_ht_node_leave(struct ieee80211_node *);
void ieee80211_htinfo_update(struct ieee80211com *, int protmode);
void ieee80211_ht_timeout(struct ieee80211com *);
void ieee80211_parse_htcap(struct ieee80211_node *, const uint8_t *);
void ieee80211_parse_htinfo(struct ieee80211_node *, const uint8_t *);
void ieee80211_recv_action(struct ieee80211_node *,
    const uint8_t *, const uint8_t *);
int ieee80211_ampdu_request(struct ieee80211_node *,
    struct ieee80211_tx_ampdu *);
void ieee80211_ampdu_stop(struct ieee80211_node *,
    struct ieee80211_tx_ampdu *);
int ieee80211_send_bar(struct ieee80211_node *,
    const struct ieee80211_tx_ampdu *);
int ieee80211_send_action(struct ieee80211_node *, int, int, uint16_t [4]);

uint8_t	*ieee80211_add_htcap(uint8_t *, struct ieee80211_node *);
uint8_t	*ieee80211_add_htcap_vendor(uint8_t *, struct ieee80211_node *);
uint8_t	*ieee80211_add_htinfo(uint8_t *, struct ieee80211_node *);
uint8_t	*ieee80211_add_htinfo_vendor(uint8_t *, struct ieee80211_node *);

struct ieee80211_beacon_offsets;
void ieee80211_ht_update_beacon(struct ieee80211com *,
    struct ieee80211_beacon_offsets *);

#ifdef	__cplusplus
}
#endif

#endif /* _SYS_NET80211_HT_H */