c524fb34d94af26554a7518dc22c1e0e8fa55ad7
[libeap.git] / hostapd / wme.h
1 /*
2  * hostapd / WMM (Wi-Fi Multimedia)
3  * Copyright 2002-2003, Instant802 Networks, Inc.
4  * Copyright 2005-2006, Devicescape Software, Inc.
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 as
8  * published by the Free Software Foundation.
9  *
10  * Alternatively, this software may be distributed under the terms of BSD
11  * license.
12  *
13  * See README and COPYING for more details.
14  */
15
16 #ifndef WME_H
17 #define WME_H
18
19 #ifdef __linux__
20 #include <endian.h>
21 #endif /* __linux__ */
22
23 #if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__DragonFly__)
24 #include <sys/types.h>
25 #include <sys/endian.h>
26 #endif /* defined(__FreeBSD__) || defined(__NetBSD__) ||
27         * defined(__DragonFly__) */
28
29 #define WME_OUI_TYPE 2
30 #define WME_OUI_SUBTYPE_INFORMATION_ELEMENT 0
31 #define WME_OUI_SUBTYPE_PARAMETER_ELEMENT 1
32 #define WME_OUI_SUBTYPE_TSPEC_ELEMENT 2
33 #define WME_VERSION 1
34
35 #define WME_ACTION_CODE_SETUP_REQUEST 0
36 #define WME_ACTION_CODE_SETUP_RESPONSE 1
37 #define WME_ACTION_CODE_TEARDOWN 2
38
39 #define WME_SETUP_RESPONSE_STATUS_ADMISSION_ACCEPTED 0
40 #define WME_SETUP_RESPONSE_STATUS_INVALID_PARAMETERS 1
41 #define WME_SETUP_RESPONSE_STATUS_REFUSED 3
42
43 #define WME_TSPEC_DIRECTION_UPLINK 0
44 #define WME_TSPEC_DIRECTION_DOWNLINK 1
45 #define WME_TSPEC_DIRECTION_BI_DIRECTIONAL 3
46
47 extern inline u16 tsinfo(int tag1d, int contention_based, int direction)
48 {
49         return (tag1d << 11) | (contention_based << 7) | (direction << 5) |
50           (tag1d << 1);
51 }
52
53
54 struct wme_information_element {
55         /* required fields for WME version 1 */
56         u8 oui[3];
57         u8 oui_type;
58         u8 oui_subtype;
59         u8 version;
60         u8 acInfo;
61
62 } __attribute__ ((packed));
63
64 struct wme_ac_parameter {
65 #if __BYTE_ORDER == __LITTLE_ENDIAN
66         /* byte 1 */
67         u8      aifsn:4,
68                 acm:1,
69                 aci:2,
70                 reserved:1;
71
72         /* byte 2 */
73         u8      eCWmin:4,
74                 eCWmax:4;
75 #elif __BYTE_ORDER == __BIG_ENDIAN
76         /* byte 1 */
77         u8      reserved:1,
78                 aci:2,
79                 acm:1,
80                 aifsn:4;
81
82         /* byte 2 */
83         u8      eCWmax:4,
84                 eCWmin:4;
85 #else
86 #error  "Please fix <endian.h>"
87 #endif
88
89         /* bytes 3 & 4 */
90         le16 txopLimit;
91 } __attribute__ ((packed));
92
93 struct wme_parameter_element {
94         /* required fields for WME version 1 */
95         u8 oui[3];
96         u8 oui_type;
97         u8 oui_subtype;
98         u8 version;
99         u8 acInfo;
100         u8 reserved;
101         struct wme_ac_parameter ac[4];
102
103 } __attribute__ ((packed));
104
105 struct wme_tspec_info_element {
106         u8 eid;
107         u8 length;
108         u8 oui[3];
109         u8 oui_type;
110         u8 oui_subtype;
111         u8 version;
112         u16 ts_info;
113         u16 nominal_msdu_size;
114         u16 maximum_msdu_size;
115         u32 minimum_service_interval;
116         u32 maximum_service_interval;
117         u32 inactivity_interval;
118         u32 start_time;
119         u32 minimum_data_rate;
120         u32 mean_data_rate;
121         u32 maximum_burst_size;
122         u32 minimum_phy_rate;
123         u32 peak_data_rate;
124         u32 delay_bound;
125         u16 surplus_bandwidth_allowance;
126         u16 medium_time;
127 } __attribute__ ((packed));
128
129
130 /* Access Categories */
131 enum {
132         WME_AC_BK = 1,
133         WME_AC_BE = 0,
134         WME_AC_VI = 2,
135         WME_AC_VO = 3
136 };
137
138 struct ieee80211_mgmt;
139
140 u8 * hostapd_eid_wme(struct hostapd_data *hapd, u8 *eid);
141 int hostapd_eid_wme_valid(struct hostapd_data *hapd, u8 *eid, size_t len);
142 int hostapd_wme_sta_config(struct hostapd_data *hapd, struct sta_info *sta);
143 void hostapd_wme_action(struct hostapd_data *hapd, struct ieee80211_mgmt *mgmt,
144                         size_t len);
145
146 #endif /* WME_H */