source: rtems-libbsd/freebsd/sys/net80211/ieee80211_proto.h @ a241ea8

55-freebsd-126-freebsd-12
Last change on this file since a241ea8 was a241ea8, checked in by Christian Mauderer <Christian.Mauderer@…>, on 11/14/16 at 12:46:13

Import IEEE 802.11 from FreeBSD.

  • Property mode set to 100644
File size: 17.3 KB
Line 
1/*-
2 * Copyright (c) 2001 Atsushi Onoe
3 * Copyright (c) 2002-2009 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 *
15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
19 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 *
26 * $FreeBSD$
27 */
28#ifndef _NET80211_IEEE80211_PROTO_H_
29#define _NET80211_IEEE80211_PROTO_H_
30
31/*
32 * 802.11 protocol implementation definitions.
33 */
34
35enum ieee80211_state {
36        IEEE80211_S_INIT        = 0,    /* default state */
37        IEEE80211_S_SCAN        = 1,    /* scanning */
38        IEEE80211_S_AUTH        = 2,    /* try to authenticate */
39        IEEE80211_S_ASSOC       = 3,    /* try to assoc */
40        IEEE80211_S_CAC         = 4,    /* doing channel availability check */
41        IEEE80211_S_RUN         = 5,    /* operational (e.g. associated) */
42        IEEE80211_S_CSA         = 6,    /* channel switch announce pending */
43        IEEE80211_S_SLEEP       = 7,    /* power save */
44};
45#define IEEE80211_S_MAX         (IEEE80211_S_SLEEP+1)
46
47#define IEEE80211_SEND_MGMT(_ni,_type,_arg) \
48        ((*(_ni)->ni_ic->ic_send_mgmt)(_ni, _type, _arg))
49
50extern  const char *mgt_subtype_name[];
51extern  const char *ctl_subtype_name[];
52extern  const char *ieee80211_phymode_name[IEEE80211_MODE_MAX];
53extern  const int ieee80211_opcap[IEEE80211_OPMODE_MAX];
54
55static __inline const char *
56ieee80211_mgt_subtype_name(uint8_t subtype)
57{
58        return mgt_subtype_name[(subtype & IEEE80211_FC0_SUBTYPE_MASK) >>
59                   IEEE80211_FC0_SUBTYPE_SHIFT];
60}
61
62static __inline const char *
63ieee80211_ctl_subtype_name(uint8_t subtype)
64{
65        return ctl_subtype_name[(subtype & IEEE80211_FC0_SUBTYPE_MASK) >>
66                   IEEE80211_FC0_SUBTYPE_SHIFT];
67}
68
69const char *ieee80211_reason_to_string(uint16_t);
70
71void    ieee80211_proto_attach(struct ieee80211com *);
72void    ieee80211_proto_detach(struct ieee80211com *);
73void    ieee80211_proto_vattach(struct ieee80211vap *);
74void    ieee80211_proto_vdetach(struct ieee80211vap *);
75
76void    ieee80211_promisc(struct ieee80211vap *, bool);
77void    ieee80211_allmulti(struct ieee80211vap *, bool);
78void    ieee80211_syncflag(struct ieee80211vap *, int flag);
79void    ieee80211_syncflag_ht(struct ieee80211vap *, int flag);
80void    ieee80211_syncflag_vht(struct ieee80211vap *, int flag);
81void    ieee80211_syncflag_ext(struct ieee80211vap *, int flag);
82
83#define ieee80211_input(ni, m, rssi, nf) \
84        ((ni)->ni_vap->iv_input(ni, m, NULL, rssi, nf))
85int     ieee80211_input_all(struct ieee80211com *, struct mbuf *, int, int);
86
87int     ieee80211_input_mimo(struct ieee80211_node *, struct mbuf *);
88int     ieee80211_input_mimo_all(struct ieee80211com *, struct mbuf *);
89
90struct ieee80211_bpf_params;
91int     ieee80211_mgmt_output(struct ieee80211_node *, struct mbuf *, int,
92                struct ieee80211_bpf_params *);
93int     ieee80211_raw_xmit(struct ieee80211_node *, struct mbuf *,
94                const struct ieee80211_bpf_params *);
95int     ieee80211_output(struct ifnet *, struct mbuf *,
96               const struct sockaddr *, struct route *ro);
97int     ieee80211_vap_pkt_send_dest(struct ieee80211vap *, struct mbuf *,
98                struct ieee80211_node *);
99int     ieee80211_raw_output(struct ieee80211vap *, struct ieee80211_node *,
100                struct mbuf *, const struct ieee80211_bpf_params *);
101void    ieee80211_send_setup(struct ieee80211_node *, struct mbuf *, int, int,
102        const uint8_t [IEEE80211_ADDR_LEN], const uint8_t [IEEE80211_ADDR_LEN],
103        const uint8_t [IEEE80211_ADDR_LEN]);
104int     ieee80211_vap_transmit(struct ifnet *ifp, struct mbuf *m);
105void    ieee80211_vap_qflush(struct ifnet *ifp);
106int     ieee80211_send_nulldata(struct ieee80211_node *);
107int     ieee80211_classify(struct ieee80211_node *, struct mbuf *m);
108struct mbuf *ieee80211_mbuf_adjust(struct ieee80211vap *, int,
109                struct ieee80211_key *, struct mbuf *);
110struct mbuf *ieee80211_encap(struct ieee80211vap *, struct ieee80211_node *,
111                struct mbuf *);
112void    ieee80211_free_mbuf(struct mbuf *);
113int     ieee80211_send_mgmt(struct ieee80211_node *, int, int);
114struct ieee80211_appie;
115int     ieee80211_send_probereq(struct ieee80211_node *ni,
116                const uint8_t sa[IEEE80211_ADDR_LEN],
117                const uint8_t da[IEEE80211_ADDR_LEN],
118                const uint8_t bssid[IEEE80211_ADDR_LEN],
119                const uint8_t *ssid, size_t ssidlen);
120struct mbuf *   ieee80211_ff_encap1(struct ieee80211vap *, struct mbuf *,
121                const struct ether_header *);
122void    ieee80211_tx_complete(struct ieee80211_node *,
123                struct mbuf *, int);
124
125/*
126 * The formation of ProbeResponse frames requires guidance to
127 * deal with legacy clients.  When the client is identified as
128 * "legacy 11b" ieee80211_send_proberesp is passed this token.
129 */
130#define IEEE80211_SEND_LEGACY_11B       0x1     /* legacy 11b client */
131#define IEEE80211_SEND_LEGACY_11        0x2     /* other legacy client */
132#define IEEE80211_SEND_LEGACY           0x3     /* any legacy client */
133struct mbuf *ieee80211_alloc_proberesp(struct ieee80211_node *, int);
134int     ieee80211_send_proberesp(struct ieee80211vap *,
135                const uint8_t da[IEEE80211_ADDR_LEN], int);
136struct mbuf *ieee80211_alloc_rts(struct ieee80211com *ic,
137                const uint8_t [IEEE80211_ADDR_LEN],
138                const uint8_t [IEEE80211_ADDR_LEN], uint16_t);
139struct mbuf *ieee80211_alloc_cts(struct ieee80211com *,
140                const uint8_t [IEEE80211_ADDR_LEN], uint16_t);
141
142uint8_t *ieee80211_add_rates(uint8_t *, const struct ieee80211_rateset *);
143uint8_t *ieee80211_add_xrates(uint8_t *, const struct ieee80211_rateset *);
144uint8_t *ieee80211_add_ssid(uint8_t *, const uint8_t *, u_int);
145uint8_t *ieee80211_add_wpa(uint8_t *, const struct ieee80211vap *);
146uint8_t *ieee80211_add_rsn(uint8_t *, const struct ieee80211vap *);
147uint8_t *ieee80211_add_qos(uint8_t *, const struct ieee80211_node *);
148uint16_t ieee80211_getcapinfo(struct ieee80211vap *,
149                struct ieee80211_channel *);
150struct ieee80211_wme_state;
151uint8_t * ieee80211_add_wme_info(uint8_t *frm, struct ieee80211_wme_state *wme);
152
153void    ieee80211_reset_erp(struct ieee80211com *);
154void    ieee80211_set_shortslottime(struct ieee80211com *, int onoff);
155int     ieee80211_iserp_rateset(const struct ieee80211_rateset *);
156void    ieee80211_setbasicrates(struct ieee80211_rateset *,
157                enum ieee80211_phymode);
158void    ieee80211_addbasicrates(struct ieee80211_rateset *,
159                enum ieee80211_phymode);
160
161/*
162 * Return the size of the 802.11 header for a management or data frame.
163 */
164static __inline int
165ieee80211_hdrsize(const void *data)
166{
167        const struct ieee80211_frame *wh = data;
168        int size = sizeof(struct ieee80211_frame);
169
170        /* NB: we don't handle control frames */
171        KASSERT((wh->i_fc[0]&IEEE80211_FC0_TYPE_MASK) != IEEE80211_FC0_TYPE_CTL,
172                ("%s: control frame", __func__));
173        if (IEEE80211_IS_DSTODS(wh))
174                size += IEEE80211_ADDR_LEN;
175        if (IEEE80211_QOS_HAS_SEQ(wh))
176                size += sizeof(uint16_t);
177        return size;
178}
179
180/*
181 * Like ieee80211_hdrsize, but handles any type of frame.
182 */
183static __inline int
184ieee80211_anyhdrsize(const void *data)
185{
186        const struct ieee80211_frame *wh = data;
187
188        if ((wh->i_fc[0]&IEEE80211_FC0_TYPE_MASK) == IEEE80211_FC0_TYPE_CTL) {
189                switch (wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK) {
190                case IEEE80211_FC0_SUBTYPE_CTS:
191                case IEEE80211_FC0_SUBTYPE_ACK:
192                        return sizeof(struct ieee80211_frame_ack);
193                case IEEE80211_FC0_SUBTYPE_BAR:
194                        return sizeof(struct ieee80211_frame_bar);
195                }
196                return sizeof(struct ieee80211_frame_min);
197        } else
198                return ieee80211_hdrsize(data);
199}
200
201/*
202 * Template for an in-kernel authenticator.  Authenticators
203 * register with the protocol code and are typically loaded
204 * as separate modules as needed.  One special authenticator
205 * is xauth; it intercepts requests so that protocols like
206 * WPA can be handled in user space.
207 */
208struct ieee80211_authenticator {
209        const char *ia_name;            /* printable name */
210        int     (*ia_attach)(struct ieee80211vap *);
211        void    (*ia_detach)(struct ieee80211vap *);
212        void    (*ia_node_join)(struct ieee80211_node *);
213        void    (*ia_node_leave)(struct ieee80211_node *);
214};
215void    ieee80211_authenticator_register(int type,
216                const struct ieee80211_authenticator *);
217void    ieee80211_authenticator_unregister(int type);
218const struct ieee80211_authenticator *ieee80211_authenticator_get(int auth);
219
220struct ieee80211req;
221/*
222 * Template for an MAC ACL policy module.  Such modules
223 * register with the protocol code and are passed the sender's
224 * address of each received auth frame for validation.
225 */
226struct ieee80211_aclator {
227        const char *iac_name;           /* printable name */
228        int     (*iac_attach)(struct ieee80211vap *);
229        void    (*iac_detach)(struct ieee80211vap *);
230        int     (*iac_check)(struct ieee80211vap *,
231                        const struct ieee80211_frame *wh);
232        int     (*iac_add)(struct ieee80211vap *,
233                        const uint8_t mac[IEEE80211_ADDR_LEN]);
234        int     (*iac_remove)(struct ieee80211vap *,
235                        const uint8_t mac[IEEE80211_ADDR_LEN]);
236        int     (*iac_flush)(struct ieee80211vap *);
237        int     (*iac_setpolicy)(struct ieee80211vap *, int);
238        int     (*iac_getpolicy)(struct ieee80211vap *);
239        int     (*iac_setioctl)(struct ieee80211vap *, struct ieee80211req *);
240        int     (*iac_getioctl)(struct ieee80211vap *, struct ieee80211req *);
241};
242void    ieee80211_aclator_register(const struct ieee80211_aclator *);
243void    ieee80211_aclator_unregister(const struct ieee80211_aclator *);
244const struct ieee80211_aclator *ieee80211_aclator_get(const char *name);
245
246/* flags for ieee80211_fix_rate() */
247#define IEEE80211_F_DOSORT      0x00000001      /* sort rate list */
248#define IEEE80211_F_DOFRATE     0x00000002      /* use fixed legacy rate */
249#define IEEE80211_F_DONEGO      0x00000004      /* calc negotiated rate */
250#define IEEE80211_F_DODEL       0x00000008      /* delete ignore rate */
251#define IEEE80211_F_DOBRS       0x00000010      /* check basic rate set */
252#define IEEE80211_F_JOIN        0x00000020      /* sta joining our bss */
253#define IEEE80211_F_DOFMCS      0x00000040      /* use fixed HT rate */
254int     ieee80211_fix_rate(struct ieee80211_node *,
255                struct ieee80211_rateset *, int);
256
257/*
258 * WME/WMM support.
259 */
260struct wmeParams {
261        uint8_t         wmep_acm;
262        uint8_t         wmep_aifsn;
263        uint8_t         wmep_logcwmin;          /* log2(cwmin) */
264        uint8_t         wmep_logcwmax;          /* log2(cwmax) */
265        uint8_t         wmep_txopLimit;
266        uint8_t         wmep_noackPolicy;       /* 0 (ack), 1 (no ack) */
267};
268#define IEEE80211_TXOP_TO_US(_txop)     ((_txop)<<5)
269#define IEEE80211_US_TO_TXOP(_us)       ((_us)>>5)
270
271struct chanAccParams {
272        uint8_t         cap_info;               /* version of the current set */
273        struct wmeParams cap_wmeParams[WME_NUM_AC];
274};
275
276struct ieee80211_wme_state {
277        u_int   wme_flags;
278#define WME_F_AGGRMODE  0x00000001      /* STATUS: WME aggressive mode */
279        u_int   wme_hipri_traffic;      /* VI/VO frames in beacon interval */
280        u_int   wme_hipri_switch_thresh;/* aggressive mode switch thresh */
281        u_int   wme_hipri_switch_hysteresis;/* aggressive mode switch hysteresis */
282
283        struct wmeParams wme_params[4];         /* from assoc resp for each AC*/
284        struct chanAccParams wme_wmeChanParams; /* WME params applied to self */
285        struct chanAccParams wme_wmeBssChanParams;/* WME params bcast to stations */
286        struct chanAccParams wme_chanParams;    /* params applied to self */
287        struct chanAccParams wme_bssChanParams; /* params bcast to stations */
288
289        int     (*wme_update)(struct ieee80211com *);
290};
291
292void    ieee80211_wme_initparams(struct ieee80211vap *);
293void    ieee80211_wme_updateparams(struct ieee80211vap *);
294void    ieee80211_wme_updateparams_locked(struct ieee80211vap *);
295
296/*
297 * Return the WME TID from a QoS frame.  If no TID
298 * is present return the index for the "non-QoS" entry.
299 */
300static __inline uint8_t
301ieee80211_gettid(const struct ieee80211_frame *wh)
302{
303        uint8_t tid;
304
305        if (IEEE80211_QOS_HAS_SEQ(wh)) {
306                if (IEEE80211_IS_DSTODS(wh))
307                        tid = ((const struct ieee80211_qosframe_addr4 *)wh)->
308                                i_qos[0];
309                else
310                        tid = ((const struct ieee80211_qosframe *)wh)->i_qos[0];
311                tid &= IEEE80211_QOS_TID;
312        } else
313                tid = IEEE80211_NONQOS_TID;
314        return tid;
315}
316
317void    ieee80211_waitfor_parent(struct ieee80211com *);
318void    ieee80211_start_locked(struct ieee80211vap *);
319void    ieee80211_init(void *);
320void    ieee80211_start_all(struct ieee80211com *);
321void    ieee80211_stop_locked(struct ieee80211vap *);
322void    ieee80211_stop(struct ieee80211vap *);
323void    ieee80211_stop_all(struct ieee80211com *);
324void    ieee80211_suspend_all(struct ieee80211com *);
325void    ieee80211_resume_all(struct ieee80211com *);
326void    ieee80211_restart_all(struct ieee80211com *);
327void    ieee80211_dturbo_switch(struct ieee80211vap *, int newflags);
328void    ieee80211_swbmiss(void *arg);
329void    ieee80211_beacon_miss(struct ieee80211com *);
330int     ieee80211_new_state(struct ieee80211vap *, enum ieee80211_state, int);
331int     ieee80211_new_state_locked(struct ieee80211vap *, enum ieee80211_state,
332                int);
333void    ieee80211_print_essid(const uint8_t *, int);
334void    ieee80211_dump_pkt(struct ieee80211com *,
335                const uint8_t *, int, int, int);
336
337extern  const char *ieee80211_opmode_name[];
338extern  const char *ieee80211_state_name[IEEE80211_S_MAX];
339extern  const char *ieee80211_wme_acnames[];
340
341/*
342 * Beacon frames constructed by ieee80211_beacon_alloc
343 * have the following structure filled in so drivers
344 * can update the frame later w/ minimal overhead.
345 */
346struct ieee80211_beacon_offsets {
347        uint8_t         bo_flags[4];    /* update/state flags */
348        uint16_t        *bo_caps;       /* capabilities */
349        uint8_t         *bo_cfp;        /* start of CFParms element */
350        uint8_t         *bo_tim;        /* start of atim/dtim */
351        uint8_t         *bo_wme;        /* start of WME parameters */
352        uint8_t         *bo_tdma;       /* start of TDMA parameters */
353        uint8_t         *bo_tim_trailer;/* start of fixed-size trailer */
354        uint16_t        bo_tim_len;     /* atim/dtim length in bytes */
355        uint16_t        bo_tim_trailer_len;/* tim trailer length in bytes */
356        uint8_t         *bo_erp;        /* start of ERP element */
357        uint8_t         *bo_htinfo;     /* start of HT info element */
358        uint8_t         *bo_ath;        /* start of ATH parameters */
359        uint8_t         *bo_appie;      /* start of AppIE element */
360        uint16_t        bo_appie_len;   /* AppIE length in bytes */
361        uint16_t        bo_csa_trailer_len;
362        uint8_t         *bo_csa;        /* start of CSA element */
363        uint8_t         *bo_quiet;      /* start of Quiet element */
364        uint8_t         *bo_meshconf;   /* start of MESHCONF element */
365        uint8_t         *bo_vhtinfo;    /* start of VHT info element (XXX VHTCAP?) */
366        uint8_t         *bo_spare[2];
367};
368struct mbuf *ieee80211_beacon_alloc(struct ieee80211_node *);
369
370/*
371 * Beacon frame updates are signaled through calls to iv_update_beacon
372 * with one of the IEEE80211_BEACON_* tokens defined below.  For devices
373 * that construct beacon frames on the host this can trigger a rebuild
374 * or defer the processing.  For devices that offload beacon frame
375 * handling this callback can be used to signal a rebuild.  The bo_flags
376 * array in the ieee80211_beacon_offsets structure is intended to record
377 * deferred processing requirements; ieee80211_beacon_update uses the
378 * state to optimize work.  Since this structure is owned by the driver
379 * and not visible to the 802.11 layer drivers must supply an iv_update_beacon
380 * callback that marks the flag bits and schedules (as necessary) an update.
381 */
382enum {
383        IEEE80211_BEACON_CAPS   = 0,    /* capabilities */
384        IEEE80211_BEACON_TIM    = 1,    /* DTIM/ATIM */
385        IEEE80211_BEACON_WME    = 2,
386        IEEE80211_BEACON_ERP    = 3,    /* Extended Rate Phy */
387        IEEE80211_BEACON_HTINFO = 4,    /* HT Information */
388        IEEE80211_BEACON_APPIE  = 5,    /* Application IE's */
389        IEEE80211_BEACON_CFP    = 6,    /* CFParms */
390        IEEE80211_BEACON_CSA    = 7,    /* Channel Switch Announcement */
391        IEEE80211_BEACON_TDMA   = 9,    /* TDMA Info */
392        IEEE80211_BEACON_ATH    = 10,   /* ATH parameters */
393        IEEE80211_BEACON_MESHCONF = 11, /* Mesh Configuration */
394};
395int     ieee80211_beacon_update(struct ieee80211_node *,
396                struct mbuf *, int mcast);
397
398void    ieee80211_csa_startswitch(struct ieee80211com *,
399                struct ieee80211_channel *, int mode, int count);
400void    ieee80211_csa_completeswitch(struct ieee80211com *);
401void    ieee80211_csa_cancelswitch(struct ieee80211com *);
402void    ieee80211_cac_completeswitch(struct ieee80211vap *);
403
404/*
405 * Notification methods called from the 802.11 state machine.
406 * Note that while these are defined here, their implementation
407 * is OS-specific.
408 */
409void    ieee80211_notify_node_join(struct ieee80211_node *, int newassoc);
410void    ieee80211_notify_node_leave(struct ieee80211_node *);
411void    ieee80211_notify_scan_done(struct ieee80211vap *);
412void    ieee80211_notify_wds_discover(struct ieee80211_node *);
413void    ieee80211_notify_csa(struct ieee80211com *,
414                const struct ieee80211_channel *, int mode, int count);
415void    ieee80211_notify_radar(struct ieee80211com *,
416                const struct ieee80211_channel *);
417enum ieee80211_notify_cac_event {
418        IEEE80211_NOTIFY_CAC_START  = 0, /* CAC timer started */
419        IEEE80211_NOTIFY_CAC_STOP   = 1, /* CAC intentionally stopped */
420        IEEE80211_NOTIFY_CAC_RADAR  = 2, /* CAC stopped due to radar detectio */
421        IEEE80211_NOTIFY_CAC_EXPIRE = 3, /* CAC expired w/o radar */
422};
423void    ieee80211_notify_cac(struct ieee80211com *,
424                const struct ieee80211_channel *,
425                enum ieee80211_notify_cac_event);
426void    ieee80211_notify_node_deauth(struct ieee80211_node *);
427void    ieee80211_notify_node_auth(struct ieee80211_node *);
428void    ieee80211_notify_country(struct ieee80211vap *, const uint8_t [],
429                const uint8_t cc[2]);
430void    ieee80211_notify_radio(struct ieee80211com *, int);
431#endif /* _NET80211_IEEE80211_PROTO_H_ */
Note: See TracBrowser for help on using the repository browser.