Deleted Added
full compact
ieee80211_proto.h (153973) ieee80211_proto.h (160690)
1/*-
2 * Copyright (c) 2001 Atsushi Onoe
3 * Copyright (c) 2002-2005 Sam Leffler, Errno Consulting
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * 3. The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * Alternatively, this software may be distributed under the terms of the
18 * GNU General Public License ("GPL") version 2 as published by the Free
19 * Software Foundation.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
22 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
23 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
24 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
25 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
26 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
30 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 *
1/*-
2 * Copyright (c) 2001 Atsushi Onoe
3 * Copyright (c) 2002-2005 Sam Leffler, Errno Consulting
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * 3. The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * Alternatively, this software may be distributed under the terms of the
18 * GNU General Public License ("GPL") version 2 as published by the Free
19 * Software Foundation.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
22 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
23 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
24 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
25 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
26 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
30 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 *
32 * $FreeBSD: head/sys/net80211/ieee80211_proto.h 153973 2006-01-02 16:57:20Z sam $
32 * $FreeBSD: head/sys/net80211/ieee80211_proto.h 160690 2006-07-26 03:15:16Z sam $
33 */
34#ifndef _NET80211_IEEE80211_PROTO_H_
35#define _NET80211_IEEE80211_PROTO_H_
36
37/*
38 * 802.11 protocol implementation definitions.
39 */
40
41enum ieee80211_state {
42 IEEE80211_S_INIT = 0, /* default state */
43 IEEE80211_S_SCAN = 1, /* scanning */
44 IEEE80211_S_AUTH = 2, /* try to authenticate */
45 IEEE80211_S_ASSOC = 3, /* try to assoc */
46 IEEE80211_S_RUN = 4, /* associated */
47};
48#define IEEE80211_S_MAX (IEEE80211_S_RUN+1)
49
50#define IEEE80211_SEND_MGMT(_ic,_ni,_type,_arg) \
51 ((*(_ic)->ic_send_mgmt)(_ic, _ni, _type, _arg))
52
53extern const char *ieee80211_mgt_subtype_name[];
54extern const char *ieee80211_phymode_name[];
55
56void ieee80211_proto_attach(struct ieee80211com *);
57void ieee80211_proto_detach(struct ieee80211com *);
58
59struct ieee80211_node;
60int ieee80211_input(struct ieee80211com *, struct mbuf *,
61 struct ieee80211_node *, int, u_int32_t);
62int ieee80211_setup_rates(struct ieee80211_node *ni,
63 const u_int8_t *rates, const u_int8_t *xrates, int flags);
64void ieee80211_saveie(u_int8_t **, const u_int8_t *);
65void ieee80211_recv_mgmt(struct ieee80211com *, struct mbuf *,
66 struct ieee80211_node *, int, int, u_int32_t);
33 */
34#ifndef _NET80211_IEEE80211_PROTO_H_
35#define _NET80211_IEEE80211_PROTO_H_
36
37/*
38 * 802.11 protocol implementation definitions.
39 */
40
41enum ieee80211_state {
42 IEEE80211_S_INIT = 0, /* default state */
43 IEEE80211_S_SCAN = 1, /* scanning */
44 IEEE80211_S_AUTH = 2, /* try to authenticate */
45 IEEE80211_S_ASSOC = 3, /* try to assoc */
46 IEEE80211_S_RUN = 4, /* associated */
47};
48#define IEEE80211_S_MAX (IEEE80211_S_RUN+1)
49
50#define IEEE80211_SEND_MGMT(_ic,_ni,_type,_arg) \
51 ((*(_ic)->ic_send_mgmt)(_ic, _ni, _type, _arg))
52
53extern const char *ieee80211_mgt_subtype_name[];
54extern const char *ieee80211_phymode_name[];
55
56void ieee80211_proto_attach(struct ieee80211com *);
57void ieee80211_proto_detach(struct ieee80211com *);
58
59struct ieee80211_node;
60int ieee80211_input(struct ieee80211com *, struct mbuf *,
61 struct ieee80211_node *, int, u_int32_t);
62int ieee80211_setup_rates(struct ieee80211_node *ni,
63 const u_int8_t *rates, const u_int8_t *xrates, int flags);
64void ieee80211_saveie(u_int8_t **, const u_int8_t *);
65void ieee80211_recv_mgmt(struct ieee80211com *, struct mbuf *,
66 struct ieee80211_node *, int, int, u_int32_t);
67struct ieee80211_bpf_params;
68int ieee80211_raw_xmit(struct ieee80211_node *, struct mbuf *,
69 const struct ieee80211_bpf_params *);
70int ieee80211_output(struct ifnet *, struct mbuf *,
71 struct sockaddr *, struct rtentry *);
67int ieee80211_send_nulldata(struct ieee80211_node *);
68int ieee80211_send_probereq(struct ieee80211_node *ni,
69 const u_int8_t sa[IEEE80211_ADDR_LEN],
70 const u_int8_t da[IEEE80211_ADDR_LEN],
71 const u_int8_t bssid[IEEE80211_ADDR_LEN],
72 const u_int8_t *ssid, size_t ssidlen,
73 const void *optie, size_t optielen);
74int ieee80211_send_mgmt(struct ieee80211com *, struct ieee80211_node *,
75 int, int);
76int ieee80211_classify(struct ieee80211com *, struct mbuf *,
77 struct ieee80211_node *);
78struct mbuf *ieee80211_encap(struct ieee80211com *, struct mbuf *,
79 struct ieee80211_node *);
80void ieee80211_pwrsave(struct ieee80211com *, struct ieee80211_node *,
81 struct mbuf *);
82
83void ieee80211_reset_erp(struct ieee80211com *);
84void ieee80211_set_shortslottime(struct ieee80211com *, int onoff);
85int ieee80211_iserp_rateset(struct ieee80211com *,
86 struct ieee80211_rateset *);
87void ieee80211_set11gbasicrates(struct ieee80211_rateset *,
88 enum ieee80211_phymode);
89
90/*
91 * Return the size of the 802.11 header for a management or data frame.
92 */
93static __inline int
94ieee80211_hdrsize(const void *data)
95{
96 const struct ieee80211_frame *wh = data;
97 int size = sizeof(struct ieee80211_frame);
98
99 /* NB: we don't handle control frames */
100 KASSERT((wh->i_fc[0]&IEEE80211_FC0_TYPE_MASK) != IEEE80211_FC0_TYPE_CTL,
101 ("%s: control frame", __func__));
102 if ((wh->i_fc[1] & IEEE80211_FC1_DIR_MASK) == IEEE80211_FC1_DIR_DSTODS)
103 size += IEEE80211_ADDR_LEN;
104 if (IEEE80211_QOS_HAS_SEQ(wh))
105 size += sizeof(u_int16_t);
106 return size;
107}
108
109/*
110 * Return the size of the 802.11 header; handles any type of frame.
111 */
112static __inline int
113ieee80211_anyhdrsize(const void *data)
114{
115 const struct ieee80211_frame *wh = data;
116
117 if ((wh->i_fc[0]&IEEE80211_FC0_TYPE_MASK) == IEEE80211_FC0_TYPE_CTL) {
118 switch (wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK) {
119 case IEEE80211_FC0_SUBTYPE_CTS:
120 case IEEE80211_FC0_SUBTYPE_ACK:
121 return sizeof(struct ieee80211_frame_ack);
122 }
123 return sizeof(struct ieee80211_frame_min);
124 } else
125 return ieee80211_hdrsize(data);
126}
127
128/*
129 * Template for an in-kernel authenticator. Authenticators
130 * register with the protocol code and are typically loaded
131 * as separate modules as needed.
132 */
133struct ieee80211_authenticator {
134 const char *ia_name; /* printable name */
135 int (*ia_attach)(struct ieee80211com *);
136 void (*ia_detach)(struct ieee80211com *);
137 void (*ia_node_join)(struct ieee80211com *,
138 struct ieee80211_node *);
139 void (*ia_node_leave)(struct ieee80211com *,
140 struct ieee80211_node *);
141};
142void ieee80211_authenticator_register(int type,
143 const struct ieee80211_authenticator *);
144void ieee80211_authenticator_unregister(int type);
145const struct ieee80211_authenticator *ieee80211_authenticator_get(int auth);
146
147struct ieee80211req;
148/*
149 * Template for an MAC ACL policy module. Such modules
150 * register with the protocol code and are passed the sender's
151 * address of each received frame for validation.
152 */
153struct ieee80211_aclator {
154 const char *iac_name; /* printable name */
155 int (*iac_attach)(struct ieee80211com *);
156 void (*iac_detach)(struct ieee80211com *);
157 int (*iac_check)(struct ieee80211com *,
158 const u_int8_t mac[IEEE80211_ADDR_LEN]);
159 int (*iac_add)(struct ieee80211com *,
160 const u_int8_t mac[IEEE80211_ADDR_LEN]);
161 int (*iac_remove)(struct ieee80211com *,
162 const u_int8_t mac[IEEE80211_ADDR_LEN]);
163 int (*iac_flush)(struct ieee80211com *);
164 int (*iac_setpolicy)(struct ieee80211com *, int);
165 int (*iac_getpolicy)(struct ieee80211com *);
166 int (*iac_setioctl)(struct ieee80211com *, struct ieee80211req *);
167 int (*iac_getioctl)(struct ieee80211com *, struct ieee80211req *);
168};
169void ieee80211_aclator_register(const struct ieee80211_aclator *);
170void ieee80211_aclator_unregister(const struct ieee80211_aclator *);
171const struct ieee80211_aclator *ieee80211_aclator_get(const char *name);
172
173/* flags for ieee80211_fix_rate() */
174#define IEEE80211_F_DOSORT 0x00000001 /* sort rate list */
175#define IEEE80211_F_DOFRATE 0x00000002 /* use fixed rate */
176#define IEEE80211_F_DONEGO 0x00000004 /* calc negotiated rate */
177#define IEEE80211_F_DODEL 0x00000008 /* delete ignore rate */
178int ieee80211_fix_rate(struct ieee80211_node *, int);
179
180/*
181 * WME/WMM support.
182 */
183struct wmeParams {
184 u_int8_t wmep_acm;
185 u_int8_t wmep_aifsn;
186 u_int8_t wmep_logcwmin; /* log2(cwmin) */
187 u_int8_t wmep_logcwmax; /* log2(cwmax) */
188 u_int8_t wmep_txopLimit;
189 u_int8_t wmep_noackPolicy; /* 0 (ack), 1 (no ack) */
190};
191#define IEEE80211_TXOP_TO_US(_txop) ((_txop)<<5)
192#define IEEE80211_US_TO_TXOP(_us) ((_us)>>5)
193
194struct chanAccParams {
195 u_int8_t cap_info; /* version of the current set */
196 struct wmeParams cap_wmeParams[WME_NUM_AC];
197};
198
199struct ieee80211_wme_state {
200 u_int wme_flags;
201#define WME_F_AGGRMODE 0x00000001 /* STATUS: WME agressive mode */
202 u_int wme_hipri_traffic; /* VI/VO frames in beacon interval */
203 u_int wme_hipri_switch_thresh;/* agressive mode switch thresh */
204 u_int wme_hipri_switch_hysteresis;/* agressive mode switch hysteresis */
205
206 struct wmeParams wme_params[4]; /* from assoc resp for each AC*/
207 struct chanAccParams wme_wmeChanParams; /* WME params applied to self */
208 struct chanAccParams wme_wmeBssChanParams;/* WME params bcast to stations */
209 struct chanAccParams wme_chanParams; /* params applied to self */
210 struct chanAccParams wme_bssChanParams; /* params bcast to stations */
211
212 int (*wme_update)(struct ieee80211com *);
213};
214
215void ieee80211_wme_initparams(struct ieee80211com *);
216void ieee80211_wme_updateparams(struct ieee80211com *);
217void ieee80211_wme_updateparams_locked(struct ieee80211com *);
218
219#define ieee80211_new_state(_ic, _nstate, _arg) \
220 (((_ic)->ic_newstate)((_ic), (_nstate), (_arg)))
221void ieee80211_beacon_miss(struct ieee80211com *);
222void ieee80211_print_essid(const u_int8_t *, int);
223void ieee80211_dump_pkt(const u_int8_t *, int, int, int);
224
225extern const char *ieee80211_state_name[IEEE80211_S_MAX];
226extern const char *ieee80211_wme_acnames[];
227
228/*
229 * Beacon frames constructed by ieee80211_beacon_alloc
230 * have the following structure filled in so drivers
231 * can update the frame later w/ minimal overhead.
232 */
233struct ieee80211_beacon_offsets {
234 u_int16_t *bo_caps; /* capabilities */
235 u_int8_t *bo_tim; /* start of atim/dtim */
236 u_int8_t *bo_wme; /* start of WME parameters */
237 u_int8_t *bo_trailer; /* start of fixed-size trailer */
238 u_int16_t bo_tim_len; /* atim/dtim length in bytes */
239 u_int16_t bo_trailer_len; /* trailer length in bytes */
240 u_int8_t *bo_erp; /* start of ERP element */
241};
242struct mbuf *ieee80211_beacon_alloc(struct ieee80211com *,
243 struct ieee80211_node *, struct ieee80211_beacon_offsets *);
244int ieee80211_beacon_update(struct ieee80211com *,
245 struct ieee80211_node *, struct ieee80211_beacon_offsets *,
246 struct mbuf *, int broadcast);
247
248/*
249 * Notification methods called from the 802.11 state machine.
250 * Note that while these are defined here, their implementation
251 * is OS-specific.
252 */
253void ieee80211_notify_node_join(struct ieee80211com *,
254 struct ieee80211_node *, int newassoc);
255void ieee80211_notify_node_leave(struct ieee80211com *,
256 struct ieee80211_node *);
257void ieee80211_notify_scan_done(struct ieee80211com *);
258#endif /* _NET80211_IEEE80211_PROTO_H_ */
72int ieee80211_send_nulldata(struct ieee80211_node *);
73int ieee80211_send_probereq(struct ieee80211_node *ni,
74 const u_int8_t sa[IEEE80211_ADDR_LEN],
75 const u_int8_t da[IEEE80211_ADDR_LEN],
76 const u_int8_t bssid[IEEE80211_ADDR_LEN],
77 const u_int8_t *ssid, size_t ssidlen,
78 const void *optie, size_t optielen);
79int ieee80211_send_mgmt(struct ieee80211com *, struct ieee80211_node *,
80 int, int);
81int ieee80211_classify(struct ieee80211com *, struct mbuf *,
82 struct ieee80211_node *);
83struct mbuf *ieee80211_encap(struct ieee80211com *, struct mbuf *,
84 struct ieee80211_node *);
85void ieee80211_pwrsave(struct ieee80211com *, struct ieee80211_node *,
86 struct mbuf *);
87
88void ieee80211_reset_erp(struct ieee80211com *);
89void ieee80211_set_shortslottime(struct ieee80211com *, int onoff);
90int ieee80211_iserp_rateset(struct ieee80211com *,
91 struct ieee80211_rateset *);
92void ieee80211_set11gbasicrates(struct ieee80211_rateset *,
93 enum ieee80211_phymode);
94
95/*
96 * Return the size of the 802.11 header for a management or data frame.
97 */
98static __inline int
99ieee80211_hdrsize(const void *data)
100{
101 const struct ieee80211_frame *wh = data;
102 int size = sizeof(struct ieee80211_frame);
103
104 /* NB: we don't handle control frames */
105 KASSERT((wh->i_fc[0]&IEEE80211_FC0_TYPE_MASK) != IEEE80211_FC0_TYPE_CTL,
106 ("%s: control frame", __func__));
107 if ((wh->i_fc[1] & IEEE80211_FC1_DIR_MASK) == IEEE80211_FC1_DIR_DSTODS)
108 size += IEEE80211_ADDR_LEN;
109 if (IEEE80211_QOS_HAS_SEQ(wh))
110 size += sizeof(u_int16_t);
111 return size;
112}
113
114/*
115 * Return the size of the 802.11 header; handles any type of frame.
116 */
117static __inline int
118ieee80211_anyhdrsize(const void *data)
119{
120 const struct ieee80211_frame *wh = data;
121
122 if ((wh->i_fc[0]&IEEE80211_FC0_TYPE_MASK) == IEEE80211_FC0_TYPE_CTL) {
123 switch (wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK) {
124 case IEEE80211_FC0_SUBTYPE_CTS:
125 case IEEE80211_FC0_SUBTYPE_ACK:
126 return sizeof(struct ieee80211_frame_ack);
127 }
128 return sizeof(struct ieee80211_frame_min);
129 } else
130 return ieee80211_hdrsize(data);
131}
132
133/*
134 * Template for an in-kernel authenticator. Authenticators
135 * register with the protocol code and are typically loaded
136 * as separate modules as needed.
137 */
138struct ieee80211_authenticator {
139 const char *ia_name; /* printable name */
140 int (*ia_attach)(struct ieee80211com *);
141 void (*ia_detach)(struct ieee80211com *);
142 void (*ia_node_join)(struct ieee80211com *,
143 struct ieee80211_node *);
144 void (*ia_node_leave)(struct ieee80211com *,
145 struct ieee80211_node *);
146};
147void ieee80211_authenticator_register(int type,
148 const struct ieee80211_authenticator *);
149void ieee80211_authenticator_unregister(int type);
150const struct ieee80211_authenticator *ieee80211_authenticator_get(int auth);
151
152struct ieee80211req;
153/*
154 * Template for an MAC ACL policy module. Such modules
155 * register with the protocol code and are passed the sender's
156 * address of each received frame for validation.
157 */
158struct ieee80211_aclator {
159 const char *iac_name; /* printable name */
160 int (*iac_attach)(struct ieee80211com *);
161 void (*iac_detach)(struct ieee80211com *);
162 int (*iac_check)(struct ieee80211com *,
163 const u_int8_t mac[IEEE80211_ADDR_LEN]);
164 int (*iac_add)(struct ieee80211com *,
165 const u_int8_t mac[IEEE80211_ADDR_LEN]);
166 int (*iac_remove)(struct ieee80211com *,
167 const u_int8_t mac[IEEE80211_ADDR_LEN]);
168 int (*iac_flush)(struct ieee80211com *);
169 int (*iac_setpolicy)(struct ieee80211com *, int);
170 int (*iac_getpolicy)(struct ieee80211com *);
171 int (*iac_setioctl)(struct ieee80211com *, struct ieee80211req *);
172 int (*iac_getioctl)(struct ieee80211com *, struct ieee80211req *);
173};
174void ieee80211_aclator_register(const struct ieee80211_aclator *);
175void ieee80211_aclator_unregister(const struct ieee80211_aclator *);
176const struct ieee80211_aclator *ieee80211_aclator_get(const char *name);
177
178/* flags for ieee80211_fix_rate() */
179#define IEEE80211_F_DOSORT 0x00000001 /* sort rate list */
180#define IEEE80211_F_DOFRATE 0x00000002 /* use fixed rate */
181#define IEEE80211_F_DONEGO 0x00000004 /* calc negotiated rate */
182#define IEEE80211_F_DODEL 0x00000008 /* delete ignore rate */
183int ieee80211_fix_rate(struct ieee80211_node *, int);
184
185/*
186 * WME/WMM support.
187 */
188struct wmeParams {
189 u_int8_t wmep_acm;
190 u_int8_t wmep_aifsn;
191 u_int8_t wmep_logcwmin; /* log2(cwmin) */
192 u_int8_t wmep_logcwmax; /* log2(cwmax) */
193 u_int8_t wmep_txopLimit;
194 u_int8_t wmep_noackPolicy; /* 0 (ack), 1 (no ack) */
195};
196#define IEEE80211_TXOP_TO_US(_txop) ((_txop)<<5)
197#define IEEE80211_US_TO_TXOP(_us) ((_us)>>5)
198
199struct chanAccParams {
200 u_int8_t cap_info; /* version of the current set */
201 struct wmeParams cap_wmeParams[WME_NUM_AC];
202};
203
204struct ieee80211_wme_state {
205 u_int wme_flags;
206#define WME_F_AGGRMODE 0x00000001 /* STATUS: WME agressive mode */
207 u_int wme_hipri_traffic; /* VI/VO frames in beacon interval */
208 u_int wme_hipri_switch_thresh;/* agressive mode switch thresh */
209 u_int wme_hipri_switch_hysteresis;/* agressive mode switch hysteresis */
210
211 struct wmeParams wme_params[4]; /* from assoc resp for each AC*/
212 struct chanAccParams wme_wmeChanParams; /* WME params applied to self */
213 struct chanAccParams wme_wmeBssChanParams;/* WME params bcast to stations */
214 struct chanAccParams wme_chanParams; /* params applied to self */
215 struct chanAccParams wme_bssChanParams; /* params bcast to stations */
216
217 int (*wme_update)(struct ieee80211com *);
218};
219
220void ieee80211_wme_initparams(struct ieee80211com *);
221void ieee80211_wme_updateparams(struct ieee80211com *);
222void ieee80211_wme_updateparams_locked(struct ieee80211com *);
223
224#define ieee80211_new_state(_ic, _nstate, _arg) \
225 (((_ic)->ic_newstate)((_ic), (_nstate), (_arg)))
226void ieee80211_beacon_miss(struct ieee80211com *);
227void ieee80211_print_essid(const u_int8_t *, int);
228void ieee80211_dump_pkt(const u_int8_t *, int, int, int);
229
230extern const char *ieee80211_state_name[IEEE80211_S_MAX];
231extern const char *ieee80211_wme_acnames[];
232
233/*
234 * Beacon frames constructed by ieee80211_beacon_alloc
235 * have the following structure filled in so drivers
236 * can update the frame later w/ minimal overhead.
237 */
238struct ieee80211_beacon_offsets {
239 u_int16_t *bo_caps; /* capabilities */
240 u_int8_t *bo_tim; /* start of atim/dtim */
241 u_int8_t *bo_wme; /* start of WME parameters */
242 u_int8_t *bo_trailer; /* start of fixed-size trailer */
243 u_int16_t bo_tim_len; /* atim/dtim length in bytes */
244 u_int16_t bo_trailer_len; /* trailer length in bytes */
245 u_int8_t *bo_erp; /* start of ERP element */
246};
247struct mbuf *ieee80211_beacon_alloc(struct ieee80211com *,
248 struct ieee80211_node *, struct ieee80211_beacon_offsets *);
249int ieee80211_beacon_update(struct ieee80211com *,
250 struct ieee80211_node *, struct ieee80211_beacon_offsets *,
251 struct mbuf *, int broadcast);
252
253/*
254 * Notification methods called from the 802.11 state machine.
255 * Note that while these are defined here, their implementation
256 * is OS-specific.
257 */
258void ieee80211_notify_node_join(struct ieee80211com *,
259 struct ieee80211_node *, int newassoc);
260void ieee80211_notify_node_leave(struct ieee80211com *,
261 struct ieee80211_node *);
262void ieee80211_notify_scan_done(struct ieee80211com *);
263#endif /* _NET80211_IEEE80211_PROTO_H_ */