diff options
Diffstat (limited to 'net/mac80211/ieee80211_i.h')
| -rw-r--r-- | net/mac80211/ieee80211_i.h | 394 |
1 files changed, 211 insertions, 183 deletions
diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h index 10d316e455de..241533e1bc03 100644 --- a/net/mac80211/ieee80211_i.h +++ b/net/mac80211/ieee80211_i.h | |||
| @@ -2,7 +2,7 @@ | |||
| 2 | * Copyright 2002-2005, Instant802 Networks, Inc. | 2 | * Copyright 2002-2005, Instant802 Networks, Inc. |
| 3 | * Copyright 2005, Devicescape Software, Inc. | 3 | * Copyright 2005, Devicescape Software, Inc. |
| 4 | * Copyright 2006-2007 Jiri Benc <jbenc@suse.cz> | 4 | * Copyright 2006-2007 Jiri Benc <jbenc@suse.cz> |
| 5 | * Copyright 2007-2008 Johannes Berg <johannes@sipsolutions.net> | 5 | * Copyright 2007-2010 Johannes Berg <johannes@sipsolutions.net> |
| 6 | * | 6 | * |
| 7 | * This program is free software; you can redistribute it and/or modify | 7 | * This program is free software; you can redistribute it and/or modify |
| 8 | * it under the terms of the GNU General Public License version 2 as | 8 | * it under the terms of the GNU General Public License version 2 as |
| @@ -23,6 +23,7 @@ | |||
| 23 | #include <linux/types.h> | 23 | #include <linux/types.h> |
| 24 | #include <linux/spinlock.h> | 24 | #include <linux/spinlock.h> |
| 25 | #include <linux/etherdevice.h> | 25 | #include <linux/etherdevice.h> |
| 26 | #include <net/ieee80211_radiotap.h> | ||
| 26 | #include <net/cfg80211.h> | 27 | #include <net/cfg80211.h> |
| 27 | #include <net/mac80211.h> | 28 | #include <net/mac80211.h> |
| 28 | #include "key.h" | 29 | #include "key.h" |
| @@ -57,6 +58,15 @@ struct ieee80211_local; | |||
| 57 | 58 | ||
| 58 | #define TU_TO_EXP_TIME(x) (jiffies + usecs_to_jiffies((x) * 1024)) | 59 | #define TU_TO_EXP_TIME(x) (jiffies + usecs_to_jiffies((x) * 1024)) |
| 59 | 60 | ||
| 61 | #define IEEE80211_DEFAULT_UAPSD_QUEUES \ | ||
| 62 | (IEEE80211_WMM_IE_STA_QOSINFO_AC_BK | \ | ||
| 63 | IEEE80211_WMM_IE_STA_QOSINFO_AC_BE | \ | ||
| 64 | IEEE80211_WMM_IE_STA_QOSINFO_AC_VI | \ | ||
| 65 | IEEE80211_WMM_IE_STA_QOSINFO_AC_VO) | ||
| 66 | |||
| 67 | #define IEEE80211_DEFAULT_MAX_SP_LEN \ | ||
| 68 | IEEE80211_WMM_IE_STA_QOSINFO_SP_ALL | ||
| 69 | |||
| 60 | struct ieee80211_fragment_entry { | 70 | struct ieee80211_fragment_entry { |
| 61 | unsigned long first_frag_time; | 71 | unsigned long first_frag_time; |
| 62 | unsigned int seq; | 72 | unsigned int seq; |
| @@ -70,9 +80,6 @@ struct ieee80211_fragment_entry { | |||
| 70 | 80 | ||
| 71 | 81 | ||
| 72 | struct ieee80211_bss { | 82 | struct ieee80211_bss { |
| 73 | /* Yes, this is a hack */ | ||
| 74 | struct cfg80211_bss cbss; | ||
| 75 | |||
| 76 | /* don't want to look up all the time */ | 83 | /* don't want to look up all the time */ |
| 77 | size_t ssid_len; | 84 | size_t ssid_len; |
| 78 | u8 ssid[IEEE80211_MAX_SSID_LEN]; | 85 | u8 ssid[IEEE80211_MAX_SSID_LEN]; |
| @@ -80,6 +87,7 @@ struct ieee80211_bss { | |||
| 80 | u8 dtim_period; | 87 | u8 dtim_period; |
| 81 | 88 | ||
| 82 | bool wmm_used; | 89 | bool wmm_used; |
| 90 | bool uapsd_supported; | ||
| 83 | 91 | ||
| 84 | unsigned long last_probe_resp; | 92 | unsigned long last_probe_resp; |
| 85 | 93 | ||
| @@ -139,7 +147,6 @@ typedef unsigned __bitwise__ ieee80211_tx_result; | |||
| 139 | 147 | ||
| 140 | struct ieee80211_tx_data { | 148 | struct ieee80211_tx_data { |
| 141 | struct sk_buff *skb; | 149 | struct sk_buff *skb; |
| 142 | struct net_device *dev; | ||
| 143 | struct ieee80211_local *local; | 150 | struct ieee80211_local *local; |
| 144 | struct ieee80211_sub_if_data *sdata; | 151 | struct ieee80211_sub_if_data *sdata; |
| 145 | struct sta_info *sta; | 152 | struct sta_info *sta; |
| @@ -162,21 +169,17 @@ typedef unsigned __bitwise__ ieee80211_rx_result; | |||
| 162 | /* frame is destined to interface currently processed (incl. multicast frames) */ | 169 | /* frame is destined to interface currently processed (incl. multicast frames) */ |
| 163 | #define IEEE80211_RX_RA_MATCH BIT(1) | 170 | #define IEEE80211_RX_RA_MATCH BIT(1) |
| 164 | #define IEEE80211_RX_AMSDU BIT(2) | 171 | #define IEEE80211_RX_AMSDU BIT(2) |
| 165 | #define IEEE80211_RX_CMNTR_REPORTED BIT(3) | 172 | #define IEEE80211_RX_FRAGMENTED BIT(3) |
| 166 | #define IEEE80211_RX_FRAGMENTED BIT(4) | 173 | /* only add flags here that do not change with subframes of an aMPDU */ |
| 167 | 174 | ||
| 168 | struct ieee80211_rx_data { | 175 | struct ieee80211_rx_data { |
| 169 | struct sk_buff *skb; | 176 | struct sk_buff *skb; |
| 170 | struct net_device *dev; | ||
| 171 | struct ieee80211_local *local; | 177 | struct ieee80211_local *local; |
| 172 | struct ieee80211_sub_if_data *sdata; | 178 | struct ieee80211_sub_if_data *sdata; |
| 173 | struct sta_info *sta; | 179 | struct sta_info *sta; |
| 174 | struct ieee80211_key *key; | 180 | struct ieee80211_key *key; |
| 175 | struct ieee80211_rx_status *status; | ||
| 176 | struct ieee80211_rate *rate; | ||
| 177 | 181 | ||
| 178 | unsigned int flags; | 182 | unsigned int flags; |
| 179 | int sent_ps_buffered; | ||
| 180 | int queue; | 183 | int queue; |
| 181 | u32 tkip_iv32; | 184 | u32 tkip_iv32; |
| 182 | u16 tkip_iv16; | 185 | u16 tkip_iv16; |
| @@ -209,6 +212,9 @@ struct ieee80211_if_wds { | |||
| 209 | 212 | ||
| 210 | struct ieee80211_if_vlan { | 213 | struct ieee80211_if_vlan { |
| 211 | struct list_head list; | 214 | struct list_head list; |
| 215 | |||
| 216 | /* used for all tx if the VLAN is configured to 4-addr mode */ | ||
| 217 | struct sta_info *sta; | ||
| 212 | }; | 218 | }; |
| 213 | 219 | ||
| 214 | struct mesh_stats { | 220 | struct mesh_stats { |
| @@ -228,31 +234,77 @@ struct mesh_preq_queue { | |||
| 228 | u8 flags; | 234 | u8 flags; |
| 229 | }; | 235 | }; |
| 230 | 236 | ||
| 231 | enum ieee80211_mgd_state { | 237 | enum ieee80211_work_type { |
| 232 | IEEE80211_MGD_STATE_IDLE, | 238 | IEEE80211_WORK_ABORT, |
| 233 | IEEE80211_MGD_STATE_PROBE, | 239 | IEEE80211_WORK_DIRECT_PROBE, |
| 234 | IEEE80211_MGD_STATE_AUTH, | 240 | IEEE80211_WORK_AUTH, |
| 235 | IEEE80211_MGD_STATE_ASSOC, | 241 | IEEE80211_WORK_ASSOC, |
| 242 | IEEE80211_WORK_REMAIN_ON_CHANNEL, | ||
| 236 | }; | 243 | }; |
| 237 | 244 | ||
| 238 | struct ieee80211_mgd_work { | 245 | /** |
| 246 | * enum work_done_result - indicates what to do after work was done | ||
| 247 | * | ||
| 248 | * @WORK_DONE_DESTROY: This work item is no longer needed, destroy. | ||
| 249 | * @WORK_DONE_REQUEUE: This work item was reset to be reused, and | ||
| 250 | * should be requeued. | ||
| 251 | */ | ||
| 252 | enum work_done_result { | ||
| 253 | WORK_DONE_DESTROY, | ||
| 254 | WORK_DONE_REQUEUE, | ||
| 255 | }; | ||
| 256 | |||
| 257 | struct ieee80211_work { | ||
| 239 | struct list_head list; | 258 | struct list_head list; |
| 240 | struct ieee80211_bss *bss; | 259 | |
| 241 | int ie_len; | 260 | struct rcu_head rcu_head; |
| 242 | u8 prev_bssid[ETH_ALEN]; | 261 | |
| 243 | u8 ssid[IEEE80211_MAX_SSID_LEN]; | 262 | struct ieee80211_sub_if_data *sdata; |
| 244 | u8 ssid_len; | 263 | |
| 264 | enum work_done_result (*done)(struct ieee80211_work *wk, | ||
| 265 | struct sk_buff *skb); | ||
| 266 | |||
| 267 | struct ieee80211_channel *chan; | ||
| 268 | enum nl80211_channel_type chan_type; | ||
| 269 | |||
| 245 | unsigned long timeout; | 270 | unsigned long timeout; |
| 246 | enum ieee80211_mgd_state state; | 271 | enum ieee80211_work_type type; |
| 247 | u16 auth_alg, auth_transaction; | ||
| 248 | 272 | ||
| 249 | int tries; | 273 | u8 filter_ta[ETH_ALEN]; |
| 250 | 274 | ||
| 251 | u8 key[WLAN_KEY_LEN_WEP104]; | 275 | bool started; |
| 252 | u8 key_len, key_idx; | 276 | |
| 277 | union { | ||
| 278 | struct { | ||
| 279 | int tries; | ||
| 280 | u16 algorithm, transaction; | ||
| 281 | u8 ssid[IEEE80211_MAX_SSID_LEN]; | ||
| 282 | u8 ssid_len; | ||
| 283 | u8 key[WLAN_KEY_LEN_WEP104]; | ||
| 284 | u8 key_len, key_idx; | ||
| 285 | bool privacy; | ||
| 286 | } probe_auth; | ||
| 287 | struct { | ||
| 288 | struct cfg80211_bss *bss; | ||
| 289 | const u8 *supp_rates; | ||
| 290 | const u8 *ht_information_ie; | ||
| 291 | enum ieee80211_smps_mode smps; | ||
| 292 | int tries; | ||
| 293 | u16 capability; | ||
| 294 | u8 prev_bssid[ETH_ALEN]; | ||
| 295 | u8 ssid[IEEE80211_MAX_SSID_LEN]; | ||
| 296 | u8 ssid_len; | ||
| 297 | u8 supp_rates_len; | ||
| 298 | bool wmm_used, use_11n, uapsd_used; | ||
| 299 | } assoc; | ||
| 300 | struct { | ||
| 301 | u32 duration; | ||
| 302 | } remain; | ||
| 303 | }; | ||
| 253 | 304 | ||
| 305 | int ie_len; | ||
| 254 | /* must be last */ | 306 | /* must be last */ |
| 255 | u8 ie[0]; /* for auth or assoc frame, not probe */ | 307 | u8 ie[0]; |
| 256 | }; | 308 | }; |
| 257 | 309 | ||
| 258 | /* flags used in struct ieee80211_if_managed.flags */ | 310 | /* flags used in struct ieee80211_if_managed.flags */ |
| @@ -260,15 +312,11 @@ enum ieee80211_sta_flags { | |||
| 260 | IEEE80211_STA_BEACON_POLL = BIT(0), | 312 | IEEE80211_STA_BEACON_POLL = BIT(0), |
| 261 | IEEE80211_STA_CONNECTION_POLL = BIT(1), | 313 | IEEE80211_STA_CONNECTION_POLL = BIT(1), |
| 262 | IEEE80211_STA_CONTROL_PORT = BIT(2), | 314 | IEEE80211_STA_CONTROL_PORT = BIT(2), |
| 263 | IEEE80211_STA_WMM_ENABLED = BIT(3), | ||
| 264 | IEEE80211_STA_DISABLE_11N = BIT(4), | 315 | IEEE80211_STA_DISABLE_11N = BIT(4), |
| 265 | IEEE80211_STA_CSA_RECEIVED = BIT(5), | 316 | IEEE80211_STA_CSA_RECEIVED = BIT(5), |
| 266 | IEEE80211_STA_MFP_ENABLED = BIT(6), | 317 | IEEE80211_STA_MFP_ENABLED = BIT(6), |
| 267 | }; | 318 | IEEE80211_STA_UAPSD_ENABLED = BIT(7), |
| 268 | 319 | IEEE80211_STA_NULLFUNC_ACKED = BIT(8), | |
| 269 | /* flags for MLME request */ | ||
| 270 | enum ieee80211_sta_request { | ||
| 271 | IEEE80211_STA_REQ_SCAN, | ||
| 272 | }; | 320 | }; |
| 273 | 321 | ||
| 274 | struct ieee80211_if_managed { | 322 | struct ieee80211_if_managed { |
| @@ -285,21 +333,18 @@ struct ieee80211_if_managed { | |||
| 285 | int probe_send_count; | 333 | int probe_send_count; |
| 286 | 334 | ||
| 287 | struct mutex mtx; | 335 | struct mutex mtx; |
| 288 | struct ieee80211_bss *associated; | 336 | struct cfg80211_bss *associated; |
| 289 | struct ieee80211_mgd_work *old_associate_work; | ||
| 290 | struct list_head work_list; | ||
| 291 | 337 | ||
| 292 | u8 bssid[ETH_ALEN]; | 338 | u8 bssid[ETH_ALEN]; |
| 293 | 339 | ||
| 294 | u16 aid; | 340 | u16 aid; |
| 295 | u16 capab; | ||
| 296 | 341 | ||
| 297 | struct sk_buff_head skb_queue; | 342 | struct sk_buff_head skb_queue; |
| 298 | 343 | ||
| 299 | unsigned long timers_running; /* used for quiesce/restart */ | 344 | unsigned long timers_running; /* used for quiesce/restart */ |
| 300 | bool powersave; /* powersave requested for this iface */ | 345 | bool powersave; /* powersave requested for this iface */ |
| 301 | 346 | enum ieee80211_smps_mode req_smps, /* requested smps mode */ | |
| 302 | unsigned long request; | 347 | ap_smps; /* smps mode AP thinks we're in */ |
| 303 | 348 | ||
| 304 | unsigned int flags; | 349 | unsigned int flags; |
| 305 | 350 | ||
| @@ -312,6 +357,8 @@ struct ieee80211_if_managed { | |||
| 312 | } mfp; /* management frame protection */ | 357 | } mfp; /* management frame protection */ |
| 313 | 358 | ||
| 314 | int wmm_last_param_set; | 359 | int wmm_last_param_set; |
| 360 | |||
| 361 | u8 use_4addr; | ||
| 315 | }; | 362 | }; |
| 316 | 363 | ||
| 317 | enum ieee80211_ibss_request { | 364 | enum ieee80211_ibss_request { |
| @@ -353,6 +400,7 @@ struct ieee80211_if_mesh { | |||
| 353 | struct work_struct work; | 400 | struct work_struct work; |
| 354 | struct timer_list housekeeping_timer; | 401 | struct timer_list housekeeping_timer; |
| 355 | struct timer_list mesh_path_timer; | 402 | struct timer_list mesh_path_timer; |
| 403 | struct timer_list mesh_path_root_timer; | ||
| 356 | struct sk_buff_head skb_queue; | 404 | struct sk_buff_head skb_queue; |
| 357 | 405 | ||
| 358 | unsigned long timers_running; | 406 | unsigned long timers_running; |
| @@ -362,23 +410,23 @@ struct ieee80211_if_mesh { | |||
| 362 | u8 mesh_id[IEEE80211_MAX_MESH_ID_LEN]; | 410 | u8 mesh_id[IEEE80211_MAX_MESH_ID_LEN]; |
| 363 | size_t mesh_id_len; | 411 | size_t mesh_id_len; |
| 364 | /* Active Path Selection Protocol Identifier */ | 412 | /* Active Path Selection Protocol Identifier */ |
| 365 | u8 mesh_pp_id[4]; | 413 | u8 mesh_pp_id; |
| 366 | /* Active Path Selection Metric Identifier */ | 414 | /* Active Path Selection Metric Identifier */ |
| 367 | u8 mesh_pm_id[4]; | 415 | u8 mesh_pm_id; |
| 368 | /* Congestion Control Mode Identifier */ | 416 | /* Congestion Control Mode Identifier */ |
| 369 | u8 mesh_cc_id[4]; | 417 | u8 mesh_cc_id; |
| 370 | /* Synchronization Protocol Identifier */ | 418 | /* Synchronization Protocol Identifier */ |
| 371 | u8 mesh_sp_id[4]; | 419 | u8 mesh_sp_id; |
| 372 | /* Authentication Protocol Identifier */ | 420 | /* Authentication Protocol Identifier */ |
| 373 | u8 mesh_auth_id[4]; | 421 | u8 mesh_auth_id; |
| 374 | /* Local mesh Destination Sequence Number */ | 422 | /* Local mesh Sequence Number */ |
| 375 | u32 dsn; | 423 | u32 sn; |
| 376 | /* Last used PREQ ID */ | 424 | /* Last used PREQ ID */ |
| 377 | u32 preq_id; | 425 | u32 preq_id; |
| 378 | atomic_t mpaths; | 426 | atomic_t mpaths; |
| 379 | /* Timestamp of last DSN update */ | 427 | /* Timestamp of last SN update */ |
| 380 | unsigned long last_dsn_update; | 428 | unsigned long last_sn_update; |
| 381 | /* Timestamp of last DSN sent */ | 429 | /* Timestamp of last SN sent */ |
| 382 | unsigned long last_preq; | 430 | unsigned long last_preq; |
| 383 | struct mesh_rmc *rmc; | 431 | struct mesh_rmc *rmc; |
| 384 | spinlock_t mesh_preq_queue_lock; | 432 | spinlock_t mesh_preq_queue_lock; |
| @@ -430,6 +478,8 @@ struct ieee80211_sub_if_data { | |||
| 430 | 478 | ||
| 431 | int drop_unencrypted; | 479 | int drop_unencrypted; |
| 432 | 480 | ||
| 481 | char name[IFNAMSIZ]; | ||
| 482 | |||
| 433 | /* | 483 | /* |
| 434 | * keep track of whether the HT opmode (stored in | 484 | * keep track of whether the HT opmode (stored in |
| 435 | * vif.bss_info.ht_operation_mode) is valid. | 485 | * vif.bss_info.ht_operation_mode) is valid. |
| @@ -455,8 +505,8 @@ struct ieee80211_sub_if_data { | |||
| 455 | */ | 505 | */ |
| 456 | struct ieee80211_if_ap *bss; | 506 | struct ieee80211_if_ap *bss; |
| 457 | 507 | ||
| 458 | int force_unicast_rateidx; /* forced TX rateidx for unicast frames */ | 508 | /* bitmap of allowed (non-MCS) rate indexes for rate control */ |
| 459 | int max_ratectrl_rateidx; /* max TX rateidx for rate control */ | 509 | u32 rc_rateidx_mask[IEEE80211_NUM_BANDS]; |
| 460 | 510 | ||
| 461 | union { | 511 | union { |
| 462 | struct ieee80211_if_ap ap; | 512 | struct ieee80211_if_ap ap; |
| @@ -471,74 +521,11 @@ struct ieee80211_sub_if_data { | |||
| 471 | } u; | 521 | } u; |
| 472 | 522 | ||
| 473 | #ifdef CONFIG_MAC80211_DEBUGFS | 523 | #ifdef CONFIG_MAC80211_DEBUGFS |
| 474 | struct dentry *debugfsdir; | ||
| 475 | union { | ||
| 476 | struct { | ||
| 477 | struct dentry *drop_unencrypted; | ||
| 478 | struct dentry *bssid; | ||
| 479 | struct dentry *aid; | ||
| 480 | struct dentry *capab; | ||
| 481 | struct dentry *force_unicast_rateidx; | ||
| 482 | struct dentry *max_ratectrl_rateidx; | ||
| 483 | } sta; | ||
| 484 | struct { | ||
| 485 | struct dentry *drop_unencrypted; | ||
| 486 | struct dentry *num_sta_ps; | ||
| 487 | struct dentry *dtim_count; | ||
| 488 | struct dentry *force_unicast_rateidx; | ||
| 489 | struct dentry *max_ratectrl_rateidx; | ||
| 490 | struct dentry *num_buffered_multicast; | ||
| 491 | } ap; | ||
| 492 | struct { | ||
| 493 | struct dentry *drop_unencrypted; | ||
| 494 | struct dentry *peer; | ||
| 495 | struct dentry *force_unicast_rateidx; | ||
| 496 | struct dentry *max_ratectrl_rateidx; | ||
| 497 | } wds; | ||
| 498 | struct { | ||
| 499 | struct dentry *drop_unencrypted; | ||
| 500 | struct dentry *force_unicast_rateidx; | ||
| 501 | struct dentry *max_ratectrl_rateidx; | ||
| 502 | } vlan; | ||
| 503 | struct { | ||
| 504 | struct dentry *mode; | ||
| 505 | } monitor; | ||
| 506 | } debugfs; | ||
| 507 | struct { | 524 | struct { |
| 525 | struct dentry *dir; | ||
| 508 | struct dentry *default_key; | 526 | struct dentry *default_key; |
| 509 | struct dentry *default_mgmt_key; | 527 | struct dentry *default_mgmt_key; |
| 510 | } common_debugfs; | 528 | } debugfs; |
| 511 | |||
| 512 | #ifdef CONFIG_MAC80211_MESH | ||
| 513 | struct dentry *mesh_stats_dir; | ||
| 514 | struct { | ||
| 515 | struct dentry *fwded_mcast; | ||
| 516 | struct dentry *fwded_unicast; | ||
| 517 | struct dentry *fwded_frames; | ||
| 518 | struct dentry *dropped_frames_ttl; | ||
| 519 | struct dentry *dropped_frames_no_route; | ||
| 520 | struct dentry *estab_plinks; | ||
| 521 | struct timer_list mesh_path_timer; | ||
| 522 | } mesh_stats; | ||
| 523 | |||
| 524 | struct dentry *mesh_config_dir; | ||
| 525 | struct { | ||
| 526 | struct dentry *dot11MeshRetryTimeout; | ||
| 527 | struct dentry *dot11MeshConfirmTimeout; | ||
| 528 | struct dentry *dot11MeshHoldingTimeout; | ||
| 529 | struct dentry *dot11MeshMaxRetries; | ||
| 530 | struct dentry *dot11MeshTTL; | ||
| 531 | struct dentry *auto_open_plinks; | ||
| 532 | struct dentry *dot11MeshMaxPeerLinks; | ||
| 533 | struct dentry *dot11MeshHWMPactivePathTimeout; | ||
| 534 | struct dentry *dot11MeshHWMPpreqMinInterval; | ||
| 535 | struct dentry *dot11MeshHWMPnetDiameterTraversalTime; | ||
| 536 | struct dentry *dot11MeshHWMPmaxPREQretries; | ||
| 537 | struct dentry *path_refresh_time; | ||
| 538 | struct dentry *min_discovery_timeout; | ||
| 539 | } mesh_config; | ||
| 540 | #endif | ||
| 541 | |||
| 542 | #endif | 529 | #endif |
| 543 | /* must be last, dynamically sized area in this! */ | 530 | /* must be last, dynamically sized area in this! */ |
| 544 | struct ieee80211_vif vif; | 531 | struct ieee80211_vif vif; |
| @@ -625,6 +612,15 @@ struct ieee80211_local { | |||
| 625 | const struct ieee80211_ops *ops; | 612 | const struct ieee80211_ops *ops; |
| 626 | 613 | ||
| 627 | /* | 614 | /* |
| 615 | * work stuff, potentially off-channel (in the future) | ||
| 616 | */ | ||
| 617 | struct mutex work_mtx; | ||
| 618 | struct list_head work_list; | ||
| 619 | struct timer_list work_timer; | ||
| 620 | struct work_struct work_work; | ||
| 621 | struct sk_buff_head work_skb_queue; | ||
| 622 | |||
| 623 | /* | ||
| 628 | * private workqueue to mac80211. mac80211 makes this accessible | 624 | * private workqueue to mac80211. mac80211 makes this accessible |
| 629 | * via ieee80211_queue_work() | 625 | * via ieee80211_queue_work() |
| 630 | */ | 626 | */ |
| @@ -639,7 +635,6 @@ struct ieee80211_local { | |||
| 639 | /* number of interfaces with corresponding FIF_ flags */ | 635 | /* number of interfaces with corresponding FIF_ flags */ |
| 640 | int fif_fcsfail, fif_plcpfail, fif_control, fif_other_bss, fif_pspoll; | 636 | int fif_fcsfail, fif_plcpfail, fif_control, fif_other_bss, fif_pspoll; |
| 641 | unsigned int filter_flags; /* FIF_* */ | 637 | unsigned int filter_flags; /* FIF_* */ |
| 642 | struct iw_statistics wstats; | ||
| 643 | 638 | ||
| 644 | /* protects the aggregated multicast list and filter calls */ | 639 | /* protects the aggregated multicast list and filter calls */ |
| 645 | spinlock_t filter_lock; | 640 | spinlock_t filter_lock; |
| @@ -647,6 +642,9 @@ struct ieee80211_local { | |||
| 647 | /* used for uploading changed mc list */ | 642 | /* used for uploading changed mc list */ |
| 648 | struct work_struct reconfig_filter; | 643 | struct work_struct reconfig_filter; |
| 649 | 644 | ||
| 645 | /* used to reconfigure hardware SM PS */ | ||
| 646 | struct work_struct recalc_smps; | ||
| 647 | |||
| 650 | /* aggregated multicast list */ | 648 | /* aggregated multicast list */ |
| 651 | struct dev_addr_list *mc_list; | 649 | struct dev_addr_list *mc_list; |
| 652 | int mc_count; | 650 | int mc_count; |
| @@ -691,15 +689,18 @@ struct ieee80211_local { | |||
| 691 | 689 | ||
| 692 | /* Station data */ | 690 | /* Station data */ |
| 693 | /* | 691 | /* |
| 694 | * The lock only protects the list, hash, timer and counter | 692 | * The mutex only protects the list and counter, |
| 695 | * against manipulation, reads are done in RCU. Additionally, | 693 | * reads are done in RCU. |
| 696 | * the lock protects each BSS's TIM bitmap. | 694 | * Additionally, the lock protects the hash table, |
| 695 | * the pending list and each BSS's TIM bitmap. | ||
| 697 | */ | 696 | */ |
| 697 | struct mutex sta_mtx; | ||
| 698 | spinlock_t sta_lock; | 698 | spinlock_t sta_lock; |
| 699 | unsigned long num_sta; | 699 | unsigned long num_sta; |
| 700 | struct list_head sta_list; | 700 | struct list_head sta_list, sta_pending_list; |
| 701 | struct sta_info *sta_hash[STA_HASH_SIZE]; | 701 | struct sta_info *sta_hash[STA_HASH_SIZE]; |
| 702 | struct timer_list sta_cleanup; | 702 | struct timer_list sta_cleanup; |
| 703 | struct work_struct sta_finish_work; | ||
| 703 | int sta_generation; | 704 | int sta_generation; |
| 704 | 705 | ||
| 705 | struct sk_buff_head pending[IEEE80211_MAX_QUEUES]; | 706 | struct sk_buff_head pending[IEEE80211_MAX_QUEUES]; |
| @@ -738,10 +739,9 @@ struct ieee80211_local { | |||
| 738 | unsigned long scanning; | 739 | unsigned long scanning; |
| 739 | struct cfg80211_ssid scan_ssid; | 740 | struct cfg80211_ssid scan_ssid; |
| 740 | struct cfg80211_scan_request *int_scan_req; | 741 | struct cfg80211_scan_request *int_scan_req; |
| 741 | struct cfg80211_scan_request *scan_req; | 742 | struct cfg80211_scan_request *scan_req, *hw_scan_req; |
| 742 | struct ieee80211_channel *scan_channel; | 743 | struct ieee80211_channel *scan_channel; |
| 743 | const u8 *orig_ies; | 744 | enum ieee80211_band hw_scan_band; |
| 744 | int orig_ies_len; | ||
| 745 | int scan_channel_idx; | 745 | int scan_channel_idx; |
| 746 | int scan_ies_len; | 746 | int scan_ies_len; |
| 747 | 747 | ||
| @@ -751,6 +751,10 @@ struct ieee80211_local { | |||
| 751 | enum nl80211_channel_type oper_channel_type; | 751 | enum nl80211_channel_type oper_channel_type; |
| 752 | struct ieee80211_channel *oper_channel, *csa_channel; | 752 | struct ieee80211_channel *oper_channel, *csa_channel; |
| 753 | 753 | ||
| 754 | /* Temporary remain-on-channel for off-channel operations */ | ||
| 755 | struct ieee80211_channel *tmp_channel; | ||
| 756 | enum nl80211_channel_type tmp_channel_type; | ||
| 757 | |||
| 754 | /* SNMP counters */ | 758 | /* SNMP counters */ |
| 755 | /* dot11CountersTable */ | 759 | /* dot11CountersTable */ |
| 756 | u32 dot11TransmittedFragmentCount; | 760 | u32 dot11TransmittedFragmentCount; |
| @@ -770,10 +774,6 @@ struct ieee80211_local { | |||
| 770 | assoc_led_name[32], radio_led_name[32]; | 774 | assoc_led_name[32], radio_led_name[32]; |
| 771 | #endif | 775 | #endif |
| 772 | 776 | ||
| 773 | #ifdef CONFIG_MAC80211_DEBUGFS | ||
| 774 | struct work_struct sta_debugfs_add; | ||
| 775 | #endif | ||
| 776 | |||
| 777 | #ifdef CONFIG_MAC80211_DEBUG_COUNTERS | 777 | #ifdef CONFIG_MAC80211_DEBUG_COUNTERS |
| 778 | /* TX/RX handler statistics */ | 778 | /* TX/RX handler statistics */ |
| 779 | unsigned int tx_handlers_drop; | 779 | unsigned int tx_handlers_drop; |
| @@ -807,7 +807,22 @@ struct ieee80211_local { | |||
| 807 | int wifi_wme_noack_test; | 807 | int wifi_wme_noack_test; |
| 808 | unsigned int wmm_acm; /* bit field of ACM bits (BIT(802.1D tag)) */ | 808 | unsigned int wmm_acm; /* bit field of ACM bits (BIT(802.1D tag)) */ |
| 809 | 809 | ||
| 810 | /* | ||
| 811 | * Bitmask of enabled u-apsd queues, | ||
| 812 | * IEEE80211_WMM_IE_STA_QOSINFO_AC_BE & co. Needs a new association | ||
| 813 | * to take effect. | ||
| 814 | */ | ||
| 815 | unsigned int uapsd_queues; | ||
| 816 | |||
| 817 | /* | ||
| 818 | * Maximum number of buffered frames AP can deliver during a | ||
| 819 | * service period, IEEE80211_WMM_IE_STA_QOSINFO_SP_ALL or similar. | ||
| 820 | * Needs a new association to take effect. | ||
| 821 | */ | ||
| 822 | unsigned int uapsd_max_sp_len; | ||
| 823 | |||
| 810 | bool pspolling; | 824 | bool pspolling; |
| 825 | bool offchannel_ps_enabled; | ||
| 811 | /* | 826 | /* |
| 812 | * PS can only be enabled when we have exactly one managed | 827 | * PS can only be enabled when we have exactly one managed |
| 813 | * interface (and monitors) in PS, this then points there. | 828 | * interface (and monitors) in PS, this then points there. |
| @@ -821,58 +836,13 @@ struct ieee80211_local { | |||
| 821 | int user_power_level; /* in dBm */ | 836 | int user_power_level; /* in dBm */ |
| 822 | int power_constr_level; /* in dBm */ | 837 | int power_constr_level; /* in dBm */ |
| 823 | 838 | ||
| 839 | enum ieee80211_smps_mode smps_mode; | ||
| 840 | |||
| 824 | struct work_struct restart_work; | 841 | struct work_struct restart_work; |
| 825 | 842 | ||
| 826 | #ifdef CONFIG_MAC80211_DEBUGFS | 843 | #ifdef CONFIG_MAC80211_DEBUGFS |
| 827 | struct local_debugfsdentries { | 844 | struct local_debugfsdentries { |
| 828 | struct dentry *rcdir; | 845 | struct dentry *rcdir; |
| 829 | struct dentry *rcname; | ||
| 830 | struct dentry *frequency; | ||
| 831 | struct dentry *total_ps_buffered; | ||
| 832 | struct dentry *wep_iv; | ||
| 833 | struct dentry *tsf; | ||
| 834 | struct dentry *queues; | ||
| 835 | struct dentry *reset; | ||
| 836 | struct dentry *noack; | ||
| 837 | struct dentry *statistics; | ||
| 838 | struct local_debugfsdentries_statsdentries { | ||
| 839 | struct dentry *transmitted_fragment_count; | ||
| 840 | struct dentry *multicast_transmitted_frame_count; | ||
| 841 | struct dentry *failed_count; | ||
| 842 | struct dentry *retry_count; | ||
| 843 | struct dentry *multiple_retry_count; | ||
| 844 | struct dentry *frame_duplicate_count; | ||
| 845 | struct dentry *received_fragment_count; | ||
| 846 | struct dentry *multicast_received_frame_count; | ||
| 847 | struct dentry *transmitted_frame_count; | ||
| 848 | struct dentry *wep_undecryptable_count; | ||
| 849 | struct dentry *num_scans; | ||
| 850 | #ifdef CONFIG_MAC80211_DEBUG_COUNTERS | ||
| 851 | struct dentry *tx_handlers_drop; | ||
| 852 | struct dentry *tx_handlers_queued; | ||
| 853 | struct dentry *tx_handlers_drop_unencrypted; | ||
| 854 | struct dentry *tx_handlers_drop_fragment; | ||
| 855 | struct dentry *tx_handlers_drop_wep; | ||
| 856 | struct dentry *tx_handlers_drop_not_assoc; | ||
| 857 | struct dentry *tx_handlers_drop_unauth_port; | ||
| 858 | struct dentry *rx_handlers_drop; | ||
| 859 | struct dentry *rx_handlers_queued; | ||
| 860 | struct dentry *rx_handlers_drop_nullfunc; | ||
| 861 | struct dentry *rx_handlers_drop_defrag; | ||
| 862 | struct dentry *rx_handlers_drop_short; | ||
| 863 | struct dentry *rx_handlers_drop_passive_scan; | ||
| 864 | struct dentry *tx_expand_skb_head; | ||
| 865 | struct dentry *tx_expand_skb_head_cloned; | ||
| 866 | struct dentry *rx_expand_skb_head; | ||
| 867 | struct dentry *rx_expand_skb_head2; | ||
| 868 | struct dentry *rx_handlers_fragments; | ||
| 869 | struct dentry *tx_status_drop; | ||
| 870 | #endif | ||
| 871 | struct dentry *dot11ACKFailureCount; | ||
| 872 | struct dentry *dot11RTSFailureCount; | ||
| 873 | struct dentry *dot11FCSErrorCount; | ||
| 874 | struct dentry *dot11RTSSuccessCount; | ||
| 875 | } stats; | ||
| 876 | struct dentry *stations; | 846 | struct dentry *stations; |
| 877 | struct dentry *keys; | 847 | struct dentry *keys; |
| 878 | } debugfs; | 848 | } debugfs; |
| @@ -885,8 +855,9 @@ IEEE80211_DEV_TO_SUB_IF(struct net_device *dev) | |||
| 885 | return netdev_priv(dev); | 855 | return netdev_priv(dev); |
| 886 | } | 856 | } |
| 887 | 857 | ||
| 888 | /* this struct represents 802.11n's RA/TID combination */ | 858 | /* this struct represents 802.11n's RA/TID combination along with our vif */ |
| 889 | struct ieee80211_ra_tid { | 859 | struct ieee80211_ra_tid { |
| 860 | struct ieee80211_vif *vif; | ||
| 890 | u8 ra[ETH_ALEN]; | 861 | u8 ra[ETH_ALEN]; |
| 891 | u16 tid; | 862 | u16 tid; |
| 892 | }; | 863 | }; |
| @@ -913,12 +884,13 @@ struct ieee802_11_elems { | |||
| 913 | u8 *wmm_param; | 884 | u8 *wmm_param; |
| 914 | struct ieee80211_ht_cap *ht_cap_elem; | 885 | struct ieee80211_ht_cap *ht_cap_elem; |
| 915 | struct ieee80211_ht_info *ht_info_elem; | 886 | struct ieee80211_ht_info *ht_info_elem; |
| 916 | u8 *mesh_config; | 887 | struct ieee80211_meshconf_ie *mesh_config; |
| 917 | u8 *mesh_id; | 888 | u8 *mesh_id; |
| 918 | u8 *peer_link; | 889 | u8 *peer_link; |
| 919 | u8 *preq; | 890 | u8 *preq; |
| 920 | u8 *prep; | 891 | u8 *prep; |
| 921 | u8 *perr; | 892 | u8 *perr; |
| 893 | struct ieee80211_rann_ie *rann; | ||
| 922 | u8 *ch_switch_elem; | 894 | u8 *ch_switch_elem; |
| 923 | u8 *country_elem; | 895 | u8 *country_elem; |
| 924 | u8 *pwr_constr_elem; | 896 | u8 *pwr_constr_elem; |
| @@ -940,7 +912,6 @@ struct ieee802_11_elems { | |||
| 940 | u8 ext_supp_rates_len; | 912 | u8 ext_supp_rates_len; |
| 941 | u8 wmm_info_len; | 913 | u8 wmm_info_len; |
| 942 | u8 wmm_param_len; | 914 | u8 wmm_param_len; |
| 943 | u8 mesh_config_len; | ||
| 944 | u8 mesh_id_len; | 915 | u8 mesh_id_len; |
| 945 | u8 peer_link_len; | 916 | u8 peer_link_len; |
| 946 | u8 preq_len; | 917 | u8 preq_len; |
| @@ -981,6 +952,8 @@ void ieee80211_bss_info_change_notify(struct ieee80211_sub_if_data *sdata, | |||
| 981 | void ieee80211_configure_filter(struct ieee80211_local *local); | 952 | void ieee80211_configure_filter(struct ieee80211_local *local); |
| 982 | u32 ieee80211_reset_erp_info(struct ieee80211_sub_if_data *sdata); | 953 | u32 ieee80211_reset_erp_info(struct ieee80211_sub_if_data *sdata); |
| 983 | 954 | ||
| 955 | extern bool ieee80211_disable_40mhz_24ghz; | ||
| 956 | |||
| 984 | /* STA code */ | 957 | /* STA code */ |
| 985 | void ieee80211_sta_setup_sdata(struct ieee80211_sub_if_data *sdata); | 958 | void ieee80211_sta_setup_sdata(struct ieee80211_sub_if_data *sdata); |
| 986 | int ieee80211_mgd_auth(struct ieee80211_sub_if_data *sdata, | 959 | int ieee80211_mgd_auth(struct ieee80211_sub_if_data *sdata, |
| @@ -993,6 +966,10 @@ int ieee80211_mgd_deauth(struct ieee80211_sub_if_data *sdata, | |||
| 993 | int ieee80211_mgd_disassoc(struct ieee80211_sub_if_data *sdata, | 966 | int ieee80211_mgd_disassoc(struct ieee80211_sub_if_data *sdata, |
| 994 | struct cfg80211_disassoc_request *req, | 967 | struct cfg80211_disassoc_request *req, |
| 995 | void *cookie); | 968 | void *cookie); |
| 969 | int ieee80211_mgd_action(struct ieee80211_sub_if_data *sdata, | ||
| 970 | struct ieee80211_channel *chan, | ||
| 971 | enum nl80211_channel_type channel_type, | ||
| 972 | const u8 *buf, size_t len, u64 *cookie); | ||
| 996 | ieee80211_rx_result ieee80211_sta_rx_mgmt(struct ieee80211_sub_if_data *sdata, | 973 | ieee80211_rx_result ieee80211_sta_rx_mgmt(struct ieee80211_sub_if_data *sdata, |
| 997 | struct sk_buff *skb); | 974 | struct sk_buff *skb); |
| 998 | void ieee80211_send_pspoll(struct ieee80211_local *local, | 975 | void ieee80211_send_pspoll(struct ieee80211_local *local, |
| @@ -1012,7 +989,8 @@ void ieee80211_ibss_setup_sdata(struct ieee80211_sub_if_data *sdata); | |||
| 1012 | ieee80211_rx_result | 989 | ieee80211_rx_result |
| 1013 | ieee80211_ibss_rx_mgmt(struct ieee80211_sub_if_data *sdata, struct sk_buff *skb); | 990 | ieee80211_ibss_rx_mgmt(struct ieee80211_sub_if_data *sdata, struct sk_buff *skb); |
| 1014 | struct sta_info *ieee80211_ibss_add_sta(struct ieee80211_sub_if_data *sdata, | 991 | struct sta_info *ieee80211_ibss_add_sta(struct ieee80211_sub_if_data *sdata, |
| 1015 | u8 *bssid, u8 *addr, u32 supp_rates); | 992 | u8 *bssid, u8 *addr, u32 supp_rates, |
| 993 | gfp_t gfp); | ||
| 1016 | int ieee80211_ibss_join(struct ieee80211_sub_if_data *sdata, | 994 | int ieee80211_ibss_join(struct ieee80211_sub_if_data *sdata, |
| 1017 | struct cfg80211_ibss_params *params); | 995 | struct cfg80211_ibss_params *params); |
| 1018 | int ieee80211_ibss_leave(struct ieee80211_sub_if_data *sdata); | 996 | int ieee80211_ibss_leave(struct ieee80211_sub_if_data *sdata); |
| @@ -1044,7 +1022,15 @@ ieee80211_rx_bss_get(struct ieee80211_local *local, u8 *bssid, int freq, | |||
| 1044 | void ieee80211_rx_bss_put(struct ieee80211_local *local, | 1022 | void ieee80211_rx_bss_put(struct ieee80211_local *local, |
| 1045 | struct ieee80211_bss *bss); | 1023 | struct ieee80211_bss *bss); |
| 1046 | 1024 | ||
| 1025 | /* off-channel helpers */ | ||
| 1026 | void ieee80211_offchannel_stop_beaconing(struct ieee80211_local *local); | ||
| 1027 | void ieee80211_offchannel_stop_station(struct ieee80211_local *local); | ||
| 1028 | void ieee80211_offchannel_return(struct ieee80211_local *local, | ||
| 1029 | bool enable_beaconing); | ||
| 1030 | |||
| 1047 | /* interface handling */ | 1031 | /* interface handling */ |
| 1032 | int ieee80211_iface_init(void); | ||
| 1033 | void ieee80211_iface_exit(void); | ||
| 1048 | int ieee80211_if_add(struct ieee80211_local *local, const char *name, | 1034 | int ieee80211_if_add(struct ieee80211_local *local, const char *name, |
| 1049 | struct net_device **new_dev, enum nl80211_iftype type, | 1035 | struct net_device **new_dev, enum nl80211_iftype type, |
| 1050 | struct vif_params *params); | 1036 | struct vif_params *params); |
| @@ -1055,6 +1041,11 @@ void ieee80211_remove_interfaces(struct ieee80211_local *local); | |||
| 1055 | u32 __ieee80211_recalc_idle(struct ieee80211_local *local); | 1041 | u32 __ieee80211_recalc_idle(struct ieee80211_local *local); |
| 1056 | void ieee80211_recalc_idle(struct ieee80211_local *local); | 1042 | void ieee80211_recalc_idle(struct ieee80211_local *local); |
| 1057 | 1043 | ||
| 1044 | static inline bool ieee80211_sdata_running(struct ieee80211_sub_if_data *sdata) | ||
| 1045 | { | ||
| 1046 | return netif_running(sdata->dev); | ||
| 1047 | } | ||
| 1048 | |||
| 1058 | /* tx handling */ | 1049 | /* tx handling */ |
| 1059 | void ieee80211_clear_tx_pending(struct ieee80211_local *local); | 1050 | void ieee80211_clear_tx_pending(struct ieee80211_local *local); |
| 1060 | void ieee80211_tx_pending(unsigned long data); | 1051 | void ieee80211_tx_pending(unsigned long data); |
| @@ -1063,6 +1054,18 @@ netdev_tx_t ieee80211_monitor_start_xmit(struct sk_buff *skb, | |||
| 1063 | netdev_tx_t ieee80211_subif_start_xmit(struct sk_buff *skb, | 1054 | netdev_tx_t ieee80211_subif_start_xmit(struct sk_buff *skb, |
| 1064 | struct net_device *dev); | 1055 | struct net_device *dev); |
| 1065 | 1056 | ||
| 1057 | /* | ||
| 1058 | * radiotap header for status frames | ||
| 1059 | */ | ||
| 1060 | struct ieee80211_tx_status_rtap_hdr { | ||
| 1061 | struct ieee80211_radiotap_header hdr; | ||
| 1062 | u8 rate; | ||
| 1063 | u8 padding_for_rate; | ||
| 1064 | __le16 tx_flags; | ||
| 1065 | u8 data_retries; | ||
| 1066 | } __attribute__ ((packed)); | ||
| 1067 | |||
| 1068 | |||
| 1066 | /* HT */ | 1069 | /* HT */ |
| 1067 | void ieee80211_ht_cap_ie_to_sta_ht_cap(struct ieee80211_supported_band *sband, | 1070 | void ieee80211_ht_cap_ie_to_sta_ht_cap(struct ieee80211_supported_band *sband, |
| 1068 | struct ieee80211_ht_cap *ht_cap_ie, | 1071 | struct ieee80211_ht_cap *ht_cap_ie, |
| @@ -1071,6 +1074,9 @@ void ieee80211_send_bar(struct ieee80211_sub_if_data *sdata, u8 *ra, u16 tid, u1 | |||
| 1071 | void ieee80211_send_delba(struct ieee80211_sub_if_data *sdata, | 1074 | void ieee80211_send_delba(struct ieee80211_sub_if_data *sdata, |
| 1072 | const u8 *da, u16 tid, | 1075 | const u8 *da, u16 tid, |
| 1073 | u16 initiator, u16 reason_code); | 1076 | u16 initiator, u16 reason_code); |
| 1077 | int ieee80211_send_smps_action(struct ieee80211_sub_if_data *sdata, | ||
| 1078 | enum ieee80211_smps_mode smps, const u8 *da, | ||
| 1079 | const u8 *bssid); | ||
| 1074 | 1080 | ||
| 1075 | void ieee80211_sta_stop_rx_ba_session(struct ieee80211_sub_if_data *sdata, u8 *da, | 1081 | void ieee80211_sta_stop_rx_ba_session(struct ieee80211_sub_if_data *sdata, u8 *da, |
| 1076 | u16 tid, u16 initiator, u16 reason); | 1082 | u16 tid, u16 initiator, u16 reason); |
| @@ -1132,8 +1138,7 @@ void mac80211_ev_michael_mic_failure(struct ieee80211_sub_if_data *sdata, int ke | |||
| 1132 | struct ieee80211_hdr *hdr, const u8 *tsc, | 1138 | struct ieee80211_hdr *hdr, const u8 *tsc, |
| 1133 | gfp_t gfp); | 1139 | gfp_t gfp); |
| 1134 | void ieee80211_set_wmm_default(struct ieee80211_sub_if_data *sdata); | 1140 | void ieee80211_set_wmm_default(struct ieee80211_sub_if_data *sdata); |
| 1135 | void ieee80211_tx_skb(struct ieee80211_sub_if_data *sdata, struct sk_buff *skb, | 1141 | void ieee80211_tx_skb(struct ieee80211_sub_if_data *sdata, struct sk_buff *skb); |
| 1136 | int encrypt); | ||
| 1137 | void ieee802_11_parse_elems(u8 *start, size_t len, | 1142 | void ieee802_11_parse_elems(u8 *start, size_t len, |
| 1138 | struct ieee802_11_elems *elems); | 1143 | struct ieee802_11_elems *elems); |
| 1139 | u32 ieee802_11_parse_elems_crc(u8 *start, size_t len, | 1144 | u32 ieee802_11_parse_elems_crc(u8 *start, size_t len, |
| @@ -1170,7 +1175,8 @@ void ieee80211_send_auth(struct ieee80211_sub_if_data *sdata, | |||
| 1170 | u8 *extra, size_t extra_len, const u8 *bssid, | 1175 | u8 *extra, size_t extra_len, const u8 *bssid, |
| 1171 | const u8 *key, u8 key_len, u8 key_idx); | 1176 | const u8 *key, u8 key_len, u8 key_idx); |
| 1172 | int ieee80211_build_preq_ies(struct ieee80211_local *local, u8 *buffer, | 1177 | int ieee80211_build_preq_ies(struct ieee80211_local *local, u8 *buffer, |
| 1173 | const u8 *ie, size_t ie_len); | 1178 | const u8 *ie, size_t ie_len, |
| 1179 | enum ieee80211_band band); | ||
| 1174 | void ieee80211_send_probe_req(struct ieee80211_sub_if_data *sdata, u8 *dst, | 1180 | void ieee80211_send_probe_req(struct ieee80211_sub_if_data *sdata, u8 *dst, |
| 1175 | const u8 *ssid, size_t ssid_len, | 1181 | const u8 *ssid, size_t ssid_len, |
| 1176 | const u8 *ie, size_t ie_len); | 1182 | const u8 *ie, size_t ie_len); |
| @@ -1181,6 +1187,28 @@ void ieee80211_sta_def_wmm_params(struct ieee80211_sub_if_data *sdata, | |||
| 1181 | u32 ieee80211_sta_get_rates(struct ieee80211_local *local, | 1187 | u32 ieee80211_sta_get_rates(struct ieee80211_local *local, |
| 1182 | struct ieee802_11_elems *elems, | 1188 | struct ieee802_11_elems *elems, |
| 1183 | enum ieee80211_band band); | 1189 | enum ieee80211_band band); |
| 1190 | int __ieee80211_request_smps(struct ieee80211_sub_if_data *sdata, | ||
| 1191 | enum ieee80211_smps_mode smps_mode); | ||
| 1192 | void ieee80211_recalc_smps(struct ieee80211_local *local, | ||
| 1193 | struct ieee80211_sub_if_data *forsdata); | ||
| 1194 | |||
| 1195 | size_t ieee80211_ie_split(const u8 *ies, size_t ielen, | ||
| 1196 | const u8 *ids, int n_ids, size_t offset); | ||
| 1197 | size_t ieee80211_ie_split_vendor(const u8 *ies, size_t ielen, size_t offset); | ||
| 1198 | |||
| 1199 | /* internal work items */ | ||
| 1200 | void ieee80211_work_init(struct ieee80211_local *local); | ||
| 1201 | void ieee80211_add_work(struct ieee80211_work *wk); | ||
| 1202 | void free_work(struct ieee80211_work *wk); | ||
| 1203 | void ieee80211_work_purge(struct ieee80211_sub_if_data *sdata); | ||
| 1204 | ieee80211_rx_result ieee80211_work_rx_mgmt(struct ieee80211_sub_if_data *sdata, | ||
| 1205 | struct sk_buff *skb); | ||
| 1206 | int ieee80211_wk_remain_on_channel(struct ieee80211_sub_if_data *sdata, | ||
| 1207 | struct ieee80211_channel *chan, | ||
| 1208 | enum nl80211_channel_type channel_type, | ||
| 1209 | unsigned int duration, u64 *cookie); | ||
| 1210 | int ieee80211_wk_cancel_remain_on_channel( | ||
| 1211 | struct ieee80211_sub_if_data *sdata, u64 cookie); | ||
| 1184 | 1212 | ||
| 1185 | #ifdef CONFIG_MAC80211_NOINLINE | 1213 | #ifdef CONFIG_MAC80211_NOINLINE |
| 1186 | #define debug_noinline noinline | 1214 | #define debug_noinline noinline |
