diff options
Diffstat (limited to 'net/mac80211/ieee80211_i.h')
-rw-r--r-- | net/mac80211/ieee80211_i.h | 393 |
1 files changed, 226 insertions, 167 deletions
diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h index 4498d8713652..8025b294588b 100644 --- a/net/mac80211/ieee80211_i.h +++ b/net/mac80211/ieee80211_i.h | |||
@@ -29,17 +29,6 @@ | |||
29 | #include "key.h" | 29 | #include "key.h" |
30 | #include "sta_info.h" | 30 | #include "sta_info.h" |
31 | 31 | ||
32 | /* ieee80211.o internal definitions, etc. These are not included into | ||
33 | * low-level drivers. */ | ||
34 | |||
35 | #ifndef ETH_P_PAE | ||
36 | #define ETH_P_PAE 0x888E /* Port Access Entity (IEEE 802.1X) */ | ||
37 | #endif /* ETH_P_PAE */ | ||
38 | |||
39 | #define WLAN_FC_DATA_PRESENT(fc) (((fc) & 0x4c) == 0x08) | ||
40 | |||
41 | #define IEEE80211_FC(type, subtype) cpu_to_le16(type | subtype) | ||
42 | |||
43 | struct ieee80211_local; | 32 | struct ieee80211_local; |
44 | 33 | ||
45 | /* Maximum number of broadcast/multicast frames to buffer when some of the | 34 | /* Maximum number of broadcast/multicast frames to buffer when some of the |
@@ -61,6 +50,12 @@ struct ieee80211_local; | |||
61 | * increased memory use (about 2 kB of RAM per entry). */ | 50 | * increased memory use (about 2 kB of RAM per entry). */ |
62 | #define IEEE80211_FRAGMENT_MAX 4 | 51 | #define IEEE80211_FRAGMENT_MAX 4 |
63 | 52 | ||
53 | /* | ||
54 | * Time after which we ignore scan results and no longer report/use | ||
55 | * them in any way. | ||
56 | */ | ||
57 | #define IEEE80211_SCAN_RESULT_EXPIRE (10 * HZ) | ||
58 | |||
64 | struct ieee80211_fragment_entry { | 59 | struct ieee80211_fragment_entry { |
65 | unsigned long first_frag_time; | 60 | unsigned long first_frag_time; |
66 | unsigned int seq; | 61 | unsigned int seq; |
@@ -73,9 +68,9 @@ struct ieee80211_fragment_entry { | |||
73 | }; | 68 | }; |
74 | 69 | ||
75 | 70 | ||
76 | struct ieee80211_sta_bss { | 71 | struct ieee80211_bss { |
77 | struct list_head list; | 72 | struct list_head list; |
78 | struct ieee80211_sta_bss *hnext; | 73 | struct ieee80211_bss *hnext; |
79 | size_t ssid_len; | 74 | size_t ssid_len; |
80 | 75 | ||
81 | atomic_t users; | 76 | atomic_t users; |
@@ -87,16 +82,11 @@ struct ieee80211_sta_bss { | |||
87 | enum ieee80211_band band; | 82 | enum ieee80211_band band; |
88 | int freq; | 83 | int freq; |
89 | int signal, noise, qual; | 84 | int signal, noise, qual; |
90 | u8 *wpa_ie; | 85 | u8 *ies; /* all information elements from the last Beacon or Probe |
91 | size_t wpa_ie_len; | 86 | * Response frames; note Beacon frame is not allowed to |
92 | u8 *rsn_ie; | 87 | * override values from Probe Response */ |
93 | size_t rsn_ie_len; | 88 | size_t ies_len; |
94 | u8 *wmm_ie; | 89 | bool wmm_used; |
95 | size_t wmm_ie_len; | ||
96 | u8 *ht_ie; | ||
97 | size_t ht_ie_len; | ||
98 | u8 *ht_add_ie; | ||
99 | size_t ht_add_ie_len; | ||
100 | #ifdef CONFIG_MAC80211_MESH | 90 | #ifdef CONFIG_MAC80211_MESH |
101 | u8 *mesh_id; | 91 | u8 *mesh_id; |
102 | size_t mesh_id_len; | 92 | size_t mesh_id_len; |
@@ -108,7 +98,7 @@ struct ieee80211_sta_bss { | |||
108 | u64 timestamp; | 98 | u64 timestamp; |
109 | int beacon_int; | 99 | int beacon_int; |
110 | 100 | ||
111 | bool probe_resp; | 101 | unsigned long last_probe_resp; |
112 | unsigned long last_update; | 102 | unsigned long last_update; |
113 | 103 | ||
114 | /* during assocation, we save an ERP value from a probe response so | 104 | /* during assocation, we save an ERP value from a probe response so |
@@ -119,7 +109,7 @@ struct ieee80211_sta_bss { | |||
119 | u8 erp_value; | 109 | u8 erp_value; |
120 | }; | 110 | }; |
121 | 111 | ||
122 | static inline u8 *bss_mesh_cfg(struct ieee80211_sta_bss *bss) | 112 | static inline u8 *bss_mesh_cfg(struct ieee80211_bss *bss) |
123 | { | 113 | { |
124 | #ifdef CONFIG_MAC80211_MESH | 114 | #ifdef CONFIG_MAC80211_MESH |
125 | return bss->mesh_cfg; | 115 | return bss->mesh_cfg; |
@@ -127,7 +117,7 @@ static inline u8 *bss_mesh_cfg(struct ieee80211_sta_bss *bss) | |||
127 | return NULL; | 117 | return NULL; |
128 | } | 118 | } |
129 | 119 | ||
130 | static inline u8 *bss_mesh_id(struct ieee80211_sta_bss *bss) | 120 | static inline u8 *bss_mesh_id(struct ieee80211_bss *bss) |
131 | { | 121 | { |
132 | #ifdef CONFIG_MAC80211_MESH | 122 | #ifdef CONFIG_MAC80211_MESH |
133 | return bss->mesh_id; | 123 | return bss->mesh_id; |
@@ -135,7 +125,7 @@ static inline u8 *bss_mesh_id(struct ieee80211_sta_bss *bss) | |||
135 | return NULL; | 125 | return NULL; |
136 | } | 126 | } |
137 | 127 | ||
138 | static inline u8 bss_mesh_id_len(struct ieee80211_sta_bss *bss) | 128 | static inline u8 bss_mesh_id_len(struct ieee80211_bss *bss) |
139 | { | 129 | { |
140 | #ifdef CONFIG_MAC80211_MESH | 130 | #ifdef CONFIG_MAC80211_MESH |
141 | return bss->mesh_id_len; | 131 | return bss->mesh_id_len; |
@@ -174,7 +164,7 @@ struct ieee80211_tx_data { | |||
174 | struct sk_buff **extra_frag; | 164 | struct sk_buff **extra_frag; |
175 | int num_extra_frag; | 165 | int num_extra_frag; |
176 | 166 | ||
177 | u16 fc, ethertype; | 167 | u16 ethertype; |
178 | unsigned int flags; | 168 | unsigned int flags; |
179 | }; | 169 | }; |
180 | 170 | ||
@@ -202,7 +192,7 @@ struct ieee80211_rx_data { | |||
202 | struct ieee80211_rx_status *status; | 192 | struct ieee80211_rx_status *status; |
203 | struct ieee80211_rate *rate; | 193 | struct ieee80211_rate *rate; |
204 | 194 | ||
205 | u16 fc, ethertype; | 195 | u16 ethertype; |
206 | unsigned int flags; | 196 | unsigned int flags; |
207 | int sent_ps_buffered; | 197 | int sent_ps_buffered; |
208 | int queue; | 198 | int queue; |
@@ -239,7 +229,6 @@ struct ieee80211_if_ap { | |||
239 | struct sk_buff_head ps_bc_buf; | 229 | struct sk_buff_head ps_bc_buf; |
240 | atomic_t num_sta_ps; /* number of stations in PS mode */ | 230 | atomic_t num_sta_ps; /* number of stations in PS mode */ |
241 | int dtim_count; | 231 | int dtim_count; |
242 | int num_beacons; /* number of TXed beacon frames for this BSS */ | ||
243 | }; | 232 | }; |
244 | 233 | ||
245 | struct ieee80211_if_wds { | 234 | struct ieee80211_if_wds { |
@@ -300,48 +289,37 @@ struct mesh_config { | |||
300 | #define IEEE80211_STA_AUTO_BSSID_SEL BIT(11) | 289 | #define IEEE80211_STA_AUTO_BSSID_SEL BIT(11) |
301 | #define IEEE80211_STA_AUTO_CHANNEL_SEL BIT(12) | 290 | #define IEEE80211_STA_AUTO_CHANNEL_SEL BIT(12) |
302 | #define IEEE80211_STA_PRIVACY_INVOKED BIT(13) | 291 | #define IEEE80211_STA_PRIVACY_INVOKED BIT(13) |
292 | /* flags for MLME request */ | ||
293 | #define IEEE80211_STA_REQ_SCAN 0 | ||
294 | #define IEEE80211_STA_REQ_DIRECT_PROBE 1 | ||
295 | #define IEEE80211_STA_REQ_AUTH 2 | ||
296 | #define IEEE80211_STA_REQ_RUN 3 | ||
297 | |||
298 | /* STA/IBSS MLME states */ | ||
299 | enum ieee80211_sta_mlme_state { | ||
300 | IEEE80211_STA_MLME_DISABLED, | ||
301 | IEEE80211_STA_MLME_DIRECT_PROBE, | ||
302 | IEEE80211_STA_MLME_AUTHENTICATE, | ||
303 | IEEE80211_STA_MLME_ASSOCIATE, | ||
304 | IEEE80211_STA_MLME_ASSOCIATED, | ||
305 | IEEE80211_STA_MLME_IBSS_SEARCH, | ||
306 | IEEE80211_STA_MLME_IBSS_JOINED, | ||
307 | }; | ||
308 | |||
309 | /* bitfield of allowed auth algs */ | ||
310 | #define IEEE80211_AUTH_ALG_OPEN BIT(0) | ||
311 | #define IEEE80211_AUTH_ALG_SHARED_KEY BIT(1) | ||
312 | #define IEEE80211_AUTH_ALG_LEAP BIT(2) | ||
313 | |||
303 | struct ieee80211_if_sta { | 314 | struct ieee80211_if_sta { |
304 | struct timer_list timer; | 315 | struct timer_list timer; |
305 | struct work_struct work; | 316 | struct work_struct work; |
306 | u8 bssid[ETH_ALEN], prev_bssid[ETH_ALEN]; | 317 | u8 bssid[ETH_ALEN], prev_bssid[ETH_ALEN]; |
307 | u8 ssid[IEEE80211_MAX_SSID_LEN]; | 318 | u8 ssid[IEEE80211_MAX_SSID_LEN]; |
308 | enum { | 319 | enum ieee80211_sta_mlme_state state; |
309 | IEEE80211_DISABLED, IEEE80211_AUTHENTICATE, | ||
310 | IEEE80211_ASSOCIATE, IEEE80211_ASSOCIATED, | ||
311 | IEEE80211_IBSS_SEARCH, IEEE80211_IBSS_JOINED, | ||
312 | IEEE80211_MESH_UP | ||
313 | } state; | ||
314 | size_t ssid_len; | 320 | size_t ssid_len; |
315 | u8 scan_ssid[IEEE80211_MAX_SSID_LEN]; | 321 | u8 scan_ssid[IEEE80211_MAX_SSID_LEN]; |
316 | size_t scan_ssid_len; | 322 | size_t scan_ssid_len; |
317 | #ifdef CONFIG_MAC80211_MESH | ||
318 | struct timer_list mesh_path_timer; | ||
319 | u8 mesh_id[IEEE80211_MAX_MESH_ID_LEN]; | ||
320 | size_t mesh_id_len; | ||
321 | /* Active Path Selection Protocol Identifier */ | ||
322 | u8 mesh_pp_id[4]; | ||
323 | /* Active Path Selection Metric Identifier */ | ||
324 | u8 mesh_pm_id[4]; | ||
325 | /* Congestion Control Mode Identifier */ | ||
326 | u8 mesh_cc_id[4]; | ||
327 | /* Local mesh Destination Sequence Number */ | ||
328 | u32 dsn; | ||
329 | /* Last used PREQ ID */ | ||
330 | u32 preq_id; | ||
331 | atomic_t mpaths; | ||
332 | /* Timestamp of last DSN update */ | ||
333 | unsigned long last_dsn_update; | ||
334 | /* Timestamp of last DSN sent */ | ||
335 | unsigned long last_preq; | ||
336 | struct mesh_rmc *rmc; | ||
337 | spinlock_t mesh_preq_queue_lock; | ||
338 | struct mesh_preq_queue preq_queue; | ||
339 | int preq_queue_len; | ||
340 | struct mesh_stats mshstats; | ||
341 | struct mesh_config mshcfg; | ||
342 | u32 mesh_seqnum; | ||
343 | bool accepting_plinks; | ||
344 | #endif | ||
345 | u16 aid; | 323 | u16 aid; |
346 | u16 ap_capab, capab; | 324 | u16 ap_capab, capab; |
347 | u8 *extra_ie; /* to be added to the end of AssocReq */ | 325 | u8 *extra_ie; /* to be added to the end of AssocReq */ |
@@ -353,20 +331,17 @@ struct ieee80211_if_sta { | |||
353 | 331 | ||
354 | struct sk_buff_head skb_queue; | 332 | struct sk_buff_head skb_queue; |
355 | 333 | ||
356 | int auth_tries, assoc_tries; | 334 | int assoc_scan_tries; /* number of scans done pre-association */ |
335 | int direct_probe_tries; /* retries for direct probes */ | ||
336 | int auth_tries; /* retries for auth req */ | ||
337 | int assoc_tries; /* retries for assoc req */ | ||
357 | 338 | ||
358 | unsigned long request; | 339 | unsigned long request; |
359 | 340 | ||
360 | unsigned long last_probe; | 341 | unsigned long last_probe; |
361 | 342 | ||
362 | unsigned int flags; | 343 | unsigned int flags; |
363 | #define IEEE80211_STA_REQ_SCAN 0 | ||
364 | #define IEEE80211_STA_REQ_AUTH 1 | ||
365 | #define IEEE80211_STA_REQ_RUN 2 | ||
366 | 344 | ||
367 | #define IEEE80211_AUTH_ALG_OPEN BIT(0) | ||
368 | #define IEEE80211_AUTH_ALG_SHARED_KEY BIT(1) | ||
369 | #define IEEE80211_AUTH_ALG_LEAP BIT(2) | ||
370 | unsigned int auth_algs; /* bitfield of allowed auth algs */ | 345 | unsigned int auth_algs; /* bitfield of allowed auth algs */ |
371 | int auth_alg; /* currently used IEEE 802.11 authentication algorithm */ | 346 | int auth_alg; /* currently used IEEE 802.11 authentication algorithm */ |
372 | int auth_transaction; | 347 | int auth_transaction; |
@@ -376,31 +351,70 @@ struct ieee80211_if_sta { | |||
376 | u32 supp_rates_bits[IEEE80211_NUM_BANDS]; | 351 | u32 supp_rates_bits[IEEE80211_NUM_BANDS]; |
377 | 352 | ||
378 | int wmm_last_param_set; | 353 | int wmm_last_param_set; |
379 | int num_beacons; /* number of TXed beacon frames by this STA */ | ||
380 | }; | 354 | }; |
381 | 355 | ||
382 | static inline void ieee80211_if_sta_set_mesh_id(struct ieee80211_if_sta *ifsta, | 356 | struct ieee80211_if_mesh { |
383 | u8 mesh_id_len, u8 *mesh_id) | 357 | struct work_struct work; |
384 | { | 358 | struct timer_list housekeeping_timer; |
385 | #ifdef CONFIG_MAC80211_MESH | 359 | struct timer_list mesh_path_timer; |
386 | ifsta->mesh_id_len = mesh_id_len; | 360 | struct sk_buff_head skb_queue; |
387 | memcpy(ifsta->mesh_id, mesh_id, mesh_id_len); | 361 | |
388 | #endif | 362 | bool housekeeping; |
389 | } | 363 | |
364 | u8 mesh_id[IEEE80211_MAX_MESH_ID_LEN]; | ||
365 | size_t mesh_id_len; | ||
366 | /* Active Path Selection Protocol Identifier */ | ||
367 | u8 mesh_pp_id[4]; | ||
368 | /* Active Path Selection Metric Identifier */ | ||
369 | u8 mesh_pm_id[4]; | ||
370 | /* Congestion Control Mode Identifier */ | ||
371 | u8 mesh_cc_id[4]; | ||
372 | /* Local mesh Destination Sequence Number */ | ||
373 | u32 dsn; | ||
374 | /* Last used PREQ ID */ | ||
375 | u32 preq_id; | ||
376 | atomic_t mpaths; | ||
377 | /* Timestamp of last DSN update */ | ||
378 | unsigned long last_dsn_update; | ||
379 | /* Timestamp of last DSN sent */ | ||
380 | unsigned long last_preq; | ||
381 | struct mesh_rmc *rmc; | ||
382 | spinlock_t mesh_preq_queue_lock; | ||
383 | struct mesh_preq_queue preq_queue; | ||
384 | int preq_queue_len; | ||
385 | struct mesh_stats mshstats; | ||
386 | struct mesh_config mshcfg; | ||
387 | u32 mesh_seqnum; | ||
388 | bool accepting_plinks; | ||
389 | }; | ||
390 | 390 | ||
391 | #ifdef CONFIG_MAC80211_MESH | 391 | #ifdef CONFIG_MAC80211_MESH |
392 | #define IEEE80211_IFSTA_MESH_CTR_INC(sta, name) \ | 392 | #define IEEE80211_IFSTA_MESH_CTR_INC(msh, name) \ |
393 | do { (sta)->mshstats.name++; } while (0) | 393 | do { (msh)->mshstats.name++; } while (0) |
394 | #else | 394 | #else |
395 | #define IEEE80211_IFSTA_MESH_CTR_INC(sta, name) \ | 395 | #define IEEE80211_IFSTA_MESH_CTR_INC(msh, name) \ |
396 | do { } while (0) | 396 | do { } while (0) |
397 | #endif | 397 | #endif |
398 | 398 | ||
399 | /* flags used in struct ieee80211_sub_if_data.flags */ | 399 | /** |
400 | #define IEEE80211_SDATA_ALLMULTI BIT(0) | 400 | * enum ieee80211_sub_if_data_flags - virtual interface flags |
401 | #define IEEE80211_SDATA_PROMISC BIT(1) | 401 | * |
402 | #define IEEE80211_SDATA_USERSPACE_MLME BIT(2) | 402 | * @IEEE80211_SDATA_ALLMULTI: interface wants all multicast packets |
403 | #define IEEE80211_SDATA_OPERATING_GMODE BIT(3) | 403 | * @IEEE80211_SDATA_PROMISC: interface is promisc |
404 | * @IEEE80211_SDATA_USERSPACE_MLME: userspace MLME is active | ||
405 | * @IEEE80211_SDATA_OPERATING_GMODE: operating in G-only mode | ||
406 | * @IEEE80211_SDATA_DONT_BRIDGE_PACKETS: bridge packets between | ||
407 | * associated stations and deliver multicast frames both | ||
408 | * back to wireless media and to the local net stack. | ||
409 | */ | ||
410 | enum ieee80211_sub_if_data_flags { | ||
411 | IEEE80211_SDATA_ALLMULTI = BIT(0), | ||
412 | IEEE80211_SDATA_PROMISC = BIT(1), | ||
413 | IEEE80211_SDATA_USERSPACE_MLME = BIT(2), | ||
414 | IEEE80211_SDATA_OPERATING_GMODE = BIT(3), | ||
415 | IEEE80211_SDATA_DONT_BRIDGE_PACKETS = BIT(4), | ||
416 | }; | ||
417 | |||
404 | struct ieee80211_sub_if_data { | 418 | struct ieee80211_sub_if_data { |
405 | struct list_head list; | 419 | struct list_head list; |
406 | 420 | ||
@@ -416,11 +430,6 @@ struct ieee80211_sub_if_data { | |||
416 | 430 | ||
417 | int drop_unencrypted; | 431 | int drop_unencrypted; |
418 | 432 | ||
419 | /* | ||
420 | * basic rates of this AP or the AP we're associated to | ||
421 | */ | ||
422 | u64 basic_rates; | ||
423 | |||
424 | /* Fragment table for host-based reassembly */ | 433 | /* Fragment table for host-based reassembly */ |
425 | struct ieee80211_fragment_entry fragments[IEEE80211_FRAGMENT_MAX]; | 434 | struct ieee80211_fragment_entry fragments[IEEE80211_FRAGMENT_MAX]; |
426 | unsigned int fragment_next; | 435 | unsigned int fragment_next; |
@@ -447,6 +456,9 @@ struct ieee80211_sub_if_data { | |||
447 | struct ieee80211_if_wds wds; | 456 | struct ieee80211_if_wds wds; |
448 | struct ieee80211_if_vlan vlan; | 457 | struct ieee80211_if_vlan vlan; |
449 | struct ieee80211_if_sta sta; | 458 | struct ieee80211_if_sta sta; |
459 | #ifdef CONFIG_MAC80211_MESH | ||
460 | struct ieee80211_if_mesh mesh; | ||
461 | #endif | ||
450 | u32 mntr_flags; | 462 | u32 mntr_flags; |
451 | } u; | 463 | } u; |
452 | 464 | ||
@@ -469,7 +481,6 @@ struct ieee80211_sub_if_data { | |||
469 | struct dentry *auth_alg; | 481 | struct dentry *auth_alg; |
470 | struct dentry *auth_transaction; | 482 | struct dentry *auth_transaction; |
471 | struct dentry *flags; | 483 | struct dentry *flags; |
472 | struct dentry *num_beacons_sta; | ||
473 | struct dentry *force_unicast_rateidx; | 484 | struct dentry *force_unicast_rateidx; |
474 | struct dentry *max_ratectrl_rateidx; | 485 | struct dentry *max_ratectrl_rateidx; |
475 | } sta; | 486 | } sta; |
@@ -477,7 +488,6 @@ struct ieee80211_sub_if_data { | |||
477 | struct dentry *drop_unencrypted; | 488 | struct dentry *drop_unencrypted; |
478 | struct dentry *num_sta_ps; | 489 | struct dentry *num_sta_ps; |
479 | struct dentry *dtim_count; | 490 | struct dentry *dtim_count; |
480 | struct dentry *num_beacons; | ||
481 | struct dentry *force_unicast_rateidx; | 491 | struct dentry *force_unicast_rateidx; |
482 | struct dentry *max_ratectrl_rateidx; | 492 | struct dentry *max_ratectrl_rateidx; |
483 | struct dentry *num_buffered_multicast; | 493 | struct dentry *num_buffered_multicast; |
@@ -540,6 +550,19 @@ struct ieee80211_sub_if_data *vif_to_sdata(struct ieee80211_vif *p) | |||
540 | return container_of(p, struct ieee80211_sub_if_data, vif); | 550 | return container_of(p, struct ieee80211_sub_if_data, vif); |
541 | } | 551 | } |
542 | 552 | ||
553 | static inline void | ||
554 | ieee80211_sdata_set_mesh_id(struct ieee80211_sub_if_data *sdata, | ||
555 | u8 mesh_id_len, u8 *mesh_id) | ||
556 | { | ||
557 | #ifdef CONFIG_MAC80211_MESH | ||
558 | struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; | ||
559 | ifmsh->mesh_id_len = mesh_id_len; | ||
560 | memcpy(ifmsh->mesh_id, mesh_id, mesh_id_len); | ||
561 | #else | ||
562 | WARN_ON(1); | ||
563 | #endif | ||
564 | } | ||
565 | |||
543 | enum { | 566 | enum { |
544 | IEEE80211_RX_MSG = 1, | 567 | IEEE80211_RX_MSG = 1, |
545 | IEEE80211_TX_STATUS_MSG = 2, | 568 | IEEE80211_TX_STATUS_MSG = 2, |
@@ -550,6 +573,10 @@ enum { | |||
550 | /* maximum number of hardware queues we support. */ | 573 | /* maximum number of hardware queues we support. */ |
551 | #define QD_MAX_QUEUES (IEEE80211_MAX_AMPDU_QUEUES + IEEE80211_MAX_QUEUES) | 574 | #define QD_MAX_QUEUES (IEEE80211_MAX_AMPDU_QUEUES + IEEE80211_MAX_QUEUES) |
552 | 575 | ||
576 | struct ieee80211_master_priv { | ||
577 | struct ieee80211_local *local; | ||
578 | }; | ||
579 | |||
553 | struct ieee80211_local { | 580 | struct ieee80211_local { |
554 | /* embed the driver visible part. | 581 | /* embed the driver visible part. |
555 | * don't cast (use the static inlines below), but we keep | 582 | * don't cast (use the static inlines below), but we keep |
@@ -613,10 +640,6 @@ struct ieee80211_local { | |||
613 | struct crypto_blkcipher *wep_rx_tfm; | 640 | struct crypto_blkcipher *wep_rx_tfm; |
614 | u32 wep_iv; | 641 | u32 wep_iv; |
615 | 642 | ||
616 | int bridge_packets; /* bridge packets between associated stations and | ||
617 | * deliver multicast frames both back to wireless | ||
618 | * media and to the local net stack */ | ||
619 | |||
620 | struct list_head interfaces; | 643 | struct list_head interfaces; |
621 | 644 | ||
622 | /* | 645 | /* |
@@ -626,21 +649,21 @@ struct ieee80211_local { | |||
626 | spinlock_t key_lock; | 649 | spinlock_t key_lock; |
627 | 650 | ||
628 | 651 | ||
629 | bool sta_sw_scanning; | 652 | /* Scanning and BSS list */ |
630 | bool sta_hw_scanning; | 653 | bool sw_scanning, hw_scanning; |
631 | int scan_channel_idx; | 654 | int scan_channel_idx; |
632 | enum ieee80211_band scan_band; | 655 | enum ieee80211_band scan_band; |
633 | 656 | ||
634 | enum { SCAN_SET_CHANNEL, SCAN_SEND_PROBE } scan_state; | 657 | enum { SCAN_SET_CHANNEL, SCAN_SEND_PROBE } scan_state; |
635 | unsigned long last_scan_completed; | 658 | unsigned long last_scan_completed; |
636 | struct delayed_work scan_work; | 659 | struct delayed_work scan_work; |
637 | struct net_device *scan_dev; | 660 | struct ieee80211_sub_if_data *scan_sdata; |
638 | struct ieee80211_channel *oper_channel, *scan_channel; | 661 | struct ieee80211_channel *oper_channel, *scan_channel; |
639 | u8 scan_ssid[IEEE80211_MAX_SSID_LEN]; | 662 | u8 scan_ssid[IEEE80211_MAX_SSID_LEN]; |
640 | size_t scan_ssid_len; | 663 | size_t scan_ssid_len; |
641 | struct list_head sta_bss_list; | 664 | struct list_head bss_list; |
642 | struct ieee80211_sta_bss *sta_bss_hash[STA_HASH_SIZE]; | 665 | struct ieee80211_bss *bss_hash[STA_HASH_SIZE]; |
643 | spinlock_t sta_bss_lock; | 666 | spinlock_t bss_lock; |
644 | 667 | ||
645 | /* SNMP counters */ | 668 | /* SNMP counters */ |
646 | /* dot11CountersTable */ | 669 | /* dot11CountersTable */ |
@@ -701,10 +724,11 @@ struct ieee80211_local { | |||
701 | 724 | ||
702 | #ifdef CONFIG_MAC80211_DEBUGFS | 725 | #ifdef CONFIG_MAC80211_DEBUGFS |
703 | struct local_debugfsdentries { | 726 | struct local_debugfsdentries { |
727 | struct dentry *rcdir; | ||
728 | struct dentry *rcname; | ||
704 | struct dentry *frequency; | 729 | struct dentry *frequency; |
705 | struct dentry *antenna_sel_tx; | 730 | struct dentry *antenna_sel_tx; |
706 | struct dentry *antenna_sel_rx; | 731 | struct dentry *antenna_sel_rx; |
707 | struct dentry *bridge_packets; | ||
708 | struct dentry *rts_threshold; | 732 | struct dentry *rts_threshold; |
709 | struct dentry *fragmentation_threshold; | 733 | struct dentry *fragmentation_threshold; |
710 | struct dentry *short_retry_limit; | 734 | struct dentry *short_retry_limit; |
@@ -774,6 +798,9 @@ struct ieee80211_ra_tid { | |||
774 | 798 | ||
775 | /* Parsed Information Elements */ | 799 | /* Parsed Information Elements */ |
776 | struct ieee802_11_elems { | 800 | struct ieee802_11_elems { |
801 | u8 *ie_start; | ||
802 | size_t total_len; | ||
803 | |||
777 | /* pointers to IEs */ | 804 | /* pointers to IEs */ |
778 | u8 *ssid; | 805 | u8 *ssid; |
779 | u8 *supp_rates; | 806 | u8 *supp_rates; |
@@ -857,86 +884,82 @@ static inline int ieee80211_bssid_match(const u8 *raddr, const u8 *addr) | |||
857 | } | 884 | } |
858 | 885 | ||
859 | 886 | ||
860 | /* ieee80211.c */ | ||
861 | int ieee80211_hw_config(struct ieee80211_local *local); | 887 | int ieee80211_hw_config(struct ieee80211_local *local); |
862 | int ieee80211_if_config(struct ieee80211_sub_if_data *sdata, u32 changed); | 888 | int ieee80211_if_config(struct ieee80211_sub_if_data *sdata, u32 changed); |
863 | void ieee80211_tx_set_protected(struct ieee80211_tx_data *tx); | 889 | void ieee80211_tx_set_protected(struct ieee80211_tx_data *tx); |
864 | u32 ieee80211_handle_ht(struct ieee80211_local *local, int enable_ht, | 890 | u32 ieee80211_handle_ht(struct ieee80211_local *local, int enable_ht, |
865 | struct ieee80211_ht_info *req_ht_cap, | 891 | struct ieee80211_ht_info *req_ht_cap, |
866 | struct ieee80211_ht_bss_info *req_bss_cap); | 892 | struct ieee80211_ht_bss_info *req_bss_cap); |
893 | void ieee80211_bss_info_change_notify(struct ieee80211_sub_if_data *sdata, | ||
894 | u32 changed); | ||
895 | void ieee80211_configure_filter(struct ieee80211_local *local); | ||
867 | 896 | ||
868 | /* ieee80211_ioctl.c */ | 897 | /* wireless extensions */ |
869 | extern const struct iw_handler_def ieee80211_iw_handler_def; | 898 | extern const struct iw_handler_def ieee80211_iw_handler_def; |
870 | int ieee80211_set_freq(struct net_device *dev, int freq); | ||
871 | 899 | ||
872 | /* ieee80211_sta.c */ | 900 | /* STA/IBSS code */ |
873 | void ieee80211_sta_timer(unsigned long data); | 901 | void ieee80211_sta_setup_sdata(struct ieee80211_sub_if_data *sdata); |
874 | void ieee80211_sta_work(struct work_struct *work); | 902 | void ieee80211_scan_work(struct work_struct *work); |
875 | void ieee80211_sta_scan_work(struct work_struct *work); | 903 | void ieee80211_sta_rx_mgmt(struct ieee80211_sub_if_data *sdata, struct sk_buff *skb, |
876 | void ieee80211_sta_rx_mgmt(struct net_device *dev, struct sk_buff *skb, | ||
877 | struct ieee80211_rx_status *rx_status); | 904 | struct ieee80211_rx_status *rx_status); |
878 | int ieee80211_sta_set_ssid(struct net_device *dev, char *ssid, size_t len); | 905 | int ieee80211_sta_set_ssid(struct ieee80211_sub_if_data *sdata, char *ssid, size_t len); |
879 | int ieee80211_sta_get_ssid(struct net_device *dev, char *ssid, size_t *len); | 906 | int ieee80211_sta_get_ssid(struct ieee80211_sub_if_data *sdata, char *ssid, size_t *len); |
880 | int ieee80211_sta_set_bssid(struct net_device *dev, u8 *bssid); | 907 | int ieee80211_sta_set_bssid(struct ieee80211_sub_if_data *sdata, u8 *bssid); |
881 | int ieee80211_sta_req_scan(struct net_device *dev, u8 *ssid, size_t ssid_len); | 908 | void ieee80211_sta_req_auth(struct ieee80211_sub_if_data *sdata, |
882 | void ieee80211_sta_req_auth(struct net_device *dev, | ||
883 | struct ieee80211_if_sta *ifsta); | 909 | struct ieee80211_if_sta *ifsta); |
884 | int ieee80211_sta_scan_results(struct net_device *dev, | 910 | struct sta_info *ieee80211_ibss_add_sta(struct ieee80211_sub_if_data *sdata, |
885 | struct iw_request_info *info, | ||
886 | char *buf, size_t len); | ||
887 | ieee80211_rx_result ieee80211_sta_rx_scan( | ||
888 | struct net_device *dev, struct sk_buff *skb, | ||
889 | struct ieee80211_rx_status *rx_status); | ||
890 | void ieee80211_rx_bss_list_init(struct ieee80211_local *local); | ||
891 | void ieee80211_rx_bss_list_deinit(struct ieee80211_local *local); | ||
892 | int ieee80211_sta_set_extra_ie(struct net_device *dev, char *ie, size_t len); | ||
893 | struct sta_info *ieee80211_ibss_add_sta(struct net_device *dev, | ||
894 | struct sk_buff *skb, u8 *bssid, | 911 | struct sk_buff *skb, u8 *bssid, |
895 | u8 *addr, u64 supp_rates); | 912 | u8 *addr, u64 supp_rates); |
896 | int ieee80211_sta_deauthenticate(struct net_device *dev, u16 reason); | 913 | int ieee80211_sta_deauthenticate(struct ieee80211_sub_if_data *sdata, u16 reason); |
897 | int ieee80211_sta_disassociate(struct net_device *dev, u16 reason); | 914 | int ieee80211_sta_disassociate(struct ieee80211_sub_if_data *sdata, u16 reason); |
898 | void ieee80211_bss_info_change_notify(struct ieee80211_sub_if_data *sdata, | 915 | u32 ieee80211_reset_erp_info(struct ieee80211_sub_if_data *sdata); |
899 | u32 changed); | ||
900 | u32 ieee80211_reset_erp_info(struct net_device *dev); | ||
901 | int ieee80211_ht_cap_ie_to_ht_info(struct ieee80211_ht_cap *ht_cap_ie, | ||
902 | struct ieee80211_ht_info *ht_info); | ||
903 | int ieee80211_ht_addt_info_ie_to_ht_bss_info( | ||
904 | struct ieee80211_ht_addt_info *ht_add_info_ie, | ||
905 | struct ieee80211_ht_bss_info *bss_info); | ||
906 | void ieee80211_send_addba_request(struct net_device *dev, const u8 *da, | ||
907 | u16 tid, u8 dialog_token, u16 start_seq_num, | ||
908 | u16 agg_size, u16 timeout); | ||
909 | void ieee80211_send_delba(struct net_device *dev, const u8 *da, u16 tid, | ||
910 | u16 initiator, u16 reason_code); | ||
911 | void ieee80211_send_bar(struct net_device *dev, u8 *ra, u16 tid, u16 ssn); | ||
912 | |||
913 | void ieee80211_sta_stop_rx_ba_session(struct net_device *dev, u8 *da, | ||
914 | u16 tid, u16 initiator, u16 reason); | ||
915 | void sta_addba_resp_timer_expired(unsigned long data); | ||
916 | void ieee80211_sta_tear_down_BA_sessions(struct net_device *dev, u8 *addr); | ||
917 | u64 ieee80211_sta_get_rates(struct ieee80211_local *local, | 916 | u64 ieee80211_sta_get_rates(struct ieee80211_local *local, |
918 | struct ieee802_11_elems *elems, | 917 | struct ieee802_11_elems *elems, |
919 | enum ieee80211_band band); | 918 | enum ieee80211_band band); |
920 | void ieee80211_sta_tx(struct net_device *dev, struct sk_buff *skb, | 919 | void ieee80211_send_probe_req(struct ieee80211_sub_if_data *sdata, u8 *dst, |
921 | int encrypt); | 920 | u8 *ssid, size_t ssid_len); |
922 | void ieee802_11_parse_elems(u8 *start, size_t len, | 921 | |
923 | struct ieee802_11_elems *elems); | 922 | /* scan/BSS handling */ |
924 | 923 | int ieee80211_request_scan(struct ieee80211_sub_if_data *sdata, | |
925 | #ifdef CONFIG_MAC80211_MESH | 924 | u8 *ssid, size_t ssid_len); |
926 | void ieee80211_start_mesh(struct net_device *dev); | 925 | int ieee80211_scan_results(struct ieee80211_local *local, |
927 | #else | 926 | struct iw_request_info *info, |
928 | static inline void ieee80211_start_mesh(struct net_device *dev) | 927 | char *buf, size_t len); |
929 | {} | 928 | ieee80211_rx_result |
930 | #endif | 929 | ieee80211_scan_rx(struct ieee80211_sub_if_data *sdata, |
930 | struct sk_buff *skb, | ||
931 | struct ieee80211_rx_status *rx_status); | ||
932 | void ieee80211_rx_bss_list_init(struct ieee80211_local *local); | ||
933 | void ieee80211_rx_bss_list_deinit(struct ieee80211_local *local); | ||
934 | int ieee80211_sta_set_extra_ie(struct ieee80211_sub_if_data *sdata, | ||
935 | char *ie, size_t len); | ||
936 | |||
937 | void ieee80211_mlme_notify_scan_completed(struct ieee80211_local *local); | ||
938 | int ieee80211_start_scan(struct ieee80211_sub_if_data *scan_sdata, | ||
939 | u8 *ssid, size_t ssid_len); | ||
940 | struct ieee80211_bss * | ||
941 | ieee80211_bss_info_update(struct ieee80211_local *local, | ||
942 | struct ieee80211_rx_status *rx_status, | ||
943 | struct ieee80211_mgmt *mgmt, | ||
944 | size_t len, | ||
945 | struct ieee802_11_elems *elems, | ||
946 | int freq, bool beacon); | ||
947 | struct ieee80211_bss * | ||
948 | ieee80211_rx_bss_add(struct ieee80211_local *local, u8 *bssid, int freq, | ||
949 | u8 *ssid, u8 ssid_len); | ||
950 | struct ieee80211_bss * | ||
951 | ieee80211_rx_bss_get(struct ieee80211_local *local, u8 *bssid, int freq, | ||
952 | u8 *ssid, u8 ssid_len); | ||
953 | void ieee80211_rx_bss_put(struct ieee80211_local *local, | ||
954 | struct ieee80211_bss *bss); | ||
931 | 955 | ||
932 | /* interface handling */ | 956 | /* interface handling */ |
933 | void ieee80211_if_setup(struct net_device *dev); | ||
934 | int ieee80211_if_add(struct ieee80211_local *local, const char *name, | 957 | int ieee80211_if_add(struct ieee80211_local *local, const char *name, |
935 | struct net_device **new_dev, enum ieee80211_if_types type, | 958 | struct net_device **new_dev, enum nl80211_iftype type, |
936 | struct vif_params *params); | 959 | struct vif_params *params); |
937 | int ieee80211_if_change_type(struct ieee80211_sub_if_data *sdata, | 960 | int ieee80211_if_change_type(struct ieee80211_sub_if_data *sdata, |
938 | enum ieee80211_if_types type); | 961 | enum nl80211_iftype type); |
939 | void ieee80211_if_remove(struct net_device *dev); | 962 | void ieee80211_if_remove(struct ieee80211_sub_if_data *sdata); |
940 | void ieee80211_remove_interfaces(struct ieee80211_local *local); | 963 | void ieee80211_remove_interfaces(struct ieee80211_local *local); |
941 | 964 | ||
942 | /* tx handling */ | 965 | /* tx handling */ |
@@ -946,16 +969,52 @@ int ieee80211_master_start_xmit(struct sk_buff *skb, struct net_device *dev); | |||
946 | int ieee80211_monitor_start_xmit(struct sk_buff *skb, struct net_device *dev); | 969 | int ieee80211_monitor_start_xmit(struct sk_buff *skb, struct net_device *dev); |
947 | int ieee80211_subif_start_xmit(struct sk_buff *skb, struct net_device *dev); | 970 | int ieee80211_subif_start_xmit(struct sk_buff *skb, struct net_device *dev); |
948 | 971 | ||
972 | /* HT */ | ||
973 | int ieee80211_ht_cap_ie_to_ht_info(struct ieee80211_ht_cap *ht_cap_ie, | ||
974 | struct ieee80211_ht_info *ht_info); | ||
975 | int ieee80211_ht_addt_info_ie_to_ht_bss_info( | ||
976 | struct ieee80211_ht_addt_info *ht_add_info_ie, | ||
977 | struct ieee80211_ht_bss_info *bss_info); | ||
978 | void ieee80211_send_bar(struct ieee80211_sub_if_data *sdata, u8 *ra, u16 tid, u16 ssn); | ||
979 | |||
980 | void ieee80211_sta_stop_rx_ba_session(struct ieee80211_sub_if_data *sdata, u8 *da, | ||
981 | u16 tid, u16 initiator, u16 reason); | ||
982 | void ieee80211_sta_tear_down_BA_sessions(struct ieee80211_sub_if_data *sdata, u8 *addr); | ||
983 | void ieee80211_process_delba(struct ieee80211_sub_if_data *sdata, | ||
984 | struct sta_info *sta, | ||
985 | struct ieee80211_mgmt *mgmt, size_t len); | ||
986 | void ieee80211_process_addba_resp(struct ieee80211_local *local, | ||
987 | struct sta_info *sta, | ||
988 | struct ieee80211_mgmt *mgmt, | ||
989 | size_t len); | ||
990 | void ieee80211_process_addba_request(struct ieee80211_local *local, | ||
991 | struct sta_info *sta, | ||
992 | struct ieee80211_mgmt *mgmt, | ||
993 | size_t len); | ||
994 | |||
995 | /* Spectrum management */ | ||
996 | void ieee80211_process_measurement_req(struct ieee80211_sub_if_data *sdata, | ||
997 | struct ieee80211_mgmt *mgmt, | ||
998 | size_t len); | ||
999 | |||
949 | /* utility functions/constants */ | 1000 | /* utility functions/constants */ |
950 | extern void *mac80211_wiphy_privid; /* for wiphy privid */ | 1001 | extern void *mac80211_wiphy_privid; /* for wiphy privid */ |
951 | extern const unsigned char rfc1042_header[6]; | 1002 | extern const unsigned char rfc1042_header[6]; |
952 | extern const unsigned char bridge_tunnel_header[6]; | 1003 | extern const unsigned char bridge_tunnel_header[6]; |
953 | u8 *ieee80211_get_bssid(struct ieee80211_hdr *hdr, size_t len, | 1004 | u8 *ieee80211_get_bssid(struct ieee80211_hdr *hdr, size_t len, |
954 | enum ieee80211_if_types type); | 1005 | enum nl80211_iftype type); |
955 | int ieee80211_frame_duration(struct ieee80211_local *local, size_t len, | 1006 | int ieee80211_frame_duration(struct ieee80211_local *local, size_t len, |
956 | int rate, int erp, int short_preamble); | 1007 | int rate, int erp, int short_preamble); |
957 | void mac80211_ev_michael_mic_failure(struct net_device *dev, int keyidx, | 1008 | void mac80211_ev_michael_mic_failure(struct ieee80211_sub_if_data *sdata, int keyidx, |
958 | struct ieee80211_hdr *hdr); | 1009 | struct ieee80211_hdr *hdr); |
1010 | void ieee80211_set_wmm_default(struct ieee80211_sub_if_data *sdata); | ||
1011 | void ieee80211_tx_skb(struct ieee80211_sub_if_data *sdata, struct sk_buff *skb, | ||
1012 | int encrypt); | ||
1013 | void ieee802_11_parse_elems(u8 *start, size_t len, | ||
1014 | struct ieee802_11_elems *elems); | ||
1015 | int ieee80211_set_freq(struct ieee80211_sub_if_data *sdata, int freq); | ||
1016 | u64 ieee80211_mandatory_rates(struct ieee80211_local *local, | ||
1017 | enum ieee80211_band band); | ||
959 | 1018 | ||
960 | #ifdef CONFIG_MAC80211_NOINLINE | 1019 | #ifdef CONFIG_MAC80211_NOINLINE |
961 | #define debug_noinline noinline | 1020 | #define debug_noinline noinline |