source: mainline/uspace/lib/ieee80211/include/ieee80211_private.h@ a35b458

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since a35b458 was a35b458, checked in by Jiří Zárevúcky <zarevucky.jiri@…>, 7 years ago

style: Remove trailing whitespace on _all_ lines, including empty ones, for particular file types.

Command used: tools/srepl '\s\+$' '' -- *.c *.h *.py *.sh *.s *.S *.ag

Currently, whitespace on empty lines is very inconsistent.
There are two basic choices: Either remove the whitespace, or keep empty lines
indented to the level of surrounding code. The former is AFAICT more common,
and also much easier to do automatically.

Alternatively, we could write script for automatic indentation, and use that
instead. However, if such a script exists, it's possible to use the indented
style locally, by having the editor apply relevant conversions on load/save,
without affecting remote repository. IMO, it makes more sense to adopt
the simpler rule.

  • Property mode set to 100644
File size: 12.4 KB
Line 
1/*
2 * Copyright (c) 2015 Jan Kolarik
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - 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 * - 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 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29/**
30 * @addtogroup libieee80211
31 * @{
32 */
33
34/** @file ieee80211.h
35 *
36 * Internal IEEE 802.11 header that should not be included.
37 */
38
39#ifndef LIB_IEEE80211_PRIVATE_H
40#define LIB_IEEE80211_PRIVATE_H
41
42#include <fibril_synch.h>
43#include <byteorder.h>
44#include <ddf/driver.h>
45#include <stddef.h>
46#include <stdint.h>
47#include <ieee80211/ieee80211.h>
48#include "ieee80211.h"
49
50/** Timeout in us for waiting to authentication/association response. */
51#define AUTH_TIMEOUT 200000
52
53/** Timeout in us for waiting to finish 4-way handshake process. */
54#define HANDSHAKE_TIMEOUT 5000000
55
56/** Scanning period. */
57#define SCAN_PERIOD_USEC 35000000
58
59/** Time to wait for beacons on channel. */
60#define SCAN_CHANNEL_WAIT_USEC 200000
61
62/** Max time to keep scan result. */
63#define MAX_KEEP_SCAN_SPAN_SEC 120
64
65/** Security bit in capability info field. */
66#define CAP_SECURITY 0x10
67
68/** Protocol type used in EAPOL frames. */
69#define ETH_TYPE_PAE 0x888e
70
71/** WPA OUI used in vendor specific IE. */
72#define WPA_OUI 0x0050f201
73
74/** GTK OUI used in vendor specific IE. */
75#define GTK_OUI 0x000fac01
76
77/** Max PTK key length. */
78#define MAX_PTK_LENGTH 64
79
80/** Max GTK key length. */
81#define MAX_GTK_LENGTH 64
82
83/** KEK offset inside PTK. */
84#define KEK_OFFSET 16
85
86/** TK offset inside PTK. */
87#define TK_OFFSET 32
88
89/** Length of Michael MIC code used in TKIP security suite. */
90#define MIC_LENGTH 8
91
92/** Length of data to be encrypted by PRF function.
93 *
94 * NONCE + SNONCE (2 * 32) + DEST_MAC + SOURCE_MAC (2 * ETH_ADDR)
95 *
96 */
97#define PRF_CRYPT_DATA_LENGTH (2 * 32 + 2 * ETH_ADDR)
98
99/** Special room in header reserved for encryption. */
100typedef enum {
101 IEEE80211_TKIP_HEADER_LENGTH = 8,
102 IEEE80211_CCMP_HEADER_LENGTH = 8
103} ieee80211_encrypt_header_reserve_length_t;
104
105/** IEEE 802.11 PTK key length. */
106typedef enum {
107 IEEE80211_PTK_CCMP_LENGTH = 48,
108 IEEE80211_PTK_TKIP_LENGTH = 64
109} ieee80211_ptk_length_t;
110
111/** IEEE 802.11 GTK key length. */
112typedef enum {
113 IEEE80211_GTK_CCMP_LENGTH = 16,
114 IEEE80211_GTK_TKIP_LENGTH = 32
115} ieee80211_gtk_length_t;
116
117/** IEEE 802.11 frame types. */
118typedef enum {
119 IEEE80211_MGMT_FRAME = 0x0,
120 IEEE80211_CTRL_FRAME = 0x4,
121 IEEE80211_DATA_FRAME = 0x8,
122 IEEE80211_EXT_FRAME = 0xC
123} ieee80211_frame_type_t;
124
125/** IEEE 802.11 management frame subtypes. */
126typedef enum {
127 IEEE80211_MGMT_ASSOC_REQ_FRAME = 0x00,
128 IEEE80211_MGMT_ASSOC_RESP_FRAME = 0x10,
129 IEEE80211_MGMT_REASSOC_REQ_FRAME = 0x20,
130 IEEE80211_MGMT_REASSOC_RESP_FRAME = 0x30,
131 IEEE80211_MGMT_PROBE_REQ_FRAME = 0x40,
132 IEEE80211_MGMT_PROBE_RESP_FRAME = 0x50,
133 IEEE80211_MGMT_BEACON_FRAME = 0x80,
134 IEEE80211_MGMT_DISASSOC_FRAME = 0xA0,
135 IEEE80211_MGMT_AUTH_FRAME = 0xB0,
136 IEEE80211_MGMT_DEAUTH_FRAME = 0xC0,
137} ieee80211_frame_mgmt_subtype_t;
138
139/** IEEE 802.11 data frame subtypes. */
140typedef enum {
141 IEEE80211_DATA_DATA_FRAME = 0x0000,
142 IEEE80211_DATA_QOS_FRAME = 0x0080
143} ieee80211_frame_data_subtype_t;
144
145/** IEEE 802.11 frame control value masks. */
146typedef enum {
147 IEEE80211_FRAME_CTRL_FRAME_TYPE = 0x000C,
148 IEEE80211_FRAME_CTRL_FRAME_SUBTYPE = 0x00F0,
149 IEEE80211_FRAME_CTRL_PROTECTED = 0x4000
150} ieee80211_frame_ctrl_mask_t;
151
152/** IEEE 802.11 frame control DS field values. */
153typedef enum {
154 IEEE80211_FRAME_CTRL_TODS = 0x0100,
155 IEEE80211_FRAME_CTRL_FROMDS = 0x0200
156} ieee80211_frame_ctrl_ds_t;
157
158/** IEEE 802.11 authentication cipher suites values. */
159typedef enum {
160 IEEE80211_AUTH_CIPHER_TKIP = 0x02,
161 IEEE80211_AUTH_CIPHER_CCMP = 0x04
162} ieee80211_auth_cipher_type_t;
163
164/** IEEE 802.11 AKM suites values. */
165typedef enum {
166 IEEE80211_AUTH_AKM_8021X = 0x01,
167 IEEE80211_AUTH_AKM_PSK = 0x02
168} ieee80211_auth_akm_type_t;
169
170typedef enum {
171 IEEE80211_EAPOL_START = 0x1,
172 IEEE80211_EAPOL_KEY = 0x3
173} ieee80211_eapol_frame_type_t;
174
175typedef enum {
176 IEEE80211_EAPOL_KEY_KEYINFO_KEYTYPE = 0x0008,
177 IEEE80211_EAPOL_KEY_KEYINFO_KEYID = 0x0010,
178 IEEE80211_EAPOL_KEY_KEYINFO_INSTALL = 0x0040,
179 IEEE80211_EAPOL_KEY_KEYINFO_ACK = 0x0080,
180 IEEE80211_EAPOL_KEY_KEYINFO_MIC = 0x0100,
181 IEEE80211_EAPOL_KEY_KEYINFO_SECURE = 0x0200,
182 IEEE80211_EAPOL_KEY_KEYINFO_ENCDATA = 0x1000
183} ieee80211_eapol_key_keyinfo_t;
184
185/** IEEE 802.11 information element types. */
186typedef enum {
187 IEEE80211_SSID_IE = 0, /**< Target SSID. */
188 IEEE80211_RATES_IE = 1, /**< Supported data rates. */
189 IEEE80211_CHANNEL_IE = 3, /**< Current channel number. */
190 IEEE80211_CHALLENGE_IE = 16, /**< Challenge text. */
191 IEEE80211_RSN_IE = 48, /**< RSN. */
192 IEEE80211_EXT_RATES_IE = 50, /**< Extended data rates. */
193 IEEE80211_VENDOR_IE = 221 /**< Vendor specific IE. */
194} ieee80211_ie_type_t;
195
196/** IEEE 802.11 authentication phases. */
197typedef enum {
198 IEEE80211_AUTH_DISCONNECTED,
199 IEEE80211_AUTH_AUTHENTICATED,
200 IEEE80211_AUTH_ASSOCIATED,
201 IEEE80211_AUTH_CONNECTED
202} ieee80211_auth_phase_t;
203
204/** Link with scan result info. */
205typedef struct {
206 link_t link;
207 time_t last_beacon;
208 ieee80211_scan_result_t scan_result;
209 uint8_t auth_ie[256];
210 size_t auth_ie_len;
211} ieee80211_scan_result_link_t;
212
213/** List of scan results info. */
214typedef struct {
215 list_t list;
216 fibril_mutex_t results_mutex;
217 size_t size;
218} ieee80211_scan_result_list_t;
219
220/** BSSID info. */
221typedef struct {
222 uint16_t aid;
223 char password[IEEE80211_MAX_PASSW_LEN];
224 uint8_t ptk[MAX_PTK_LENGTH];
225 uint8_t gtk[MAX_GTK_LENGTH];
226 ieee80211_scan_result_link_t *res_link;
227} ieee80211_bssid_info_t;
228
229/** IEEE 802.11 WiFi device structure. */
230struct ieee80211_dev {
231 /** Backing DDF device. */
232 ddf_dev_t *ddf_dev;
233
234 /** Pointer to implemented IEEE 802.11 device operations. */
235 ieee80211_ops_t *ops;
236
237 /** Pointer to implemented IEEE 802.11 interface operations. */
238 ieee80211_iface_t *iface;
239
240 /** Pointer to driver specific data. */
241 void *specific;
242
243 /** Current operating frequency. */
244 uint16_t current_freq;
245
246 /** Current operating mode. */
247 ieee80211_operating_mode_t current_op_mode;
248
249 /** Info about BSSID we are connected to. */
250 ieee80211_bssid_info_t bssid_info;
251
252 /**
253 * Flag indicating that data traffic is encrypted by HW key
254 * that is set up in device.
255 */
256 bool using_hw_key;
257
258 /** BSSIDs we listen to. */
259 nic_address_t bssid_mask;
260
261 /** List of APs in neighborhood. */
262 ieee80211_scan_result_list_t ap_list;
263
264 /** Current sequence number used in data frames. */
265 uint16_t sequence_number;
266
267 /** Current authentication phase. */
268 ieee80211_auth_phase_t current_auth_phase;
269
270 /** Flag indicating whether client wants connect to network. */
271 bool pending_conn_req;
272
273 /** Scanning guard. */
274 fibril_mutex_t scan_mutex;
275
276 /** General purpose guard. */
277 fibril_mutex_t gen_mutex;
278
279 /** General purpose condition variable. */
280 fibril_condvar_t gen_cond;
281
282 /** Indicates whether device is fully initialized. */
283 bool ready;
284
285 /** Indicates whether driver has already started. */
286 bool started;
287};
288
289/** IEEE 802.3 (ethernet) header. */
290typedef struct {
291 uint8_t dest_addr[ETH_ADDR];
292 uint8_t src_addr[ETH_ADDR];
293 uint16_t proto; /**< Big Endian value! */
294} __attribute__((packed)) __attribute__((aligned(2)))
295 eth_header_t;
296
297/** IEEE 802.11 management header structure. */
298typedef struct {
299 uint16_t frame_ctrl; /**< Little Endian value! */
300 uint16_t duration_id; /**< Little Endian value! */
301 uint8_t dest_addr[ETH_ADDR];
302 uint8_t src_addr[ETH_ADDR];
303 uint8_t bssid[ETH_ADDR];
304 uint16_t seq_ctrl; /**< Little Endian value! */
305} __attribute__((packed)) __attribute__((aligned(2)))
306 ieee80211_mgmt_header_t;
307
308/** IEEE 802.11 data header structure. */
309typedef struct {
310 uint16_t frame_ctrl; /**< Little Endian value! */
311 uint16_t duration_id; /**< Little Endian value! */
312 uint8_t address1[ETH_ADDR];
313 uint8_t address2[ETH_ADDR];
314 uint8_t address3[ETH_ADDR];
315 uint16_t seq_ctrl; /**< Little Endian value! */
316} __attribute__((packed)) __attribute__((aligned(2)))
317 ieee80211_data_header_t;
318
319/** IEEE 802.11 information element header. */
320typedef struct {
321 uint8_t element_id;
322 uint8_t length;
323} __attribute__((packed)) __attribute__((aligned(2)))
324 ieee80211_ie_header_t;
325
326/** IEEE 802.11 authentication frame body. */
327typedef struct {
328 uint16_t auth_alg; /**< Little Endian value! */
329 uint16_t auth_trans_no; /**< Little Endian value! */
330 uint16_t status; /**< Little Endian value! */
331} __attribute__((packed)) __attribute__((aligned(2)))
332 ieee80211_auth_body_t;
333
334/** IEEE 802.11 deauthentication frame body. */
335typedef struct {
336 uint16_t reason; /**< Little Endian value! */
337} __attribute__((packed)) __attribute__((aligned(2)))
338 ieee80211_deauth_body_t;
339
340/** IEEE 802.11 association request frame body. */
341typedef struct {
342 uint16_t capability; /**< Little Endian value! */
343 uint16_t listen_interval; /**< Little Endian value! */
344} __attribute__((packed)) __attribute__((aligned(2)))
345 ieee80211_assoc_req_body_t;
346
347/** IEEE 802.11 association response frame body. */
348typedef struct {
349 uint16_t capability; /**< Little Endian value! */
350 uint16_t status; /**< Little Endian value! */
351 uint16_t aid; /**< Little Endian value! */
352} __attribute__((packed)) __attribute__((aligned(2)))
353 ieee80211_assoc_resp_body_t;
354
355/** IEEE 802.11 beacon frame body start. */
356typedef struct {
357 uint8_t timestamp[8];
358 uint16_t beacon_interval; /**< Little Endian value! */
359 uint16_t capability; /**< Little Endian value! */
360} __attribute__((packed)) __attribute__((aligned(2)))
361 ieee80211_beacon_start_t;
362
363/** IEEE 802.11i EAPOL-Key frame format. */
364typedef struct {
365 uint8_t proto_version;
366 uint8_t packet_type;
367 uint16_t body_length; /**< Big Endian value! */
368 uint8_t descriptor_type;
369 uint16_t key_info; /**< Big Endian value! */
370 uint16_t key_length; /**< Big Endian value! */
371 uint8_t key_replay_counter[8];
372 uint8_t key_nonce[32];
373 uint8_t eapol_key_iv[16];
374 uint8_t key_rsc[8];
375 uint8_t reserved[8];
376 uint8_t key_mic[16];
377 uint16_t key_data_length; /**< Big Endian value! */
378} __attribute__((packed)) ieee80211_eapol_key_frame_t;
379
380#define ieee80211_scan_result_list_foreach(results, iter) \
381 list_foreach((results).list, link, ieee80211_scan_result_link_t, (iter))
382
383static inline void
384 ieee80211_scan_result_list_init(ieee80211_scan_result_list_t *results)
385{
386 list_initialize(&results->list);
387 fibril_mutex_initialize(&results->results_mutex);
388}
389
390static inline void
391 ieee80211_scan_result_list_remove(ieee80211_scan_result_list_t *results,
392 ieee80211_scan_result_link_t *result)
393{
394 list_remove(&result->link);
395 results->size--;
396}
397
398static inline void
399 ieee80211_scan_result_list_append(ieee80211_scan_result_list_t *results,
400 ieee80211_scan_result_link_t *result)
401{
402 list_append(&result->link, &results->list);
403 results->size++;
404}
405
406extern bool ieee80211_is_fromds_frame(uint16_t);
407extern bool ieee80211_is_tods_frame(uint16_t);
408extern void ieee80211_set_connect_request(ieee80211_dev_t *);
409extern bool ieee80211_pending_connect_request(ieee80211_dev_t *);
410extern ieee80211_auth_phase_t ieee80211_get_auth_phase(ieee80211_dev_t *);
411extern void ieee80211_set_auth_phase(ieee80211_dev_t *, ieee80211_auth_phase_t);
412extern errno_t ieee80211_probe_request(ieee80211_dev_t *, char *);
413extern errno_t ieee80211_authenticate(ieee80211_dev_t *);
414extern errno_t ieee80211_associate(ieee80211_dev_t *, char *);
415extern errno_t ieee80211_deauthenticate(ieee80211_dev_t *);
416
417#endif
418
419/** @}
420 */
Note: See TracBrowser for help on using the repository browser.