Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
net
wireless
core.h
Go to the documentation of this file.
1
/*
2
* Wireless configuration interface internals.
3
*
4
* Copyright 2006-2010 Johannes Berg <
[email protected]
>
5
*/
6
#ifndef __NET_WIRELESS_CORE_H
7
#define __NET_WIRELESS_CORE_H
8
#include <
linux/mutex.h
>
9
#include <linux/list.h>
10
#include <linux/netdevice.h>
11
#include <
linux/kref.h
>
12
#include <linux/rbtree.h>
13
#include <
linux/debugfs.h
>
14
#include <linux/rfkill.h>
15
#include <
linux/workqueue.h
>
16
#include <linux/rtnetlink.h>
17
#include <
net/genetlink.h
>
18
#include <
net/cfg80211.h
>
19
#include "
reg.h
"
20
21
struct
cfg80211_registered_device
{
22
const
struct
cfg80211_ops
*
ops
;
23
struct
list_head
list
;
24
/* we hold this mutex during any call so that
25
* we cannot do multiple calls at once, and also
26
* to avoid the deregister call to proceed while
27
* any call is in progress */
28
struct
mutex
mtx
;
29
30
/* rfkill support */
31
struct
rfkill_ops
rfkill_ops
;
32
struct
rfkill
*
rfkill
;
33
struct
work_struct
rfkill_sync
;
34
35
/* ISO / IEC 3166 alpha2 for which this device is receiving
36
* country IEs on, this can help disregard country IEs from APs
37
* on the same alpha2 quickly. The alpha2 may differ from
38
* cfg80211_regdomain's alpha2 when an intersection has occurred.
39
* If the AP is reconfigured this can also be used to tell us if
40
* the country on the country IE changed. */
41
char
country_ie_alpha2
[2];
42
43
/* If a Country IE has been received this tells us the environment
44
* which its telling us its in. This defaults to ENVIRON_ANY */
45
enum
environment_cap
env
;
46
47
/* wiphy index, internal only */
48
int
wiphy_idx
;
49
50
/* associated wireless interfaces */
51
struct
mutex
devlist_mtx
;
52
/* protected by devlist_mtx or RCU */
53
struct
list_head
wdev_list
;
54
int
devlist_generation
,
wdev_id
;
55
int
opencount
;
/* also protected by devlist_mtx */
56
wait_queue_head_t
dev_wait
;
57
58
u32
ap_beacons_nlportid
;
59
60
/* protected by RTNL only */
61
int
num_running_ifaces
;
62
int
num_running_monitor_ifaces
;
63
64
/* BSSes/scanning */
65
spinlock_t
bss_lock
;
66
struct
list_head
bss_list
;
67
struct
rb_root
bss_tree
;
68
u32
bss_generation
;
69
struct
cfg80211_scan_request
*
scan_req
;
/* protected by RTNL */
70
struct
cfg80211_sched_scan_request
*
sched_scan_req
;
71
unsigned
long
suspend_at
;
72
struct
work_struct
scan_done_wk
;
73
struct
work_struct
sched_scan_results_wk
;
74
75
struct
mutex
sched_scan_mtx
;
76
77
#ifdef CONFIG_NL80211_TESTMODE
78
struct
genl_info
*testmode_info;
79
#endif
80
81
struct
work_struct
conn_work
;
82
struct
work_struct
event_work
;
83
84
struct
cfg80211_wowlan
*
wowlan
;
85
86
/* must be last because of the way we do wiphy_priv(),
87
* and it should at least be aligned to NETDEV_ALIGN */
88
struct
wiphy
wiphy
__attribute__
((__aligned__(
NETDEV_ALIGN
)));
89
};
90
91
static
inline
92
struct
cfg80211_registered_device
*wiphy_to_dev(
struct
wiphy
*
wiphy
)
93
{
94
BUG_ON
(!wiphy);
95
return
container_of
(wiphy,
struct
cfg80211_registered_device
, wiphy);
96
}
97
98
/* Note 0 is valid, hence phy0 */
99
static
inline
100
bool
wiphy_idx_valid(
int
wiphy_idx
)
101
{
102
return
wiphy_idx >= 0;
103
}
104
105
static
inline
void
106
cfg80211_rdev_free_wowlan(
struct
cfg80211_registered_device
*
rdev
)
107
{
108
int
i
;
109
110
if
(!rdev->
wowlan
)
111
return
;
112
for
(i = 0; i < rdev->
wowlan
->n_patterns; i++)
113
kfree
(rdev->
wowlan
->patterns[i].mask);
114
kfree
(rdev->
wowlan
->patterns);
115
kfree
(rdev->
wowlan
);
116
}
117
118
extern
struct
workqueue_struct
*
cfg80211_wq
;
119
extern
struct
mutex
cfg80211_mutex
;
120
extern
struct
list_head
cfg80211_rdev_list
;
121
extern
int
cfg80211_rdev_list_generation
;
122
123
static
inline
void
assert_cfg80211_lock(
void
)
124
{
125
lockdep_assert_held
(&cfg80211_mutex);
126
}
127
128
/*
129
* You can use this to mark a wiphy_idx as not having an associated wiphy.
130
* It guarantees cfg80211_rdev_by_wiphy_idx(wiphy_idx) will return NULL
131
*/
132
#define WIPHY_IDX_STALE -1
133
134
struct
cfg80211_internal_bss
{
135
struct
list_head
list
;
136
struct
rb_node
rbn
;
137
unsigned
long
ts
;
138
struct
kref
ref
;
139
atomic_t
hold
;
140
bool
beacon_ies_allocated
;
141
bool
proberesp_ies_allocated
;
142
143
/* must be last because of priv member */
144
struct
cfg80211_bss
pub
;
145
};
146
147
static
inline
struct
cfg80211_internal_bss
*bss_from_pub(
struct
cfg80211_bss
*
pub
)
148
{
149
return
container_of
(pub,
struct
cfg80211_internal_bss
, pub);
150
}
151
152
static
inline
void
cfg80211_hold_bss(
struct
cfg80211_internal_bss
*bss)
153
{
154
atomic_inc
(&bss->
hold
);
155
}
156
157
static
inline
void
cfg80211_unhold_bss(
struct
cfg80211_internal_bss
*bss)
158
{
159
int
r
=
atomic_dec_return
(&bss->
hold
);
160
WARN_ON
(r < 0);
161
}
162
163
164
struct
cfg80211_registered_device
*
cfg80211_rdev_by_wiphy_idx
(
int
wiphy_idx
);
165
int
get_wiphy_idx
(
struct
wiphy
*
wiphy
);
166
167
/* requires cfg80211_rdev_mutex to be held! */
168
struct
wiphy
*
wiphy_idx_to_wiphy
(
int
wiphy_idx);
169
170
/* identical to cfg80211_get_dev_from_info but only operate on ifindex */
171
extern
struct
cfg80211_registered_device
*
172
cfg80211_get_dev_from_ifindex
(
struct
net
*
net
,
int
ifindex);
173
174
int
cfg80211_switch_netns
(
struct
cfg80211_registered_device
*rdev,
175
struct
net
*
net
);
176
177
static
inline
void
cfg80211_lock_rdev(
struct
cfg80211_registered_device
*rdev)
178
{
179
mutex_lock
(&rdev->
mtx
);
180
}
181
182
static
inline
void
cfg80211_unlock_rdev(
struct
cfg80211_registered_device
*rdev)
183
{
184
BUG_ON
(IS_ERR(rdev) || !rdev);
185
mutex_unlock
(&rdev->
mtx
);
186
}
187
188
static
inline
void
wdev_lock(
struct
wireless_dev
*wdev)
189
__acquires
(wdev)
190
{
191
mutex_lock
(&wdev->mtx);
192
__acquire
(wdev->mtx);
193
}
194
195
static
inline
void
wdev_unlock(
struct
wireless_dev
*wdev)
196
__releases
(wdev)
197
{
198
__release
(wdev->mtx);
199
mutex_unlock
(&wdev->mtx);
200
}
201
202
#define ASSERT_RDEV_LOCK(rdev) lockdep_assert_held(&(rdev)->mtx)
203
#define ASSERT_WDEV_LOCK(wdev) lockdep_assert_held(&(wdev)->mtx)
204
205
static
inline
bool
cfg80211_has_monitors_only(
struct
cfg80211_registered_device
*rdev)
206
{
207
ASSERT_RTNL
();
208
209
return
rdev->
num_running_ifaces
== rdev->
num_running_monitor_ifaces
&&
210
rdev->
num_running_ifaces
> 0;
211
}
212
213
enum
cfg80211_event_type
{
214
EVENT_CONNECT_RESULT
,
215
EVENT_ROAMED
,
216
EVENT_DISCONNECTED
,
217
EVENT_IBSS_JOINED
,
218
};
219
220
struct
cfg80211_event
{
221
struct
list_head
list
;
222
enum
cfg80211_event_type
type
;
223
224
union
{
225
struct
{
226
u8
bssid
[
ETH_ALEN
];
227
const
u8
*
req_ie
;
228
const
u8
*
resp_ie
;
229
size_t
req_ie_len
;
230
size_t
resp_ie_len
;
231
u16
status
;
232
}
cr
;
233
struct
{
234
const
u8
*
req_ie
;
235
const
u8
*
resp_ie
;
236
size_t
req_ie_len
;
237
size_t
resp_ie_len
;
238
struct
cfg80211_bss
*
bss
;
239
}
rm
;
240
struct
{
241
const
u8
*
ie
;
242
size_t
ie_len
;
243
u16
reason
;
244
}
dc
;
245
struct
{
246
u8
bssid
[
ETH_ALEN
];
247
}
ij
;
248
};
249
};
250
251
struct
cfg80211_cached_keys
{
252
struct
key_params
params
[6];
253
u8
data
[6][
WLAN_MAX_KEY_LEN
];
254
int
def
,
defmgmt
;
255
};
256
257
enum
cfg80211_chan_mode
{
258
CHAN_MODE_UNDEFINED
,
259
CHAN_MODE_SHARED
,
260
CHAN_MODE_EXCLUSIVE
,
261
};
262
263
264
/* free object */
265
extern
void
cfg80211_dev_free
(
struct
cfg80211_registered_device
*rdev);
266
267
extern
int
cfg80211_dev_rename
(
struct
cfg80211_registered_device
*rdev,
268
char
*newname);
269
270
void
ieee80211_set_bitrate_flags
(
struct
wiphy
*
wiphy
);
271
272
void
cfg80211_bss_expire
(
struct
cfg80211_registered_device
*
dev
);
273
void
cfg80211_bss_age
(
struct
cfg80211_registered_device
*
dev
,
274
unsigned
long
age_secs);
275
276
/* IBSS */
277
int
__cfg80211_join_ibss
(
struct
cfg80211_registered_device
*rdev,
278
struct
net_device
*
dev
,
279
struct
cfg80211_ibss_params
*
params
,
280
struct
cfg80211_cached_keys
*connkeys);
281
int
cfg80211_join_ibss
(
struct
cfg80211_registered_device
*rdev,
282
struct
net_device
*
dev
,
283
struct
cfg80211_ibss_params
*
params
,
284
struct
cfg80211_cached_keys
*connkeys);
285
void
cfg80211_clear_ibss
(
struct
net_device
*
dev
,
bool
nowext);
286
int
__cfg80211_leave_ibss
(
struct
cfg80211_registered_device
*rdev,
287
struct
net_device
*
dev
,
bool
nowext);
288
int
cfg80211_leave_ibss
(
struct
cfg80211_registered_device
*rdev,
289
struct
net_device
*
dev
,
bool
nowext);
290
void
__cfg80211_ibss_joined
(
struct
net_device
*
dev
,
const
u8
*
bssid
);
291
int
cfg80211_ibss_wext_join
(
struct
cfg80211_registered_device
*rdev,
292
struct
wireless_dev
*wdev);
293
294
/* mesh */
295
extern
const
struct
mesh_config
default_mesh_config
;
296
extern
const
struct
mesh_setup
default_mesh_setup
;
297
int
__cfg80211_join_mesh
(
struct
cfg80211_registered_device
*rdev,
298
struct
net_device
*
dev
,
299
struct
mesh_setup
*
setup
,
300
const
struct
mesh_config
*conf);
301
int
cfg80211_join_mesh
(
struct
cfg80211_registered_device
*rdev,
302
struct
net_device
*
dev
,
303
struct
mesh_setup
*
setup
,
304
const
struct
mesh_config
*conf);
305
int
cfg80211_leave_mesh
(
struct
cfg80211_registered_device
*rdev,
306
struct
net_device
*
dev
);
307
int
cfg80211_set_mesh_freq
(
struct
cfg80211_registered_device
*rdev,
308
struct
wireless_dev
*wdev,
int
freq
,
309
enum
nl80211_channel_type
channel_type
);
310
311
/* AP */
312
int
cfg80211_stop_ap
(
struct
cfg80211_registered_device
*rdev,
313
struct
net_device
*
dev
);
314
315
/* MLME */
316
int
__cfg80211_mlme_auth
(
struct
cfg80211_registered_device
*rdev,
317
struct
net_device
*
dev
,
318
struct
ieee80211_channel
*
chan
,
319
enum
nl80211_auth_type
auth_type,
320
const
u8
*
bssid
,
321
const
u8
*
ssid
,
int
ssid_len,
322
const
u8
*
ie
,
int
ie_len
,
323
const
u8
*
key
,
int
key_len
,
int
key_idx);
324
int
cfg80211_mlme_auth
(
struct
cfg80211_registered_device
*rdev,
325
struct
net_device
*
dev
,
struct
ieee80211_channel
*
chan
,
326
enum
nl80211_auth_type
auth_type,
const
u8
*
bssid
,
327
const
u8
*
ssid
,
int
ssid_len,
328
const
u8
*
ie
,
int
ie_len
,
329
const
u8
*
key
,
int
key_len
,
int
key_idx);
330
int
__cfg80211_mlme_assoc
(
struct
cfg80211_registered_device
*rdev,
331
struct
net_device
*
dev
,
332
struct
ieee80211_channel
*
chan
,
333
const
u8
*
bssid
,
const
u8
*prev_bssid,
334
const
u8
*
ssid
,
int
ssid_len,
335
const
u8
*
ie
,
int
ie_len
,
bool
use_mfp,
336
struct
cfg80211_crypto_settings
*crypt,
337
u32
assoc_flags,
struct
ieee80211_ht_cap
*ht_capa,
338
struct
ieee80211_ht_cap
*ht_capa_mask);
339
int
cfg80211_mlme_assoc
(
struct
cfg80211_registered_device
*rdev,
340
struct
net_device
*
dev
,
struct
ieee80211_channel
*
chan
,
341
const
u8
*
bssid
,
const
u8
*prev_bssid,
342
const
u8
*
ssid
,
int
ssid_len,
343
const
u8
*
ie
,
int
ie_len
,
bool
use_mfp,
344
struct
cfg80211_crypto_settings
*crypt,
345
u32
assoc_flags,
struct
ieee80211_ht_cap
*ht_capa,
346
struct
ieee80211_ht_cap
*ht_capa_mask);
347
int
__cfg80211_mlme_deauth
(
struct
cfg80211_registered_device
*rdev,
348
struct
net_device
*
dev
,
const
u8
*
bssid
,
349
const
u8
*
ie
,
int
ie_len
,
u16
reason
,
350
bool
local_state_change);
351
int
cfg80211_mlme_deauth
(
struct
cfg80211_registered_device
*rdev,
352
struct
net_device
*
dev
,
const
u8
*
bssid
,
353
const
u8
*
ie
,
int
ie_len
,
u16
reason
,
354
bool
local_state_change);
355
int
cfg80211_mlme_disassoc
(
struct
cfg80211_registered_device
*rdev,
356
struct
net_device
*
dev
,
const
u8
*
bssid
,
357
const
u8
*
ie
,
int
ie_len
,
u16
reason
,
358
bool
local_state_change);
359
void
cfg80211_mlme_down
(
struct
cfg80211_registered_device
*rdev,
360
struct
net_device
*
dev
);
361
void
__cfg80211_connect_result
(
struct
net_device
*
dev
,
const
u8
*
bssid
,
362
const
u8
*req_ie,
size_t
req_ie_len,
363
const
u8
*resp_ie,
size_t
resp_ie_len,
364
u16
status
,
bool
wextev,
365
struct
cfg80211_bss
*bss);
366
int
cfg80211_mlme_register_mgmt
(
struct
wireless_dev
*wdev,
u32
snd_pid,
367
u16
frame_type
,
const
u8
*match_data,
368
int
match_len);
369
void
cfg80211_mlme_unregister_socket
(
struct
wireless_dev
*wdev,
u32
nlpid);
370
void
cfg80211_mlme_purge_registrations
(
struct
wireless_dev
*wdev);
371
int
cfg80211_mlme_mgmt_tx
(
struct
cfg80211_registered_device
*rdev,
372
struct
wireless_dev
*wdev,
373
struct
ieee80211_channel
*
chan
,
bool
offchan,
374
enum
nl80211_channel_type
channel_type
,
375
bool
channel_type_valid,
unsigned
int
wait
,
376
const
u8
*
buf
,
size_t
len,
bool
no_cck,
377
bool
dont_wait_for_ack,
u64
*
cookie
);
378
void
cfg80211_oper_and_ht_capa
(
struct
ieee80211_ht_cap
*ht_capa,
379
const
struct
ieee80211_ht_cap
*ht_capa_mask);
380
381
/* SME */
382
int
__cfg80211_connect
(
struct
cfg80211_registered_device
*rdev,
383
struct
net_device
*
dev
,
384
struct
cfg80211_connect_params
*connect,
385
struct
cfg80211_cached_keys
*connkeys,
386
const
u8
*prev_bssid);
387
int
cfg80211_connect
(
struct
cfg80211_registered_device
*rdev,
388
struct
net_device
*
dev
,
389
struct
cfg80211_connect_params
*connect,
390
struct
cfg80211_cached_keys
*connkeys);
391
int
__cfg80211_disconnect
(
struct
cfg80211_registered_device
*rdev,
392
struct
net_device
*
dev
,
u16
reason
,
393
bool
wextev);
394
int
cfg80211_disconnect
(
struct
cfg80211_registered_device
*rdev,
395
struct
net_device
*
dev
,
u16
reason
,
396
bool
wextev);
397
void
__cfg80211_roamed
(
struct
wireless_dev
*wdev,
398
struct
cfg80211_bss
*bss,
399
const
u8
*req_ie,
size_t
req_ie_len,
400
const
u8
*resp_ie,
size_t
resp_ie_len);
401
int
cfg80211_mgd_wext_connect
(
struct
cfg80211_registered_device
*rdev,
402
struct
wireless_dev
*wdev);
403
404
void
cfg80211_conn_work
(
struct
work_struct
*
work
);
405
void
cfg80211_sme_failed_assoc
(
struct
wireless_dev
*wdev);
406
bool
cfg80211_sme_failed_reassoc
(
struct
wireless_dev
*wdev);
407
408
/* internal helpers */
409
bool
cfg80211_supported_cipher_suite
(
struct
wiphy
*
wiphy
,
u32
cipher
);
410
int
cfg80211_validate_key_settings
(
struct
cfg80211_registered_device
*rdev,
411
struct
key_params
*
params
,
int
key_idx,
412
bool
pairwise,
const
u8
*
mac_addr
);
413
void
__cfg80211_disconnected
(
struct
net_device
*
dev
,
const
u8
*
ie
,
414
size_t
ie_len
,
u16
reason
,
bool
from_ap);
415
void
cfg80211_sme_scan_done
(
struct
net_device
*
dev
);
416
void
cfg80211_sme_rx_auth
(
struct
net_device
*
dev
,
const
u8
*
buf
,
size_t
len);
417
void
cfg80211_sme_disassoc
(
struct
net_device
*
dev
,
418
struct
cfg80211_internal_bss
*bss);
419
void
__cfg80211_scan_done
(
struct
work_struct
*wk);
420
void
___cfg80211_scan_done
(
struct
cfg80211_registered_device
*rdev,
bool
leak);
421
void
__cfg80211_sched_scan_results
(
struct
work_struct
*wk);
422
int
__cfg80211_stop_sched_scan
(
struct
cfg80211_registered_device
*rdev,
423
bool
driver_initiated);
424
void
cfg80211_upload_connect_keys
(
struct
wireless_dev
*wdev);
425
int
cfg80211_change_iface
(
struct
cfg80211_registered_device
*rdev,
426
struct
net_device
*
dev
,
enum
nl80211_iftype
ntype,
427
u32
*
flags
,
struct
vif_params
*
params
);
428
void
cfg80211_process_rdev_events
(
struct
cfg80211_registered_device
*rdev);
429
void
cfg80211_process_wdev_events
(
struct
wireless_dev
*wdev);
430
431
int
cfg80211_can_use_iftype_chan
(
struct
cfg80211_registered_device
*rdev,
432
struct
wireless_dev
*wdev,
433
enum
nl80211_iftype
iftype
,
434
struct
ieee80211_channel
*
chan
,
435
enum
cfg80211_chan_mode
chanmode);
436
437
static
inline
int
438
cfg80211_can_change_interface(
struct
cfg80211_registered_device
*rdev,
439
struct
wireless_dev
*wdev,
440
enum
nl80211_iftype
iftype
)
441
{
442
return
cfg80211_can_use_iftype_chan
(rdev, wdev, iftype,
NULL
,
443
CHAN_MODE_UNDEFINED
);
444
}
445
446
static
inline
int
447
cfg80211_can_add_interface(
struct
cfg80211_registered_device
*rdev,
448
enum
nl80211_iftype
iftype
)
449
{
450
return
cfg80211_can_change_interface(rdev,
NULL
, iftype);
451
}
452
453
static
inline
int
454
cfg80211_can_use_chan(
struct
cfg80211_registered_device
*rdev,
455
struct
wireless_dev
*wdev,
456
struct
ieee80211_channel
*
chan
,
457
enum
cfg80211_chan_mode
chanmode)
458
{
459
return
cfg80211_can_use_iftype_chan
(rdev, wdev, wdev->
iftype
,
460
chan, chanmode);
461
}
462
463
void
464
cfg80211_get_chan_state
(
struct
wireless_dev
*wdev,
465
struct
ieee80211_channel
**
chan
,
466
enum
cfg80211_chan_mode
*chanmode);
467
468
struct
ieee80211_channel
*
469
rdev_freq_to_chan
(
struct
cfg80211_registered_device
*rdev,
470
int
freq
,
enum
nl80211_channel_type
channel_type
);
471
int
cfg80211_set_monitor_channel
(
struct
cfg80211_registered_device
*rdev,
472
int
freq
,
enum
nl80211_channel_type
chantype);
473
474
int
ieee80211_get_ratemask
(
struct
ieee80211_supported_band
*sband,
475
const
u8
*rates,
unsigned
int
n_rates,
476
u32
*
mask
);
477
478
int
cfg80211_validate_beacon_int
(
struct
cfg80211_registered_device
*rdev,
479
u32
beacon_int
);
480
481
void
cfg80211_update_iface_num
(
struct
cfg80211_registered_device
*rdev,
482
enum
nl80211_iftype
iftype
,
int
num);
483
484
#define CFG80211_MAX_NUM_DIFFERENT_CHANNELS 10
485
486
#ifdef CONFIG_CFG80211_DEVELOPER_WARNINGS
487
#define CFG80211_DEV_WARN_ON(cond) WARN_ON(cond)
488
#else
489
/*
490
* Trick to enable using it as a condition,
491
* and also not give a warning when it's
492
* not used that way.
493
*/
494
#define CFG80211_DEV_WARN_ON(cond) ({bool __r = (cond); __r; })
495
#endif
496
497
#endif
/* __NET_WIRELESS_CORE_H */
Generated on Thu Jan 10 2013 12:58:13 for Linux Kernel by
1.8.2