diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-05-21 00:04:44 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-05-21 00:04:44 -0400 |
commit | f8965467f366fd18f01feafb5db10512d7b4422c (patch) | |
tree | 3706a9cd779859271ca61b85c63a1bc3f82d626e /net/wireless | |
parent | a26272e5200765691e67d6780e52b32498fdb659 (diff) | |
parent | 2ec8c6bb5d8f3a62a79f463525054bae1e3d4487 (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next-2.6: (1674 commits)
qlcnic: adding co maintainer
ixgbe: add support for active DA cables
ixgbe: dcb, do not tag tc_prio_control frames
ixgbe: fix ixgbe_tx_is_paused logic
ixgbe: always enable vlan strip/insert when DCB is enabled
ixgbe: remove some redundant code in setting FCoE FIP filter
ixgbe: fix wrong offset to fc_frame_header in ixgbe_fcoe_ddp
ixgbe: fix header len when unsplit packet overflows to data buffer
ipv6: Never schedule DAD timer on dead address
ipv6: Use POSTDAD state
ipv6: Use state_lock to protect ifa state
ipv6: Replace inet6_ifaddr->dead with state
cxgb4: notify upper drivers if the device is already up when they load
cxgb4: keep interrupts available when the ports are brought down
cxgb4: fix initial addition of MAC address
cnic: Return SPQ credit to bnx2x after ring setup and shutdown.
cnic: Convert cnic_local_flags to atomic ops.
can: Fix SJA1000 command register writes on SMP systems
bridge: fix build for CONFIG_SYSFS disabled
ARCNET: Limit com20020 PCI ID matches for SOHARD cards
...
Fix up various conflicts with pcmcia tree drivers/net/
{pcmcia/3c589_cs.c, wireless/orinoco/orinoco_cs.c and
wireless/orinoco/spectrum_cs.c} and feature removal
(Documentation/feature-removal-schedule.txt).
Also fix a non-content conflict due to pm_qos_requirement getting
renamed in the PM tree (now pm_qos_request) in net/mac80211/scan.c
Diffstat (limited to 'net/wireless')
-rw-r--r-- | net/wireless/chan.c | 56 | ||||
-rw-r--r-- | net/wireless/core.c | 3 | ||||
-rw-r--r-- | net/wireless/core.h | 27 | ||||
-rw-r--r-- | net/wireless/ibss.c | 5 | ||||
-rw-r--r-- | net/wireless/mlme.c | 52 | ||||
-rw-r--r-- | net/wireless/nl80211.c | 328 | ||||
-rw-r--r-- | net/wireless/nl80211.h | 6 | ||||
-rw-r--r-- | net/wireless/reg.c | 6 | ||||
-rw-r--r-- | net/wireless/sme.c | 36 | ||||
-rw-r--r-- | net/wireless/util.c | 24 | ||||
-rw-r--r-- | net/wireless/wext-compat.c | 15 | ||||
-rw-r--r-- | net/wireless/wext-core.c | 134 | ||||
-rw-r--r-- | net/wireless/wext-sme.c | 2 |
13 files changed, 482 insertions, 212 deletions
diff --git a/net/wireless/chan.c b/net/wireless/chan.c index bf1737fc9a7e..d92d088026bf 100644 --- a/net/wireless/chan.c +++ b/net/wireless/chan.c | |||
@@ -10,38 +10,6 @@ | |||
10 | #include "core.h" | 10 | #include "core.h" |
11 | 11 | ||
12 | struct ieee80211_channel * | 12 | struct ieee80211_channel * |
13 | rdev_fixed_channel(struct cfg80211_registered_device *rdev, | ||
14 | struct wireless_dev *for_wdev) | ||
15 | { | ||
16 | struct wireless_dev *wdev; | ||
17 | struct ieee80211_channel *result = NULL; | ||
18 | |||
19 | WARN_ON(!mutex_is_locked(&rdev->devlist_mtx)); | ||
20 | |||
21 | list_for_each_entry(wdev, &rdev->netdev_list, list) { | ||
22 | if (wdev == for_wdev) | ||
23 | continue; | ||
24 | |||
25 | /* | ||
26 | * Lock manually to tell lockdep about allowed | ||
27 | * nesting here if for_wdev->mtx is held already. | ||
28 | * This is ok as it's all under the rdev devlist | ||
29 | * mutex and as such can only be done once at any | ||
30 | * given time. | ||
31 | */ | ||
32 | mutex_lock_nested(&wdev->mtx, SINGLE_DEPTH_NESTING); | ||
33 | if (wdev->current_bss) | ||
34 | result = wdev->current_bss->pub.channel; | ||
35 | wdev_unlock(wdev); | ||
36 | |||
37 | if (result) | ||
38 | break; | ||
39 | } | ||
40 | |||
41 | return result; | ||
42 | } | ||
43 | |||
44 | struct ieee80211_channel * | ||
45 | rdev_freq_to_chan(struct cfg80211_registered_device *rdev, | 13 | rdev_freq_to_chan(struct cfg80211_registered_device *rdev, |
46 | int freq, enum nl80211_channel_type channel_type) | 14 | int freq, enum nl80211_channel_type channel_type) |
47 | { | 15 | { |
@@ -75,15 +43,22 @@ rdev_freq_to_chan(struct cfg80211_registered_device *rdev, | |||
75 | return chan; | 43 | return chan; |
76 | } | 44 | } |
77 | 45 | ||
78 | int rdev_set_freq(struct cfg80211_registered_device *rdev, | 46 | int cfg80211_set_freq(struct cfg80211_registered_device *rdev, |
79 | struct wireless_dev *for_wdev, | 47 | struct wireless_dev *wdev, int freq, |
80 | int freq, enum nl80211_channel_type channel_type) | 48 | enum nl80211_channel_type channel_type) |
81 | { | 49 | { |
82 | struct ieee80211_channel *chan; | 50 | struct ieee80211_channel *chan; |
83 | int result; | 51 | int result; |
84 | 52 | ||
85 | if (rdev_fixed_channel(rdev, for_wdev)) | 53 | if (wdev->iftype == NL80211_IFTYPE_MONITOR) |
86 | return -EBUSY; | 54 | wdev = NULL; |
55 | |||
56 | if (wdev) { | ||
57 | ASSERT_WDEV_LOCK(wdev); | ||
58 | |||
59 | if (!netif_running(wdev->netdev)) | ||
60 | return -ENETDOWN; | ||
61 | } | ||
87 | 62 | ||
88 | if (!rdev->ops->set_channel) | 63 | if (!rdev->ops->set_channel) |
89 | return -EOPNOTSUPP; | 64 | return -EOPNOTSUPP; |
@@ -92,11 +67,14 @@ int rdev_set_freq(struct cfg80211_registered_device *rdev, | |||
92 | if (!chan) | 67 | if (!chan) |
93 | return -EINVAL; | 68 | return -EINVAL; |
94 | 69 | ||
95 | result = rdev->ops->set_channel(&rdev->wiphy, chan, channel_type); | 70 | result = rdev->ops->set_channel(&rdev->wiphy, |
71 | wdev ? wdev->netdev : NULL, | ||
72 | chan, channel_type); | ||
96 | if (result) | 73 | if (result) |
97 | return result; | 74 | return result; |
98 | 75 | ||
99 | rdev->channel = chan; | 76 | if (wdev) |
77 | wdev->channel = chan; | ||
100 | 78 | ||
101 | return 0; | 79 | return 0; |
102 | } | 80 | } |
diff --git a/net/wireless/core.c b/net/wireless/core.c index 6ac70c101523..37d0e0ab4432 100644 --- a/net/wireless/core.c +++ b/net/wireless/core.c | |||
@@ -705,7 +705,8 @@ static int cfg80211_netdev_notifier_call(struct notifier_block * nb, | |||
705 | wdev->ps = true; | 705 | wdev->ps = true; |
706 | else | 706 | else |
707 | wdev->ps = false; | 707 | wdev->ps = false; |
708 | wdev->ps_timeout = 100; | 708 | /* allow mac80211 to determine the timeout */ |
709 | wdev->ps_timeout = -1; | ||
709 | if (rdev->ops->set_power_mgmt) | 710 | if (rdev->ops->set_power_mgmt) |
710 | if (rdev->ops->set_power_mgmt(wdev->wiphy, dev, | 711 | if (rdev->ops->set_power_mgmt(wdev->wiphy, dev, |
711 | wdev->ps, | 712 | wdev->ps, |
diff --git a/net/wireless/core.h b/net/wireless/core.h index d52da913145a..ae930acf75e9 100644 --- a/net/wireless/core.h +++ b/net/wireless/core.h | |||
@@ -70,9 +70,6 @@ struct cfg80211_registered_device { | |||
70 | struct work_struct conn_work; | 70 | struct work_struct conn_work; |
71 | struct work_struct event_work; | 71 | struct work_struct event_work; |
72 | 72 | ||
73 | /* current channel */ | ||
74 | struct ieee80211_channel *channel; | ||
75 | |||
76 | /* must be last because of the way we do wiphy_priv(), | 73 | /* must be last because of the way we do wiphy_priv(), |
77 | * and it should at least be aligned to NETDEV_ALIGN */ | 74 | * and it should at least be aligned to NETDEV_ALIGN */ |
78 | struct wiphy wiphy __attribute__((__aligned__(NETDEV_ALIGN))); | 75 | struct wiphy wiphy __attribute__((__aligned__(NETDEV_ALIGN))); |
@@ -293,13 +290,15 @@ int __cfg80211_mlme_auth(struct cfg80211_registered_device *rdev, | |||
293 | const u8 *bssid, | 290 | const u8 *bssid, |
294 | const u8 *ssid, int ssid_len, | 291 | const u8 *ssid, int ssid_len, |
295 | const u8 *ie, int ie_len, | 292 | const u8 *ie, int ie_len, |
296 | const u8 *key, int key_len, int key_idx); | 293 | const u8 *key, int key_len, int key_idx, |
294 | bool local_state_change); | ||
297 | int cfg80211_mlme_auth(struct cfg80211_registered_device *rdev, | 295 | int cfg80211_mlme_auth(struct cfg80211_registered_device *rdev, |
298 | struct net_device *dev, struct ieee80211_channel *chan, | 296 | struct net_device *dev, struct ieee80211_channel *chan, |
299 | enum nl80211_auth_type auth_type, const u8 *bssid, | 297 | enum nl80211_auth_type auth_type, const u8 *bssid, |
300 | const u8 *ssid, int ssid_len, | 298 | const u8 *ssid, int ssid_len, |
301 | const u8 *ie, int ie_len, | 299 | const u8 *ie, int ie_len, |
302 | const u8 *key, int key_len, int key_idx); | 300 | const u8 *key, int key_len, int key_idx, |
301 | bool local_state_change); | ||
303 | int __cfg80211_mlme_assoc(struct cfg80211_registered_device *rdev, | 302 | int __cfg80211_mlme_assoc(struct cfg80211_registered_device *rdev, |
304 | struct net_device *dev, | 303 | struct net_device *dev, |
305 | struct ieee80211_channel *chan, | 304 | struct ieee80211_channel *chan, |
@@ -315,13 +314,16 @@ int cfg80211_mlme_assoc(struct cfg80211_registered_device *rdev, | |||
315 | struct cfg80211_crypto_settings *crypt); | 314 | struct cfg80211_crypto_settings *crypt); |
316 | int __cfg80211_mlme_deauth(struct cfg80211_registered_device *rdev, | 315 | int __cfg80211_mlme_deauth(struct cfg80211_registered_device *rdev, |
317 | struct net_device *dev, const u8 *bssid, | 316 | struct net_device *dev, const u8 *bssid, |
318 | const u8 *ie, int ie_len, u16 reason); | 317 | const u8 *ie, int ie_len, u16 reason, |
318 | bool local_state_change); | ||
319 | int cfg80211_mlme_deauth(struct cfg80211_registered_device *rdev, | 319 | int cfg80211_mlme_deauth(struct cfg80211_registered_device *rdev, |
320 | struct net_device *dev, const u8 *bssid, | 320 | struct net_device *dev, const u8 *bssid, |
321 | const u8 *ie, int ie_len, u16 reason); | 321 | const u8 *ie, int ie_len, u16 reason, |
322 | bool local_state_change); | ||
322 | int cfg80211_mlme_disassoc(struct cfg80211_registered_device *rdev, | 323 | int cfg80211_mlme_disassoc(struct cfg80211_registered_device *rdev, |
323 | struct net_device *dev, const u8 *bssid, | 324 | struct net_device *dev, const u8 *bssid, |
324 | const u8 *ie, int ie_len, u16 reason); | 325 | const u8 *ie, int ie_len, u16 reason, |
326 | bool local_state_change); | ||
325 | void cfg80211_mlme_down(struct cfg80211_registered_device *rdev, | 327 | void cfg80211_mlme_down(struct cfg80211_registered_device *rdev, |
326 | struct net_device *dev); | 328 | struct net_device *dev); |
327 | void __cfg80211_connect_result(struct net_device *dev, const u8 *bssid, | 329 | void __cfg80211_connect_result(struct net_device *dev, const u8 *bssid, |
@@ -383,14 +385,11 @@ int cfg80211_change_iface(struct cfg80211_registered_device *rdev, | |||
383 | void cfg80211_process_rdev_events(struct cfg80211_registered_device *rdev); | 385 | void cfg80211_process_rdev_events(struct cfg80211_registered_device *rdev); |
384 | 386 | ||
385 | struct ieee80211_channel * | 387 | struct ieee80211_channel * |
386 | rdev_fixed_channel(struct cfg80211_registered_device *rdev, | ||
387 | struct wireless_dev *for_wdev); | ||
388 | struct ieee80211_channel * | ||
389 | rdev_freq_to_chan(struct cfg80211_registered_device *rdev, | 388 | rdev_freq_to_chan(struct cfg80211_registered_device *rdev, |
390 | int freq, enum nl80211_channel_type channel_type); | 389 | int freq, enum nl80211_channel_type channel_type); |
391 | int rdev_set_freq(struct cfg80211_registered_device *rdev, | 390 | int cfg80211_set_freq(struct cfg80211_registered_device *rdev, |
392 | struct wireless_dev *for_wdev, | 391 | struct wireless_dev *wdev, int freq, |
393 | int freq, enum nl80211_channel_type channel_type); | 392 | enum nl80211_channel_type channel_type); |
394 | 393 | ||
395 | u16 cfg80211_calculate_bitrate(struct rate_info *rate); | 394 | u16 cfg80211_calculate_bitrate(struct rate_info *rate); |
396 | 395 | ||
diff --git a/net/wireless/ibss.c b/net/wireless/ibss.c index 6a5acf750174..adcabba02e20 100644 --- a/net/wireless/ibss.c +++ b/net/wireless/ibss.c | |||
@@ -81,15 +81,10 @@ int __cfg80211_join_ibss(struct cfg80211_registered_device *rdev, | |||
81 | struct cfg80211_cached_keys *connkeys) | 81 | struct cfg80211_cached_keys *connkeys) |
82 | { | 82 | { |
83 | struct wireless_dev *wdev = dev->ieee80211_ptr; | 83 | struct wireless_dev *wdev = dev->ieee80211_ptr; |
84 | struct ieee80211_channel *chan; | ||
85 | int err; | 84 | int err; |
86 | 85 | ||
87 | ASSERT_WDEV_LOCK(wdev); | 86 | ASSERT_WDEV_LOCK(wdev); |
88 | 87 | ||
89 | chan = rdev_fixed_channel(rdev, wdev); | ||
90 | if (chan && chan != params->channel) | ||
91 | return -EBUSY; | ||
92 | |||
93 | if (wdev->ssid_len) | 88 | if (wdev->ssid_len) |
94 | return -EALREADY; | 89 | return -EALREADY; |
95 | 90 | ||
diff --git a/net/wireless/mlme.c b/net/wireless/mlme.c index 22139fa46115..48ead6f0426d 100644 --- a/net/wireless/mlme.c +++ b/net/wireless/mlme.c | |||
@@ -378,7 +378,8 @@ int __cfg80211_mlme_auth(struct cfg80211_registered_device *rdev, | |||
378 | const u8 *bssid, | 378 | const u8 *bssid, |
379 | const u8 *ssid, int ssid_len, | 379 | const u8 *ssid, int ssid_len, |
380 | const u8 *ie, int ie_len, | 380 | const u8 *ie, int ie_len, |
381 | const u8 *key, int key_len, int key_idx) | 381 | const u8 *key, int key_len, int key_idx, |
382 | bool local_state_change) | ||
382 | { | 383 | { |
383 | struct wireless_dev *wdev = dev->ieee80211_ptr; | 384 | struct wireless_dev *wdev = dev->ieee80211_ptr; |
384 | struct cfg80211_auth_request req; | 385 | struct cfg80211_auth_request req; |
@@ -408,6 +409,7 @@ int __cfg80211_mlme_auth(struct cfg80211_registered_device *rdev, | |||
408 | 409 | ||
409 | memset(&req, 0, sizeof(req)); | 410 | memset(&req, 0, sizeof(req)); |
410 | 411 | ||
412 | req.local_state_change = local_state_change; | ||
411 | req.ie = ie; | 413 | req.ie = ie; |
412 | req.ie_len = ie_len; | 414 | req.ie_len = ie_len; |
413 | req.auth_type = auth_type; | 415 | req.auth_type = auth_type; |
@@ -434,12 +436,18 @@ int __cfg80211_mlme_auth(struct cfg80211_registered_device *rdev, | |||
434 | goto out; | 436 | goto out; |
435 | } | 437 | } |
436 | 438 | ||
437 | wdev->authtry_bsses[slot] = bss; | 439 | if (local_state_change) |
440 | wdev->auth_bsses[slot] = bss; | ||
441 | else | ||
442 | wdev->authtry_bsses[slot] = bss; | ||
438 | cfg80211_hold_bss(bss); | 443 | cfg80211_hold_bss(bss); |
439 | 444 | ||
440 | err = rdev->ops->auth(&rdev->wiphy, dev, &req); | 445 | err = rdev->ops->auth(&rdev->wiphy, dev, &req); |
441 | if (err) { | 446 | if (err) { |
442 | wdev->authtry_bsses[slot] = NULL; | 447 | if (local_state_change) |
448 | wdev->auth_bsses[slot] = NULL; | ||
449 | else | ||
450 | wdev->authtry_bsses[slot] = NULL; | ||
443 | cfg80211_unhold_bss(bss); | 451 | cfg80211_unhold_bss(bss); |
444 | } | 452 | } |
445 | 453 | ||
@@ -454,14 +462,15 @@ int cfg80211_mlme_auth(struct cfg80211_registered_device *rdev, | |||
454 | enum nl80211_auth_type auth_type, const u8 *bssid, | 462 | enum nl80211_auth_type auth_type, const u8 *bssid, |
455 | const u8 *ssid, int ssid_len, | 463 | const u8 *ssid, int ssid_len, |
456 | const u8 *ie, int ie_len, | 464 | const u8 *ie, int ie_len, |
457 | const u8 *key, int key_len, int key_idx) | 465 | const u8 *key, int key_len, int key_idx, |
466 | bool local_state_change) | ||
458 | { | 467 | { |
459 | int err; | 468 | int err; |
460 | 469 | ||
461 | wdev_lock(dev->ieee80211_ptr); | 470 | wdev_lock(dev->ieee80211_ptr); |
462 | err = __cfg80211_mlme_auth(rdev, dev, chan, auth_type, bssid, | 471 | err = __cfg80211_mlme_auth(rdev, dev, chan, auth_type, bssid, |
463 | ssid, ssid_len, ie, ie_len, | 472 | ssid, ssid_len, ie, ie_len, |
464 | key, key_len, key_idx); | 473 | key, key_len, key_idx, local_state_change); |
465 | wdev_unlock(dev->ieee80211_ptr); | 474 | wdev_unlock(dev->ieee80211_ptr); |
466 | 475 | ||
467 | return err; | 476 | return err; |
@@ -555,7 +564,8 @@ int cfg80211_mlme_assoc(struct cfg80211_registered_device *rdev, | |||
555 | 564 | ||
556 | int __cfg80211_mlme_deauth(struct cfg80211_registered_device *rdev, | 565 | int __cfg80211_mlme_deauth(struct cfg80211_registered_device *rdev, |
557 | struct net_device *dev, const u8 *bssid, | 566 | struct net_device *dev, const u8 *bssid, |
558 | const u8 *ie, int ie_len, u16 reason) | 567 | const u8 *ie, int ie_len, u16 reason, |
568 | bool local_state_change) | ||
559 | { | 569 | { |
560 | struct wireless_dev *wdev = dev->ieee80211_ptr; | 570 | struct wireless_dev *wdev = dev->ieee80211_ptr; |
561 | struct cfg80211_deauth_request req; | 571 | struct cfg80211_deauth_request req; |
@@ -565,6 +575,7 @@ int __cfg80211_mlme_deauth(struct cfg80211_registered_device *rdev, | |||
565 | 575 | ||
566 | memset(&req, 0, sizeof(req)); | 576 | memset(&req, 0, sizeof(req)); |
567 | req.reason_code = reason; | 577 | req.reason_code = reason; |
578 | req.local_state_change = local_state_change; | ||
568 | req.ie = ie; | 579 | req.ie = ie; |
569 | req.ie_len = ie_len; | 580 | req.ie_len = ie_len; |
570 | if (wdev->current_bss && | 581 | if (wdev->current_bss && |
@@ -591,13 +602,15 @@ int __cfg80211_mlme_deauth(struct cfg80211_registered_device *rdev, | |||
591 | 602 | ||
592 | int cfg80211_mlme_deauth(struct cfg80211_registered_device *rdev, | 603 | int cfg80211_mlme_deauth(struct cfg80211_registered_device *rdev, |
593 | struct net_device *dev, const u8 *bssid, | 604 | struct net_device *dev, const u8 *bssid, |
594 | const u8 *ie, int ie_len, u16 reason) | 605 | const u8 *ie, int ie_len, u16 reason, |
606 | bool local_state_change) | ||
595 | { | 607 | { |
596 | struct wireless_dev *wdev = dev->ieee80211_ptr; | 608 | struct wireless_dev *wdev = dev->ieee80211_ptr; |
597 | int err; | 609 | int err; |
598 | 610 | ||
599 | wdev_lock(wdev); | 611 | wdev_lock(wdev); |
600 | err = __cfg80211_mlme_deauth(rdev, dev, bssid, ie, ie_len, reason); | 612 | err = __cfg80211_mlme_deauth(rdev, dev, bssid, ie, ie_len, reason, |
613 | local_state_change); | ||
601 | wdev_unlock(wdev); | 614 | wdev_unlock(wdev); |
602 | 615 | ||
603 | return err; | 616 | return err; |
@@ -605,7 +618,8 @@ int cfg80211_mlme_deauth(struct cfg80211_registered_device *rdev, | |||
605 | 618 | ||
606 | static int __cfg80211_mlme_disassoc(struct cfg80211_registered_device *rdev, | 619 | static int __cfg80211_mlme_disassoc(struct cfg80211_registered_device *rdev, |
607 | struct net_device *dev, const u8 *bssid, | 620 | struct net_device *dev, const u8 *bssid, |
608 | const u8 *ie, int ie_len, u16 reason) | 621 | const u8 *ie, int ie_len, u16 reason, |
622 | bool local_state_change) | ||
609 | { | 623 | { |
610 | struct wireless_dev *wdev = dev->ieee80211_ptr; | 624 | struct wireless_dev *wdev = dev->ieee80211_ptr; |
611 | struct cfg80211_disassoc_request req; | 625 | struct cfg80211_disassoc_request req; |
@@ -620,6 +634,7 @@ static int __cfg80211_mlme_disassoc(struct cfg80211_registered_device *rdev, | |||
620 | 634 | ||
621 | memset(&req, 0, sizeof(req)); | 635 | memset(&req, 0, sizeof(req)); |
622 | req.reason_code = reason; | 636 | req.reason_code = reason; |
637 | req.local_state_change = local_state_change; | ||
623 | req.ie = ie; | 638 | req.ie = ie; |
624 | req.ie_len = ie_len; | 639 | req.ie_len = ie_len; |
625 | if (memcmp(wdev->current_bss->pub.bssid, bssid, ETH_ALEN) == 0) | 640 | if (memcmp(wdev->current_bss->pub.bssid, bssid, ETH_ALEN) == 0) |
@@ -632,13 +647,15 @@ static int __cfg80211_mlme_disassoc(struct cfg80211_registered_device *rdev, | |||
632 | 647 | ||
633 | int cfg80211_mlme_disassoc(struct cfg80211_registered_device *rdev, | 648 | int cfg80211_mlme_disassoc(struct cfg80211_registered_device *rdev, |
634 | struct net_device *dev, const u8 *bssid, | 649 | struct net_device *dev, const u8 *bssid, |
635 | const u8 *ie, int ie_len, u16 reason) | 650 | const u8 *ie, int ie_len, u16 reason, |
651 | bool local_state_change) | ||
636 | { | 652 | { |
637 | struct wireless_dev *wdev = dev->ieee80211_ptr; | 653 | struct wireless_dev *wdev = dev->ieee80211_ptr; |
638 | int err; | 654 | int err; |
639 | 655 | ||
640 | wdev_lock(wdev); | 656 | wdev_lock(wdev); |
641 | err = __cfg80211_mlme_disassoc(rdev, dev, bssid, ie, ie_len, reason); | 657 | err = __cfg80211_mlme_disassoc(rdev, dev, bssid, ie, ie_len, reason, |
658 | local_state_change); | ||
642 | wdev_unlock(wdev); | 659 | wdev_unlock(wdev); |
643 | 660 | ||
644 | return err; | 661 | return err; |
@@ -895,3 +912,16 @@ void cfg80211_action_tx_status(struct net_device *dev, u64 cookie, | |||
895 | nl80211_send_action_tx_status(rdev, dev, cookie, buf, len, ack, gfp); | 912 | nl80211_send_action_tx_status(rdev, dev, cookie, buf, len, ack, gfp); |
896 | } | 913 | } |
897 | EXPORT_SYMBOL(cfg80211_action_tx_status); | 914 | EXPORT_SYMBOL(cfg80211_action_tx_status); |
915 | |||
916 | void cfg80211_cqm_rssi_notify(struct net_device *dev, | ||
917 | enum nl80211_cqm_rssi_threshold_event rssi_event, | ||
918 | gfp_t gfp) | ||
919 | { | ||
920 | struct wireless_dev *wdev = dev->ieee80211_ptr; | ||
921 | struct wiphy *wiphy = wdev->wiphy; | ||
922 | struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy); | ||
923 | |||
924 | /* Indicate roaming trigger event to user space */ | ||
925 | nl80211_send_cqm_rssi_notify(rdev, dev, rssi_event, gfp); | ||
926 | } | ||
927 | EXPORT_SYMBOL(cfg80211_cqm_rssi_notify); | ||
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index 030cf153bea2..aaa1aad566cd 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c | |||
@@ -150,6 +150,9 @@ static const struct nla_policy nl80211_policy[NL80211_ATTR_MAX+1] = { | |||
150 | .len = IEEE80211_MAX_DATA_LEN }, | 150 | .len = IEEE80211_MAX_DATA_LEN }, |
151 | [NL80211_ATTR_FRAME_MATCH] = { .type = NLA_BINARY, }, | 151 | [NL80211_ATTR_FRAME_MATCH] = { .type = NLA_BINARY, }, |
152 | [NL80211_ATTR_PS_STATE] = { .type = NLA_U32 }, | 152 | [NL80211_ATTR_PS_STATE] = { .type = NLA_U32 }, |
153 | [NL80211_ATTR_CQM] = { .type = NLA_NESTED, }, | ||
154 | [NL80211_ATTR_LOCAL_STATE_CHANGE] = { .type = NLA_FLAG }, | ||
155 | [NL80211_ATTR_AP_ISOLATE] = { .type = NLA_U8 }, | ||
153 | }; | 156 | }; |
154 | 157 | ||
155 | /* policy for the attributes */ | 158 | /* policy for the attributes */ |
@@ -586,6 +589,7 @@ static int nl80211_send_wiphy(struct sk_buff *msg, u32 pid, u32 seq, int flags, | |||
586 | i++; | 589 | i++; |
587 | NLA_PUT_U32(msg, i, NL80211_CMD_SET_WIPHY_NETNS); | 590 | NLA_PUT_U32(msg, i, NL80211_CMD_SET_WIPHY_NETNS); |
588 | } | 591 | } |
592 | CMD(set_channel, SET_CHANNEL); | ||
589 | 593 | ||
590 | #undef CMD | 594 | #undef CMD |
591 | 595 | ||
@@ -686,10 +690,90 @@ static int parse_txq_params(struct nlattr *tb[], | |||
686 | return 0; | 690 | return 0; |
687 | } | 691 | } |
688 | 692 | ||
693 | static bool nl80211_can_set_dev_channel(struct wireless_dev *wdev) | ||
694 | { | ||
695 | /* | ||
696 | * You can only set the channel explicitly for AP, mesh | ||
697 | * and WDS type interfaces; all others have their channel | ||
698 | * managed via their respective "establish a connection" | ||
699 | * command (connect, join, ...) | ||
700 | * | ||
701 | * Monitors are special as they are normally slaved to | ||
702 | * whatever else is going on, so they behave as though | ||
703 | * you tried setting the wiphy channel itself. | ||
704 | */ | ||
705 | return !wdev || | ||
706 | wdev->iftype == NL80211_IFTYPE_AP || | ||
707 | wdev->iftype == NL80211_IFTYPE_WDS || | ||
708 | wdev->iftype == NL80211_IFTYPE_MESH_POINT || | ||
709 | wdev->iftype == NL80211_IFTYPE_MONITOR; | ||
710 | } | ||
711 | |||
712 | static int __nl80211_set_channel(struct cfg80211_registered_device *rdev, | ||
713 | struct wireless_dev *wdev, | ||
714 | struct genl_info *info) | ||
715 | { | ||
716 | enum nl80211_channel_type channel_type = NL80211_CHAN_NO_HT; | ||
717 | u32 freq; | ||
718 | int result; | ||
719 | |||
720 | if (!info->attrs[NL80211_ATTR_WIPHY_FREQ]) | ||
721 | return -EINVAL; | ||
722 | |||
723 | if (!nl80211_can_set_dev_channel(wdev)) | ||
724 | return -EOPNOTSUPP; | ||
725 | |||
726 | if (info->attrs[NL80211_ATTR_WIPHY_CHANNEL_TYPE]) { | ||
727 | channel_type = nla_get_u32(info->attrs[ | ||
728 | NL80211_ATTR_WIPHY_CHANNEL_TYPE]); | ||
729 | if (channel_type != NL80211_CHAN_NO_HT && | ||
730 | channel_type != NL80211_CHAN_HT20 && | ||
731 | channel_type != NL80211_CHAN_HT40PLUS && | ||
732 | channel_type != NL80211_CHAN_HT40MINUS) | ||
733 | return -EINVAL; | ||
734 | } | ||
735 | |||
736 | freq = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ]); | ||
737 | |||
738 | mutex_lock(&rdev->devlist_mtx); | ||
739 | if (wdev) { | ||
740 | wdev_lock(wdev); | ||
741 | result = cfg80211_set_freq(rdev, wdev, freq, channel_type); | ||
742 | wdev_unlock(wdev); | ||
743 | } else { | ||
744 | result = cfg80211_set_freq(rdev, NULL, freq, channel_type); | ||
745 | } | ||
746 | mutex_unlock(&rdev->devlist_mtx); | ||
747 | |||
748 | return result; | ||
749 | } | ||
750 | |||
751 | static int nl80211_set_channel(struct sk_buff *skb, struct genl_info *info) | ||
752 | { | ||
753 | struct cfg80211_registered_device *rdev; | ||
754 | struct net_device *netdev; | ||
755 | int result; | ||
756 | |||
757 | rtnl_lock(); | ||
758 | |||
759 | result = get_rdev_dev_by_info_ifindex(info, &rdev, &netdev); | ||
760 | if (result) | ||
761 | goto unlock; | ||
762 | |||
763 | result = __nl80211_set_channel(rdev, netdev->ieee80211_ptr, info); | ||
764 | |||
765 | unlock: | ||
766 | rtnl_unlock(); | ||
767 | |||
768 | return result; | ||
769 | } | ||
770 | |||
689 | static int nl80211_set_wiphy(struct sk_buff *skb, struct genl_info *info) | 771 | static int nl80211_set_wiphy(struct sk_buff *skb, struct genl_info *info) |
690 | { | 772 | { |
691 | struct cfg80211_registered_device *rdev; | 773 | struct cfg80211_registered_device *rdev; |
692 | int result = 0, rem_txq_params = 0; | 774 | struct net_device *netdev = NULL; |
775 | struct wireless_dev *wdev; | ||
776 | int result, rem_txq_params = 0; | ||
693 | struct nlattr *nl_txq_params; | 777 | struct nlattr *nl_txq_params; |
694 | u32 changed; | 778 | u32 changed; |
695 | u8 retry_short = 0, retry_long = 0; | 779 | u8 retry_short = 0, retry_long = 0; |
@@ -698,16 +782,50 @@ static int nl80211_set_wiphy(struct sk_buff *skb, struct genl_info *info) | |||
698 | 782 | ||
699 | rtnl_lock(); | 783 | rtnl_lock(); |
700 | 784 | ||
785 | /* | ||
786 | * Try to find the wiphy and netdev. Normally this | ||
787 | * function shouldn't need the netdev, but this is | ||
788 | * done for backward compatibility -- previously | ||
789 | * setting the channel was done per wiphy, but now | ||
790 | * it is per netdev. Previous userland like hostapd | ||
791 | * also passed a netdev to set_wiphy, so that it is | ||
792 | * possible to let that go to the right netdev! | ||
793 | */ | ||
701 | mutex_lock(&cfg80211_mutex); | 794 | mutex_lock(&cfg80211_mutex); |
702 | 795 | ||
703 | rdev = __cfg80211_rdev_from_info(info); | 796 | if (info->attrs[NL80211_ATTR_IFINDEX]) { |
704 | if (IS_ERR(rdev)) { | 797 | int ifindex = nla_get_u32(info->attrs[NL80211_ATTR_IFINDEX]); |
705 | mutex_unlock(&cfg80211_mutex); | 798 | |
706 | result = PTR_ERR(rdev); | 799 | netdev = dev_get_by_index(genl_info_net(info), ifindex); |
707 | goto unlock; | 800 | if (netdev && netdev->ieee80211_ptr) { |
801 | rdev = wiphy_to_dev(netdev->ieee80211_ptr->wiphy); | ||
802 | mutex_lock(&rdev->mtx); | ||
803 | } else | ||
804 | netdev = NULL; | ||
708 | } | 805 | } |
709 | 806 | ||
710 | mutex_lock(&rdev->mtx); | 807 | if (!netdev) { |
808 | rdev = __cfg80211_rdev_from_info(info); | ||
809 | if (IS_ERR(rdev)) { | ||
810 | mutex_unlock(&cfg80211_mutex); | ||
811 | result = PTR_ERR(rdev); | ||
812 | goto unlock; | ||
813 | } | ||
814 | wdev = NULL; | ||
815 | netdev = NULL; | ||
816 | result = 0; | ||
817 | |||
818 | mutex_lock(&rdev->mtx); | ||
819 | } else if (netif_running(netdev) && | ||
820 | nl80211_can_set_dev_channel(netdev->ieee80211_ptr)) | ||
821 | wdev = netdev->ieee80211_ptr; | ||
822 | else | ||
823 | wdev = NULL; | ||
824 | |||
825 | /* | ||
826 | * end workaround code, by now the rdev is available | ||
827 | * and locked, and wdev may or may not be NULL. | ||
828 | */ | ||
711 | 829 | ||
712 | if (info->attrs[NL80211_ATTR_WIPHY_NAME]) | 830 | if (info->attrs[NL80211_ATTR_WIPHY_NAME]) |
713 | result = cfg80211_dev_rename( | 831 | result = cfg80211_dev_rename( |
@@ -746,26 +864,7 @@ static int nl80211_set_wiphy(struct sk_buff *skb, struct genl_info *info) | |||
746 | } | 864 | } |
747 | 865 | ||
748 | if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) { | 866 | if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) { |
749 | enum nl80211_channel_type channel_type = NL80211_CHAN_NO_HT; | 867 | result = __nl80211_set_channel(rdev, wdev, info); |
750 | u32 freq; | ||
751 | |||
752 | result = -EINVAL; | ||
753 | |||
754 | if (info->attrs[NL80211_ATTR_WIPHY_CHANNEL_TYPE]) { | ||
755 | channel_type = nla_get_u32(info->attrs[ | ||
756 | NL80211_ATTR_WIPHY_CHANNEL_TYPE]); | ||
757 | if (channel_type != NL80211_CHAN_NO_HT && | ||
758 | channel_type != NL80211_CHAN_HT20 && | ||
759 | channel_type != NL80211_CHAN_HT40PLUS && | ||
760 | channel_type != NL80211_CHAN_HT40MINUS) | ||
761 | goto bad_res; | ||
762 | } | ||
763 | |||
764 | freq = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ]); | ||
765 | |||
766 | mutex_lock(&rdev->devlist_mtx); | ||
767 | result = rdev_set_freq(rdev, NULL, freq, channel_type); | ||
768 | mutex_unlock(&rdev->devlist_mtx); | ||
769 | if (result) | 868 | if (result) |
770 | goto bad_res; | 869 | goto bad_res; |
771 | } | 870 | } |
@@ -862,6 +961,8 @@ static int nl80211_set_wiphy(struct sk_buff *skb, struct genl_info *info) | |||
862 | 961 | ||
863 | bad_res: | 962 | bad_res: |
864 | mutex_unlock(&rdev->mtx); | 963 | mutex_unlock(&rdev->mtx); |
964 | if (netdev) | ||
965 | dev_put(netdev); | ||
865 | unlock: | 966 | unlock: |
866 | rtnl_unlock(); | 967 | rtnl_unlock(); |
867 | return result; | 968 | return result; |
@@ -2096,7 +2197,8 @@ static int nl80211_del_station(struct sk_buff *skb, struct genl_info *info) | |||
2096 | goto out_rtnl; | 2197 | goto out_rtnl; |
2097 | 2198 | ||
2098 | if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && | 2199 | if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && |
2099 | dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP_VLAN) { | 2200 | dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP_VLAN && |
2201 | dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) { | ||
2100 | err = -EINVAL; | 2202 | err = -EINVAL; |
2101 | goto out; | 2203 | goto out; |
2102 | } | 2204 | } |
@@ -2439,6 +2541,7 @@ static int nl80211_set_bss(struct sk_buff *skb, struct genl_info *info) | |||
2439 | params.use_cts_prot = -1; | 2541 | params.use_cts_prot = -1; |
2440 | params.use_short_preamble = -1; | 2542 | params.use_short_preamble = -1; |
2441 | params.use_short_slot_time = -1; | 2543 | params.use_short_slot_time = -1; |
2544 | params.ap_isolate = -1; | ||
2442 | 2545 | ||
2443 | if (info->attrs[NL80211_ATTR_BSS_CTS_PROT]) | 2546 | if (info->attrs[NL80211_ATTR_BSS_CTS_PROT]) |
2444 | params.use_cts_prot = | 2547 | params.use_cts_prot = |
@@ -2455,6 +2558,8 @@ static int nl80211_set_bss(struct sk_buff *skb, struct genl_info *info) | |||
2455 | params.basic_rates_len = | 2558 | params.basic_rates_len = |
2456 | nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); | 2559 | nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); |
2457 | } | 2560 | } |
2561 | if (info->attrs[NL80211_ATTR_AP_ISOLATE]) | ||
2562 | params.ap_isolate = !!nla_get_u8(info->attrs[NL80211_ATTR_AP_ISOLATE]); | ||
2458 | 2563 | ||
2459 | rtnl_lock(); | 2564 | rtnl_lock(); |
2460 | 2565 | ||
@@ -3392,6 +3497,7 @@ static int nl80211_authenticate(struct sk_buff *skb, struct genl_info *info) | |||
3392 | int err, ssid_len, ie_len = 0; | 3497 | int err, ssid_len, ie_len = 0; |
3393 | enum nl80211_auth_type auth_type; | 3498 | enum nl80211_auth_type auth_type; |
3394 | struct key_parse key; | 3499 | struct key_parse key; |
3500 | bool local_state_change; | ||
3395 | 3501 | ||
3396 | if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE])) | 3502 | if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE])) |
3397 | return -EINVAL; | 3503 | return -EINVAL; |
@@ -3470,9 +3576,12 @@ static int nl80211_authenticate(struct sk_buff *skb, struct genl_info *info) | |||
3470 | goto out; | 3576 | goto out; |
3471 | } | 3577 | } |
3472 | 3578 | ||
3579 | local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE]; | ||
3580 | |||
3473 | err = cfg80211_mlme_auth(rdev, dev, chan, auth_type, bssid, | 3581 | err = cfg80211_mlme_auth(rdev, dev, chan, auth_type, bssid, |
3474 | ssid, ssid_len, ie, ie_len, | 3582 | ssid, ssid_len, ie, ie_len, |
3475 | key.p.key, key.p.key_len, key.idx); | 3583 | key.p.key, key.p.key_len, key.idx, |
3584 | local_state_change); | ||
3476 | 3585 | ||
3477 | out: | 3586 | out: |
3478 | cfg80211_unlock_rdev(rdev); | 3587 | cfg80211_unlock_rdev(rdev); |
@@ -3551,9 +3660,8 @@ static int nl80211_associate(struct sk_buff *skb, struct genl_info *info) | |||
3551 | { | 3660 | { |
3552 | struct cfg80211_registered_device *rdev; | 3661 | struct cfg80211_registered_device *rdev; |
3553 | struct net_device *dev; | 3662 | struct net_device *dev; |
3554 | struct wireless_dev *wdev; | ||
3555 | struct cfg80211_crypto_settings crypto; | 3663 | struct cfg80211_crypto_settings crypto; |
3556 | struct ieee80211_channel *chan, *fixedchan; | 3664 | struct ieee80211_channel *chan; |
3557 | const u8 *bssid, *ssid, *ie = NULL, *prev_bssid = NULL; | 3665 | const u8 *bssid, *ssid, *ie = NULL, *prev_bssid = NULL; |
3558 | int err, ssid_len, ie_len = 0; | 3666 | int err, ssid_len, ie_len = 0; |
3559 | bool use_mfp = false; | 3667 | bool use_mfp = false; |
@@ -3596,16 +3704,6 @@ static int nl80211_associate(struct sk_buff *skb, struct genl_info *info) | |||
3596 | goto out; | 3704 | goto out; |
3597 | } | 3705 | } |
3598 | 3706 | ||
3599 | mutex_lock(&rdev->devlist_mtx); | ||
3600 | wdev = dev->ieee80211_ptr; | ||
3601 | fixedchan = rdev_fixed_channel(rdev, wdev); | ||
3602 | if (fixedchan && chan != fixedchan) { | ||
3603 | err = -EBUSY; | ||
3604 | mutex_unlock(&rdev->devlist_mtx); | ||
3605 | goto out; | ||
3606 | } | ||
3607 | mutex_unlock(&rdev->devlist_mtx); | ||
3608 | |||
3609 | ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); | 3707 | ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); |
3610 | ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); | 3708 | ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); |
3611 | 3709 | ||
@@ -3649,6 +3747,7 @@ static int nl80211_deauthenticate(struct sk_buff *skb, struct genl_info *info) | |||
3649 | const u8 *ie = NULL, *bssid; | 3747 | const u8 *ie = NULL, *bssid; |
3650 | int err, ie_len = 0; | 3748 | int err, ie_len = 0; |
3651 | u16 reason_code; | 3749 | u16 reason_code; |
3750 | bool local_state_change; | ||
3652 | 3751 | ||
3653 | if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE])) | 3752 | if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE])) |
3654 | return -EINVAL; | 3753 | return -EINVAL; |
@@ -3694,7 +3793,10 @@ static int nl80211_deauthenticate(struct sk_buff *skb, struct genl_info *info) | |||
3694 | ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); | 3793 | ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); |
3695 | } | 3794 | } |
3696 | 3795 | ||
3697 | err = cfg80211_mlme_deauth(rdev, dev, bssid, ie, ie_len, reason_code); | 3796 | local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE]; |
3797 | |||
3798 | err = cfg80211_mlme_deauth(rdev, dev, bssid, ie, ie_len, reason_code, | ||
3799 | local_state_change); | ||
3698 | 3800 | ||
3699 | out: | 3801 | out: |
3700 | cfg80211_unlock_rdev(rdev); | 3802 | cfg80211_unlock_rdev(rdev); |
@@ -3711,6 +3813,7 @@ static int nl80211_disassociate(struct sk_buff *skb, struct genl_info *info) | |||
3711 | const u8 *ie = NULL, *bssid; | 3813 | const u8 *ie = NULL, *bssid; |
3712 | int err, ie_len = 0; | 3814 | int err, ie_len = 0; |
3713 | u16 reason_code; | 3815 | u16 reason_code; |
3816 | bool local_state_change; | ||
3714 | 3817 | ||
3715 | if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE])) | 3818 | if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE])) |
3716 | return -EINVAL; | 3819 | return -EINVAL; |
@@ -3756,7 +3859,10 @@ static int nl80211_disassociate(struct sk_buff *skb, struct genl_info *info) | |||
3756 | ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); | 3859 | ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); |
3757 | } | 3860 | } |
3758 | 3861 | ||
3759 | err = cfg80211_mlme_disassoc(rdev, dev, bssid, ie, ie_len, reason_code); | 3862 | local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE]; |
3863 | |||
3864 | err = cfg80211_mlme_disassoc(rdev, dev, bssid, ie, ie_len, reason_code, | ||
3865 | local_state_change); | ||
3760 | 3866 | ||
3761 | out: | 3867 | out: |
3762 | cfg80211_unlock_rdev(rdev); | 3868 | cfg80211_unlock_rdev(rdev); |
@@ -4779,6 +4885,84 @@ unlock_rtnl: | |||
4779 | return err; | 4885 | return err; |
4780 | } | 4886 | } |
4781 | 4887 | ||
4888 | static struct nla_policy | ||
4889 | nl80211_attr_cqm_policy[NL80211_ATTR_CQM_MAX + 1] __read_mostly = { | ||
4890 | [NL80211_ATTR_CQM_RSSI_THOLD] = { .type = NLA_U32 }, | ||
4891 | [NL80211_ATTR_CQM_RSSI_HYST] = { .type = NLA_U32 }, | ||
4892 | [NL80211_ATTR_CQM_RSSI_THRESHOLD_EVENT] = { .type = NLA_U32 }, | ||
4893 | }; | ||
4894 | |||
4895 | static int nl80211_set_cqm_rssi(struct genl_info *info, | ||
4896 | s32 threshold, u32 hysteresis) | ||
4897 | { | ||
4898 | struct cfg80211_registered_device *rdev; | ||
4899 | struct wireless_dev *wdev; | ||
4900 | struct net_device *dev; | ||
4901 | int err; | ||
4902 | |||
4903 | if (threshold > 0) | ||
4904 | return -EINVAL; | ||
4905 | |||
4906 | rtnl_lock(); | ||
4907 | |||
4908 | err = get_rdev_dev_by_info_ifindex(info, &rdev, &dev); | ||
4909 | if (err) | ||
4910 | goto unlock_rdev; | ||
4911 | |||
4912 | wdev = dev->ieee80211_ptr; | ||
4913 | |||
4914 | if (!rdev->ops->set_cqm_rssi_config) { | ||
4915 | err = -EOPNOTSUPP; | ||
4916 | goto unlock_rdev; | ||
4917 | } | ||
4918 | |||
4919 | if (wdev->iftype != NL80211_IFTYPE_STATION) { | ||
4920 | err = -EOPNOTSUPP; | ||
4921 | goto unlock_rdev; | ||
4922 | } | ||
4923 | |||
4924 | err = rdev->ops->set_cqm_rssi_config(wdev->wiphy, dev, | ||
4925 | threshold, hysteresis); | ||
4926 | |||
4927 | unlock_rdev: | ||
4928 | cfg80211_unlock_rdev(rdev); | ||
4929 | dev_put(dev); | ||
4930 | rtnl_unlock(); | ||
4931 | |||
4932 | return err; | ||
4933 | } | ||
4934 | |||
4935 | static int nl80211_set_cqm(struct sk_buff *skb, struct genl_info *info) | ||
4936 | { | ||
4937 | struct nlattr *attrs[NL80211_ATTR_CQM_MAX + 1]; | ||
4938 | struct nlattr *cqm; | ||
4939 | int err; | ||
4940 | |||
4941 | cqm = info->attrs[NL80211_ATTR_CQM]; | ||
4942 | if (!cqm) { | ||
4943 | err = -EINVAL; | ||
4944 | goto out; | ||
4945 | } | ||
4946 | |||
4947 | err = nla_parse_nested(attrs, NL80211_ATTR_CQM_MAX, cqm, | ||
4948 | nl80211_attr_cqm_policy); | ||
4949 | if (err) | ||
4950 | goto out; | ||
4951 | |||
4952 | if (attrs[NL80211_ATTR_CQM_RSSI_THOLD] && | ||
4953 | attrs[NL80211_ATTR_CQM_RSSI_HYST]) { | ||
4954 | s32 threshold; | ||
4955 | u32 hysteresis; | ||
4956 | threshold = nla_get_u32(attrs[NL80211_ATTR_CQM_RSSI_THOLD]); | ||
4957 | hysteresis = nla_get_u32(attrs[NL80211_ATTR_CQM_RSSI_HYST]); | ||
4958 | err = nl80211_set_cqm_rssi(info, threshold, hysteresis); | ||
4959 | } else | ||
4960 | err = -EINVAL; | ||
4961 | |||
4962 | out: | ||
4963 | return err; | ||
4964 | } | ||
4965 | |||
4782 | static struct genl_ops nl80211_ops[] = { | 4966 | static struct genl_ops nl80211_ops[] = { |
4783 | { | 4967 | { |
4784 | .cmd = NL80211_CMD_GET_WIPHY, | 4968 | .cmd = NL80211_CMD_GET_WIPHY, |
@@ -5083,6 +5267,18 @@ static struct genl_ops nl80211_ops[] = { | |||
5083 | .policy = nl80211_policy, | 5267 | .policy = nl80211_policy, |
5084 | /* can be retrieved by unprivileged users */ | 5268 | /* can be retrieved by unprivileged users */ |
5085 | }, | 5269 | }, |
5270 | { | ||
5271 | .cmd = NL80211_CMD_SET_CQM, | ||
5272 | .doit = nl80211_set_cqm, | ||
5273 | .policy = nl80211_policy, | ||
5274 | .flags = GENL_ADMIN_PERM, | ||
5275 | }, | ||
5276 | { | ||
5277 | .cmd = NL80211_CMD_SET_CHANNEL, | ||
5278 | .doit = nl80211_set_channel, | ||
5279 | .policy = nl80211_policy, | ||
5280 | .flags = GENL_ADMIN_PERM, | ||
5281 | }, | ||
5086 | }; | 5282 | }; |
5087 | 5283 | ||
5088 | static struct genl_multicast_group nl80211_mlme_mcgrp = { | 5284 | static struct genl_multicast_group nl80211_mlme_mcgrp = { |
@@ -5833,6 +6029,52 @@ void nl80211_send_action_tx_status(struct cfg80211_registered_device *rdev, | |||
5833 | nlmsg_free(msg); | 6029 | nlmsg_free(msg); |
5834 | } | 6030 | } |
5835 | 6031 | ||
6032 | void | ||
6033 | nl80211_send_cqm_rssi_notify(struct cfg80211_registered_device *rdev, | ||
6034 | struct net_device *netdev, | ||
6035 | enum nl80211_cqm_rssi_threshold_event rssi_event, | ||
6036 | gfp_t gfp) | ||
6037 | { | ||
6038 | struct sk_buff *msg; | ||
6039 | struct nlattr *pinfoattr; | ||
6040 | void *hdr; | ||
6041 | |||
6042 | msg = nlmsg_new(NLMSG_GOODSIZE, gfp); | ||
6043 | if (!msg) | ||
6044 | return; | ||
6045 | |||
6046 | hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NOTIFY_CQM); | ||
6047 | if (!hdr) { | ||
6048 | nlmsg_free(msg); | ||
6049 | return; | ||
6050 | } | ||
6051 | |||
6052 | NLA_PUT_U32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx); | ||
6053 | NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex); | ||
6054 | |||
6055 | pinfoattr = nla_nest_start(msg, NL80211_ATTR_CQM); | ||
6056 | if (!pinfoattr) | ||
6057 | goto nla_put_failure; | ||
6058 | |||
6059 | NLA_PUT_U32(msg, NL80211_ATTR_CQM_RSSI_THRESHOLD_EVENT, | ||
6060 | rssi_event); | ||
6061 | |||
6062 | nla_nest_end(msg, pinfoattr); | ||
6063 | |||
6064 | if (genlmsg_end(msg, hdr) < 0) { | ||
6065 | nlmsg_free(msg); | ||
6066 | return; | ||
6067 | } | ||
6068 | |||
6069 | genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0, | ||
6070 | nl80211_mlme_mcgrp.id, gfp); | ||
6071 | return; | ||
6072 | |||
6073 | nla_put_failure: | ||
6074 | genlmsg_cancel(msg, hdr); | ||
6075 | nlmsg_free(msg); | ||
6076 | } | ||
6077 | |||
5836 | static int nl80211_netlink_notify(struct notifier_block * nb, | 6078 | static int nl80211_netlink_notify(struct notifier_block * nb, |
5837 | unsigned long state, | 6079 | unsigned long state, |
5838 | void *_notify) | 6080 | void *_notify) |
diff --git a/net/wireless/nl80211.h b/net/wireless/nl80211.h index 4ca511102c6c..2ad7fbc7d9f1 100644 --- a/net/wireless/nl80211.h +++ b/net/wireless/nl80211.h | |||
@@ -82,4 +82,10 @@ void nl80211_send_action_tx_status(struct cfg80211_registered_device *rdev, | |||
82 | const u8 *buf, size_t len, bool ack, | 82 | const u8 *buf, size_t len, bool ack, |
83 | gfp_t gfp); | 83 | gfp_t gfp); |
84 | 84 | ||
85 | void | ||
86 | nl80211_send_cqm_rssi_notify(struct cfg80211_registered_device *rdev, | ||
87 | struct net_device *netdev, | ||
88 | enum nl80211_cqm_rssi_threshold_event rssi_event, | ||
89 | gfp_t gfp); | ||
90 | |||
85 | #endif /* __NET_WIRELESS_NL80211_H */ | 91 | #endif /* __NET_WIRELESS_NL80211_H */ |
diff --git a/net/wireless/reg.c b/net/wireless/reg.c index 422da20d1e5b..8f0d97dd3109 100644 --- a/net/wireless/reg.c +++ b/net/wireless/reg.c | |||
@@ -2356,10 +2356,10 @@ static void print_regdomain(const struct ieee80211_regdomain *rd) | |||
2356 | rdev->country_ie_alpha2[1]); | 2356 | rdev->country_ie_alpha2[1]); |
2357 | } else | 2357 | } else |
2358 | printk(KERN_INFO "cfg80211: Current regulatory " | 2358 | printk(KERN_INFO "cfg80211: Current regulatory " |
2359 | "domain intersected: \n"); | 2359 | "domain intersected:\n"); |
2360 | } else | 2360 | } else |
2361 | printk(KERN_INFO "cfg80211: Current regulatory " | 2361 | printk(KERN_INFO "cfg80211: Current regulatory " |
2362 | "domain intersected: \n"); | 2362 | "domain intersected:\n"); |
2363 | } else if (is_world_regdom(rd->alpha2)) | 2363 | } else if (is_world_regdom(rd->alpha2)) |
2364 | printk(KERN_INFO "cfg80211: World regulatory " | 2364 | printk(KERN_INFO "cfg80211: World regulatory " |
2365 | "domain updated:\n"); | 2365 | "domain updated:\n"); |
diff --git a/net/wireless/sme.c b/net/wireless/sme.c index f4dfd5f5f2ea..72222f0074db 100644 --- a/net/wireless/sme.c +++ b/net/wireless/sme.c | |||
@@ -171,7 +171,7 @@ static int cfg80211_conn_do_work(struct wireless_dev *wdev) | |||
171 | params->ssid, params->ssid_len, | 171 | params->ssid, params->ssid_len, |
172 | NULL, 0, | 172 | NULL, 0, |
173 | params->key, params->key_len, | 173 | params->key, params->key_len, |
174 | params->key_idx); | 174 | params->key_idx, false); |
175 | case CFG80211_CONN_ASSOCIATE_NEXT: | 175 | case CFG80211_CONN_ASSOCIATE_NEXT: |
176 | BUG_ON(!rdev->ops->assoc); | 176 | BUG_ON(!rdev->ops->assoc); |
177 | wdev->conn->state = CFG80211_CONN_ASSOCIATING; | 177 | wdev->conn->state = CFG80211_CONN_ASSOCIATING; |
@@ -186,12 +186,13 @@ static int cfg80211_conn_do_work(struct wireless_dev *wdev) | |||
186 | if (err) | 186 | if (err) |
187 | __cfg80211_mlme_deauth(rdev, wdev->netdev, params->bssid, | 187 | __cfg80211_mlme_deauth(rdev, wdev->netdev, params->bssid, |
188 | NULL, 0, | 188 | NULL, 0, |
189 | WLAN_REASON_DEAUTH_LEAVING); | 189 | WLAN_REASON_DEAUTH_LEAVING, |
190 | false); | ||
190 | return err; | 191 | return err; |
191 | case CFG80211_CONN_DEAUTH_ASSOC_FAIL: | 192 | case CFG80211_CONN_DEAUTH_ASSOC_FAIL: |
192 | __cfg80211_mlme_deauth(rdev, wdev->netdev, params->bssid, | 193 | __cfg80211_mlme_deauth(rdev, wdev->netdev, params->bssid, |
193 | NULL, 0, | 194 | NULL, 0, |
194 | WLAN_REASON_DEAUTH_LEAVING); | 195 | WLAN_REASON_DEAUTH_LEAVING, false); |
195 | /* return an error so that we call __cfg80211_connect_result() */ | 196 | /* return an error so that we call __cfg80211_connect_result() */ |
196 | return -EINVAL; | 197 | return -EINVAL; |
197 | default: | 198 | default: |
@@ -517,12 +518,16 @@ void cfg80211_connect_result(struct net_device *dev, const u8 *bssid, | |||
517 | ev->type = EVENT_CONNECT_RESULT; | 518 | ev->type = EVENT_CONNECT_RESULT; |
518 | if (bssid) | 519 | if (bssid) |
519 | memcpy(ev->cr.bssid, bssid, ETH_ALEN); | 520 | memcpy(ev->cr.bssid, bssid, ETH_ALEN); |
520 | ev->cr.req_ie = ((u8 *)ev) + sizeof(*ev); | 521 | if (req_ie_len) { |
521 | ev->cr.req_ie_len = req_ie_len; | 522 | ev->cr.req_ie = ((u8 *)ev) + sizeof(*ev); |
522 | memcpy((void *)ev->cr.req_ie, req_ie, req_ie_len); | 523 | ev->cr.req_ie_len = req_ie_len; |
523 | ev->cr.resp_ie = ((u8 *)ev) + sizeof(*ev) + req_ie_len; | 524 | memcpy((void *)ev->cr.req_ie, req_ie, req_ie_len); |
524 | ev->cr.resp_ie_len = resp_ie_len; | 525 | } |
525 | memcpy((void *)ev->cr.resp_ie, resp_ie, resp_ie_len); | 526 | if (resp_ie_len) { |
527 | ev->cr.resp_ie = ((u8 *)ev) + sizeof(*ev) + req_ie_len; | ||
528 | ev->cr.resp_ie_len = resp_ie_len; | ||
529 | memcpy((void *)ev->cr.resp_ie, resp_ie, resp_ie_len); | ||
530 | } | ||
526 | ev->cr.status = status; | 531 | ev->cr.status = status; |
527 | 532 | ||
528 | spin_lock_irqsave(&wdev->event_lock, flags); | 533 | spin_lock_irqsave(&wdev->event_lock, flags); |
@@ -676,7 +681,8 @@ void __cfg80211_disconnected(struct net_device *dev, const u8 *ie, | |||
676 | continue; | 681 | continue; |
677 | bssid = wdev->auth_bsses[i]->pub.bssid; | 682 | bssid = wdev->auth_bsses[i]->pub.bssid; |
678 | ret = __cfg80211_mlme_deauth(rdev, dev, bssid, NULL, 0, | 683 | ret = __cfg80211_mlme_deauth(rdev, dev, bssid, NULL, 0, |
679 | WLAN_REASON_DEAUTH_LEAVING); | 684 | WLAN_REASON_DEAUTH_LEAVING, |
685 | false); | ||
680 | WARN(ret, "deauth failed: %d\n", ret); | 686 | WARN(ret, "deauth failed: %d\n", ret); |
681 | } | 687 | } |
682 | } | 688 | } |
@@ -735,7 +741,6 @@ int __cfg80211_connect(struct cfg80211_registered_device *rdev, | |||
735 | const u8 *prev_bssid) | 741 | const u8 *prev_bssid) |
736 | { | 742 | { |
737 | struct wireless_dev *wdev = dev->ieee80211_ptr; | 743 | struct wireless_dev *wdev = dev->ieee80211_ptr; |
738 | struct ieee80211_channel *chan; | ||
739 | struct cfg80211_bss *bss = NULL; | 744 | struct cfg80211_bss *bss = NULL; |
740 | int err; | 745 | int err; |
741 | 746 | ||
@@ -744,10 +749,6 @@ int __cfg80211_connect(struct cfg80211_registered_device *rdev, | |||
744 | if (wdev->sme_state != CFG80211_SME_IDLE) | 749 | if (wdev->sme_state != CFG80211_SME_IDLE) |
745 | return -EALREADY; | 750 | return -EALREADY; |
746 | 751 | ||
747 | chan = rdev_fixed_channel(rdev, wdev); | ||
748 | if (chan && chan != connect->channel) | ||
749 | return -EBUSY; | ||
750 | |||
751 | if (WARN_ON(wdev->connect_keys)) { | 752 | if (WARN_ON(wdev->connect_keys)) { |
752 | kfree(wdev->connect_keys); | 753 | kfree(wdev->connect_keys); |
753 | wdev->connect_keys = NULL; | 754 | wdev->connect_keys = NULL; |
@@ -935,7 +936,7 @@ int __cfg80211_disconnect(struct cfg80211_registered_device *rdev, | |||
935 | /* wdev->conn->params.bssid must be set if > SCANNING */ | 936 | /* wdev->conn->params.bssid must be set if > SCANNING */ |
936 | err = __cfg80211_mlme_deauth(rdev, dev, | 937 | err = __cfg80211_mlme_deauth(rdev, dev, |
937 | wdev->conn->params.bssid, | 938 | wdev->conn->params.bssid, |
938 | NULL, 0, reason); | 939 | NULL, 0, reason, false); |
939 | if (err) | 940 | if (err) |
940 | return err; | 941 | return err; |
941 | } else { | 942 | } else { |
@@ -991,7 +992,8 @@ void cfg80211_sme_disassoc(struct net_device *dev, int idx) | |||
991 | 992 | ||
992 | memcpy(bssid, wdev->auth_bsses[idx]->pub.bssid, ETH_ALEN); | 993 | memcpy(bssid, wdev->auth_bsses[idx]->pub.bssid, ETH_ALEN); |
993 | if (__cfg80211_mlme_deauth(rdev, dev, bssid, | 994 | if (__cfg80211_mlme_deauth(rdev, dev, bssid, |
994 | NULL, 0, WLAN_REASON_DEAUTH_LEAVING)) { | 995 | NULL, 0, WLAN_REASON_DEAUTH_LEAVING, |
996 | false)) { | ||
995 | /* whatever -- assume gone anyway */ | 997 | /* whatever -- assume gone anyway */ |
996 | cfg80211_unhold_bss(wdev->auth_bsses[idx]); | 998 | cfg80211_unhold_bss(wdev->auth_bsses[idx]); |
997 | cfg80211_put_bss(&wdev->auth_bsses[idx]->pub); | 999 | cfg80211_put_bss(&wdev->auth_bsses[idx]->pub); |
diff --git a/net/wireless/util.c b/net/wireless/util.c index d3574a4eb3ba..3416373a9c0c 100644 --- a/net/wireless/util.c +++ b/net/wireless/util.c | |||
@@ -331,11 +331,18 @@ int ieee80211_data_to_8023(struct sk_buff *skb, const u8 *addr, | |||
331 | if (iftype == NL80211_IFTYPE_MESH_POINT) { | 331 | if (iftype == NL80211_IFTYPE_MESH_POINT) { |
332 | struct ieee80211s_hdr *meshdr = | 332 | struct ieee80211s_hdr *meshdr = |
333 | (struct ieee80211s_hdr *) (skb->data + hdrlen); | 333 | (struct ieee80211s_hdr *) (skb->data + hdrlen); |
334 | hdrlen += ieee80211_get_mesh_hdrlen(meshdr); | 334 | /* make sure meshdr->flags is on the linear part */ |
335 | if (!pskb_may_pull(skb, hdrlen + 1)) | ||
336 | return -1; | ||
335 | if (meshdr->flags & MESH_FLAGS_AE_A5_A6) { | 337 | if (meshdr->flags & MESH_FLAGS_AE_A5_A6) { |
336 | memcpy(dst, meshdr->eaddr1, ETH_ALEN); | 338 | skb_copy_bits(skb, hdrlen + |
337 | memcpy(src, meshdr->eaddr2, ETH_ALEN); | 339 | offsetof(struct ieee80211s_hdr, eaddr1), |
340 | dst, ETH_ALEN); | ||
341 | skb_copy_bits(skb, hdrlen + | ||
342 | offsetof(struct ieee80211s_hdr, eaddr2), | ||
343 | src, ETH_ALEN); | ||
338 | } | 344 | } |
345 | hdrlen += ieee80211_get_mesh_hdrlen(meshdr); | ||
339 | } | 346 | } |
340 | break; | 347 | break; |
341 | case cpu_to_le16(IEEE80211_FCTL_FROMDS): | 348 | case cpu_to_le16(IEEE80211_FCTL_FROMDS): |
@@ -347,9 +354,14 @@ int ieee80211_data_to_8023(struct sk_buff *skb, const u8 *addr, | |||
347 | if (iftype == NL80211_IFTYPE_MESH_POINT) { | 354 | if (iftype == NL80211_IFTYPE_MESH_POINT) { |
348 | struct ieee80211s_hdr *meshdr = | 355 | struct ieee80211s_hdr *meshdr = |
349 | (struct ieee80211s_hdr *) (skb->data + hdrlen); | 356 | (struct ieee80211s_hdr *) (skb->data + hdrlen); |
350 | hdrlen += ieee80211_get_mesh_hdrlen(meshdr); | 357 | /* make sure meshdr->flags is on the linear part */ |
358 | if (!pskb_may_pull(skb, hdrlen + 1)) | ||
359 | return -1; | ||
351 | if (meshdr->flags & MESH_FLAGS_AE_A4) | 360 | if (meshdr->flags & MESH_FLAGS_AE_A4) |
352 | memcpy(src, meshdr->eaddr1, ETH_ALEN); | 361 | skb_copy_bits(skb, hdrlen + |
362 | offsetof(struct ieee80211s_hdr, eaddr1), | ||
363 | src, ETH_ALEN); | ||
364 | hdrlen += ieee80211_get_mesh_hdrlen(meshdr); | ||
353 | } | 365 | } |
354 | break; | 366 | break; |
355 | case cpu_to_le16(0): | 367 | case cpu_to_le16(0): |
@@ -358,7 +370,7 @@ int ieee80211_data_to_8023(struct sk_buff *skb, const u8 *addr, | |||
358 | break; | 370 | break; |
359 | } | 371 | } |
360 | 372 | ||
361 | if (unlikely(skb->len - hdrlen < 8)) | 373 | if (!pskb_may_pull(skb, hdrlen + 8)) |
362 | return -1; | 374 | return -1; |
363 | 375 | ||
364 | payload = skb->data + hdrlen; | 376 | payload = skb->data + hdrlen; |
diff --git a/net/wireless/wext-compat.c b/net/wireless/wext-compat.c index a60a2773b497..96342993cf93 100644 --- a/net/wireless/wext-compat.c +++ b/net/wireless/wext-compat.c | |||
@@ -782,16 +782,22 @@ int cfg80211_wext_siwfreq(struct net_device *dev, | |||
782 | return cfg80211_mgd_wext_siwfreq(dev, info, wextfreq, extra); | 782 | return cfg80211_mgd_wext_siwfreq(dev, info, wextfreq, extra); |
783 | case NL80211_IFTYPE_ADHOC: | 783 | case NL80211_IFTYPE_ADHOC: |
784 | return cfg80211_ibss_wext_siwfreq(dev, info, wextfreq, extra); | 784 | return cfg80211_ibss_wext_siwfreq(dev, info, wextfreq, extra); |
785 | default: | 785 | case NL80211_IFTYPE_MONITOR: |
786 | case NL80211_IFTYPE_WDS: | ||
787 | case NL80211_IFTYPE_MESH_POINT: | ||
786 | freq = cfg80211_wext_freq(wdev->wiphy, wextfreq); | 788 | freq = cfg80211_wext_freq(wdev->wiphy, wextfreq); |
787 | if (freq < 0) | 789 | if (freq < 0) |
788 | return freq; | 790 | return freq; |
789 | if (freq == 0) | 791 | if (freq == 0) |
790 | return -EINVAL; | 792 | return -EINVAL; |
793 | wdev_lock(wdev); | ||
791 | mutex_lock(&rdev->devlist_mtx); | 794 | mutex_lock(&rdev->devlist_mtx); |
792 | err = rdev_set_freq(rdev, NULL, freq, NL80211_CHAN_NO_HT); | 795 | err = cfg80211_set_freq(rdev, wdev, freq, NL80211_CHAN_NO_HT); |
793 | mutex_unlock(&rdev->devlist_mtx); | 796 | mutex_unlock(&rdev->devlist_mtx); |
797 | wdev_unlock(wdev); | ||
794 | return err; | 798 | return err; |
799 | default: | ||
800 | return -EOPNOTSUPP; | ||
795 | } | 801 | } |
796 | } | 802 | } |
797 | EXPORT_SYMBOL_GPL(cfg80211_wext_siwfreq); | 803 | EXPORT_SYMBOL_GPL(cfg80211_wext_siwfreq); |
@@ -801,7 +807,6 @@ int cfg80211_wext_giwfreq(struct net_device *dev, | |||
801 | struct iw_freq *freq, char *extra) | 807 | struct iw_freq *freq, char *extra) |
802 | { | 808 | { |
803 | struct wireless_dev *wdev = dev->ieee80211_ptr; | 809 | struct wireless_dev *wdev = dev->ieee80211_ptr; |
804 | struct cfg80211_registered_device *rdev = wiphy_to_dev(wdev->wiphy); | ||
805 | 810 | ||
806 | switch (wdev->iftype) { | 811 | switch (wdev->iftype) { |
807 | case NL80211_IFTYPE_STATION: | 812 | case NL80211_IFTYPE_STATION: |
@@ -809,9 +814,9 @@ int cfg80211_wext_giwfreq(struct net_device *dev, | |||
809 | case NL80211_IFTYPE_ADHOC: | 814 | case NL80211_IFTYPE_ADHOC: |
810 | return cfg80211_ibss_wext_giwfreq(dev, info, freq, extra); | 815 | return cfg80211_ibss_wext_giwfreq(dev, info, freq, extra); |
811 | default: | 816 | default: |
812 | if (!rdev->channel) | 817 | if (!wdev->channel) |
813 | return -EINVAL; | 818 | return -EINVAL; |
814 | freq->m = rdev->channel->center_freq; | 819 | freq->m = wdev->channel->center_freq; |
815 | freq->e = 6; | 820 | freq->e = 6; |
816 | return 0; | 821 | return 0; |
817 | } | 822 | } |
diff --git a/net/wireless/wext-core.c b/net/wireless/wext-core.c index 4f5a47091fde..0ef17bc42bac 100644 --- a/net/wireless/wext-core.c +++ b/net/wireless/wext-core.c | |||
@@ -29,226 +29,226 @@ typedef int (*wext_ioctl_func)(struct net_device *, struct iwreq *, | |||
29 | * know about. | 29 | * know about. |
30 | */ | 30 | */ |
31 | static const struct iw_ioctl_description standard_ioctl[] = { | 31 | static const struct iw_ioctl_description standard_ioctl[] = { |
32 | [SIOCSIWCOMMIT - SIOCIWFIRST] = { | 32 | [IW_IOCTL_IDX(SIOCSIWCOMMIT)] = { |
33 | .header_type = IW_HEADER_TYPE_NULL, | 33 | .header_type = IW_HEADER_TYPE_NULL, |
34 | }, | 34 | }, |
35 | [SIOCGIWNAME - SIOCIWFIRST] = { | 35 | [IW_IOCTL_IDX(SIOCGIWNAME)] = { |
36 | .header_type = IW_HEADER_TYPE_CHAR, | 36 | .header_type = IW_HEADER_TYPE_CHAR, |
37 | .flags = IW_DESCR_FLAG_DUMP, | 37 | .flags = IW_DESCR_FLAG_DUMP, |
38 | }, | 38 | }, |
39 | [SIOCSIWNWID - SIOCIWFIRST] = { | 39 | [IW_IOCTL_IDX(SIOCSIWNWID)] = { |
40 | .header_type = IW_HEADER_TYPE_PARAM, | 40 | .header_type = IW_HEADER_TYPE_PARAM, |
41 | .flags = IW_DESCR_FLAG_EVENT, | 41 | .flags = IW_DESCR_FLAG_EVENT, |
42 | }, | 42 | }, |
43 | [SIOCGIWNWID - SIOCIWFIRST] = { | 43 | [IW_IOCTL_IDX(SIOCGIWNWID)] = { |
44 | .header_type = IW_HEADER_TYPE_PARAM, | 44 | .header_type = IW_HEADER_TYPE_PARAM, |
45 | .flags = IW_DESCR_FLAG_DUMP, | 45 | .flags = IW_DESCR_FLAG_DUMP, |
46 | }, | 46 | }, |
47 | [SIOCSIWFREQ - SIOCIWFIRST] = { | 47 | [IW_IOCTL_IDX(SIOCSIWFREQ)] = { |
48 | .header_type = IW_HEADER_TYPE_FREQ, | 48 | .header_type = IW_HEADER_TYPE_FREQ, |
49 | .flags = IW_DESCR_FLAG_EVENT, | 49 | .flags = IW_DESCR_FLAG_EVENT, |
50 | }, | 50 | }, |
51 | [SIOCGIWFREQ - SIOCIWFIRST] = { | 51 | [IW_IOCTL_IDX(SIOCGIWFREQ)] = { |
52 | .header_type = IW_HEADER_TYPE_FREQ, | 52 | .header_type = IW_HEADER_TYPE_FREQ, |
53 | .flags = IW_DESCR_FLAG_DUMP, | 53 | .flags = IW_DESCR_FLAG_DUMP, |
54 | }, | 54 | }, |
55 | [SIOCSIWMODE - SIOCIWFIRST] = { | 55 | [IW_IOCTL_IDX(SIOCSIWMODE)] = { |
56 | .header_type = IW_HEADER_TYPE_UINT, | 56 | .header_type = IW_HEADER_TYPE_UINT, |
57 | .flags = IW_DESCR_FLAG_EVENT, | 57 | .flags = IW_DESCR_FLAG_EVENT, |
58 | }, | 58 | }, |
59 | [SIOCGIWMODE - SIOCIWFIRST] = { | 59 | [IW_IOCTL_IDX(SIOCGIWMODE)] = { |
60 | .header_type = IW_HEADER_TYPE_UINT, | 60 | .header_type = IW_HEADER_TYPE_UINT, |
61 | .flags = IW_DESCR_FLAG_DUMP, | 61 | .flags = IW_DESCR_FLAG_DUMP, |
62 | }, | 62 | }, |
63 | [SIOCSIWSENS - SIOCIWFIRST] = { | 63 | [IW_IOCTL_IDX(SIOCSIWSENS)] = { |
64 | .header_type = IW_HEADER_TYPE_PARAM, | 64 | .header_type = IW_HEADER_TYPE_PARAM, |
65 | }, | 65 | }, |
66 | [SIOCGIWSENS - SIOCIWFIRST] = { | 66 | [IW_IOCTL_IDX(SIOCGIWSENS)] = { |
67 | .header_type = IW_HEADER_TYPE_PARAM, | 67 | .header_type = IW_HEADER_TYPE_PARAM, |
68 | }, | 68 | }, |
69 | [SIOCSIWRANGE - SIOCIWFIRST] = { | 69 | [IW_IOCTL_IDX(SIOCSIWRANGE)] = { |
70 | .header_type = IW_HEADER_TYPE_NULL, | 70 | .header_type = IW_HEADER_TYPE_NULL, |
71 | }, | 71 | }, |
72 | [SIOCGIWRANGE - SIOCIWFIRST] = { | 72 | [IW_IOCTL_IDX(SIOCGIWRANGE)] = { |
73 | .header_type = IW_HEADER_TYPE_POINT, | 73 | .header_type = IW_HEADER_TYPE_POINT, |
74 | .token_size = 1, | 74 | .token_size = 1, |
75 | .max_tokens = sizeof(struct iw_range), | 75 | .max_tokens = sizeof(struct iw_range), |
76 | .flags = IW_DESCR_FLAG_DUMP, | 76 | .flags = IW_DESCR_FLAG_DUMP, |
77 | }, | 77 | }, |
78 | [SIOCSIWPRIV - SIOCIWFIRST] = { | 78 | [IW_IOCTL_IDX(SIOCSIWPRIV)] = { |
79 | .header_type = IW_HEADER_TYPE_NULL, | 79 | .header_type = IW_HEADER_TYPE_NULL, |
80 | }, | 80 | }, |
81 | [SIOCGIWPRIV - SIOCIWFIRST] = { /* (handled directly by us) */ | 81 | [IW_IOCTL_IDX(SIOCGIWPRIV)] = { /* (handled directly by us) */ |
82 | .header_type = IW_HEADER_TYPE_POINT, | 82 | .header_type = IW_HEADER_TYPE_POINT, |
83 | .token_size = sizeof(struct iw_priv_args), | 83 | .token_size = sizeof(struct iw_priv_args), |
84 | .max_tokens = 16, | 84 | .max_tokens = 16, |
85 | .flags = IW_DESCR_FLAG_NOMAX, | 85 | .flags = IW_DESCR_FLAG_NOMAX, |
86 | }, | 86 | }, |
87 | [SIOCSIWSTATS - SIOCIWFIRST] = { | 87 | [IW_IOCTL_IDX(SIOCSIWSTATS)] = { |
88 | .header_type = IW_HEADER_TYPE_NULL, | 88 | .header_type = IW_HEADER_TYPE_NULL, |
89 | }, | 89 | }, |
90 | [SIOCGIWSTATS - SIOCIWFIRST] = { /* (handled directly by us) */ | 90 | [IW_IOCTL_IDX(SIOCGIWSTATS)] = { /* (handled directly by us) */ |
91 | .header_type = IW_HEADER_TYPE_POINT, | 91 | .header_type = IW_HEADER_TYPE_POINT, |
92 | .token_size = 1, | 92 | .token_size = 1, |
93 | .max_tokens = sizeof(struct iw_statistics), | 93 | .max_tokens = sizeof(struct iw_statistics), |
94 | .flags = IW_DESCR_FLAG_DUMP, | 94 | .flags = IW_DESCR_FLAG_DUMP, |
95 | }, | 95 | }, |
96 | [SIOCSIWSPY - SIOCIWFIRST] = { | 96 | [IW_IOCTL_IDX(SIOCSIWSPY)] = { |
97 | .header_type = IW_HEADER_TYPE_POINT, | 97 | .header_type = IW_HEADER_TYPE_POINT, |
98 | .token_size = sizeof(struct sockaddr), | 98 | .token_size = sizeof(struct sockaddr), |
99 | .max_tokens = IW_MAX_SPY, | 99 | .max_tokens = IW_MAX_SPY, |
100 | }, | 100 | }, |
101 | [SIOCGIWSPY - SIOCIWFIRST] = { | 101 | [IW_IOCTL_IDX(SIOCGIWSPY)] = { |
102 | .header_type = IW_HEADER_TYPE_POINT, | 102 | .header_type = IW_HEADER_TYPE_POINT, |
103 | .token_size = sizeof(struct sockaddr) + | 103 | .token_size = sizeof(struct sockaddr) + |
104 | sizeof(struct iw_quality), | 104 | sizeof(struct iw_quality), |
105 | .max_tokens = IW_MAX_SPY, | 105 | .max_tokens = IW_MAX_SPY, |
106 | }, | 106 | }, |
107 | [SIOCSIWTHRSPY - SIOCIWFIRST] = { | 107 | [IW_IOCTL_IDX(SIOCSIWTHRSPY)] = { |
108 | .header_type = IW_HEADER_TYPE_POINT, | 108 | .header_type = IW_HEADER_TYPE_POINT, |
109 | .token_size = sizeof(struct iw_thrspy), | 109 | .token_size = sizeof(struct iw_thrspy), |
110 | .min_tokens = 1, | 110 | .min_tokens = 1, |
111 | .max_tokens = 1, | 111 | .max_tokens = 1, |
112 | }, | 112 | }, |
113 | [SIOCGIWTHRSPY - SIOCIWFIRST] = { | 113 | [IW_IOCTL_IDX(SIOCGIWTHRSPY)] = { |
114 | .header_type = IW_HEADER_TYPE_POINT, | 114 | .header_type = IW_HEADER_TYPE_POINT, |
115 | .token_size = sizeof(struct iw_thrspy), | 115 | .token_size = sizeof(struct iw_thrspy), |
116 | .min_tokens = 1, | 116 | .min_tokens = 1, |
117 | .max_tokens = 1, | 117 | .max_tokens = 1, |
118 | }, | 118 | }, |
119 | [SIOCSIWAP - SIOCIWFIRST] = { | 119 | [IW_IOCTL_IDX(SIOCSIWAP)] = { |
120 | .header_type = IW_HEADER_TYPE_ADDR, | 120 | .header_type = IW_HEADER_TYPE_ADDR, |
121 | }, | 121 | }, |
122 | [SIOCGIWAP - SIOCIWFIRST] = { | 122 | [IW_IOCTL_IDX(SIOCGIWAP)] = { |
123 | .header_type = IW_HEADER_TYPE_ADDR, | 123 | .header_type = IW_HEADER_TYPE_ADDR, |
124 | .flags = IW_DESCR_FLAG_DUMP, | 124 | .flags = IW_DESCR_FLAG_DUMP, |
125 | }, | 125 | }, |
126 | [SIOCSIWMLME - SIOCIWFIRST] = { | 126 | [IW_IOCTL_IDX(SIOCSIWMLME)] = { |
127 | .header_type = IW_HEADER_TYPE_POINT, | 127 | .header_type = IW_HEADER_TYPE_POINT, |
128 | .token_size = 1, | 128 | .token_size = 1, |
129 | .min_tokens = sizeof(struct iw_mlme), | 129 | .min_tokens = sizeof(struct iw_mlme), |
130 | .max_tokens = sizeof(struct iw_mlme), | 130 | .max_tokens = sizeof(struct iw_mlme), |
131 | }, | 131 | }, |
132 | [SIOCGIWAPLIST - SIOCIWFIRST] = { | 132 | [IW_IOCTL_IDX(SIOCGIWAPLIST)] = { |
133 | .header_type = IW_HEADER_TYPE_POINT, | 133 | .header_type = IW_HEADER_TYPE_POINT, |
134 | .token_size = sizeof(struct sockaddr) + | 134 | .token_size = sizeof(struct sockaddr) + |
135 | sizeof(struct iw_quality), | 135 | sizeof(struct iw_quality), |
136 | .max_tokens = IW_MAX_AP, | 136 | .max_tokens = IW_MAX_AP, |
137 | .flags = IW_DESCR_FLAG_NOMAX, | 137 | .flags = IW_DESCR_FLAG_NOMAX, |
138 | }, | 138 | }, |
139 | [SIOCSIWSCAN - SIOCIWFIRST] = { | 139 | [IW_IOCTL_IDX(SIOCSIWSCAN)] = { |
140 | .header_type = IW_HEADER_TYPE_POINT, | 140 | .header_type = IW_HEADER_TYPE_POINT, |
141 | .token_size = 1, | 141 | .token_size = 1, |
142 | .min_tokens = 0, | 142 | .min_tokens = 0, |
143 | .max_tokens = sizeof(struct iw_scan_req), | 143 | .max_tokens = sizeof(struct iw_scan_req), |
144 | }, | 144 | }, |
145 | [SIOCGIWSCAN - SIOCIWFIRST] = { | 145 | [IW_IOCTL_IDX(SIOCGIWSCAN)] = { |
146 | .header_type = IW_HEADER_TYPE_POINT, | 146 | .header_type = IW_HEADER_TYPE_POINT, |
147 | .token_size = 1, | 147 | .token_size = 1, |
148 | .max_tokens = IW_SCAN_MAX_DATA, | 148 | .max_tokens = IW_SCAN_MAX_DATA, |
149 | .flags = IW_DESCR_FLAG_NOMAX, | 149 | .flags = IW_DESCR_FLAG_NOMAX, |
150 | }, | 150 | }, |
151 | [SIOCSIWESSID - SIOCIWFIRST] = { | 151 | [IW_IOCTL_IDX(SIOCSIWESSID)] = { |
152 | .header_type = IW_HEADER_TYPE_POINT, | 152 | .header_type = IW_HEADER_TYPE_POINT, |
153 | .token_size = 1, | 153 | .token_size = 1, |
154 | .max_tokens = IW_ESSID_MAX_SIZE, | 154 | .max_tokens = IW_ESSID_MAX_SIZE, |
155 | .flags = IW_DESCR_FLAG_EVENT, | 155 | .flags = IW_DESCR_FLAG_EVENT, |
156 | }, | 156 | }, |
157 | [SIOCGIWESSID - SIOCIWFIRST] = { | 157 | [IW_IOCTL_IDX(SIOCGIWESSID)] = { |
158 | .header_type = IW_HEADER_TYPE_POINT, | 158 | .header_type = IW_HEADER_TYPE_POINT, |
159 | .token_size = 1, | 159 | .token_size = 1, |
160 | .max_tokens = IW_ESSID_MAX_SIZE, | 160 | .max_tokens = IW_ESSID_MAX_SIZE, |
161 | .flags = IW_DESCR_FLAG_DUMP, | 161 | .flags = IW_DESCR_FLAG_DUMP, |
162 | }, | 162 | }, |
163 | [SIOCSIWNICKN - SIOCIWFIRST] = { | 163 | [IW_IOCTL_IDX(SIOCSIWNICKN)] = { |
164 | .header_type = IW_HEADER_TYPE_POINT, | 164 | .header_type = IW_HEADER_TYPE_POINT, |
165 | .token_size = 1, | 165 | .token_size = 1, |
166 | .max_tokens = IW_ESSID_MAX_SIZE, | 166 | .max_tokens = IW_ESSID_MAX_SIZE, |
167 | }, | 167 | }, |
168 | [SIOCGIWNICKN - SIOCIWFIRST] = { | 168 | [IW_IOCTL_IDX(SIOCGIWNICKN)] = { |
169 | .header_type = IW_HEADER_TYPE_POINT, | 169 | .header_type = IW_HEADER_TYPE_POINT, |
170 | .token_size = 1, | 170 | .token_size = 1, |
171 | .max_tokens = IW_ESSID_MAX_SIZE, | 171 | .max_tokens = IW_ESSID_MAX_SIZE, |
172 | }, | 172 | }, |
173 | [SIOCSIWRATE - SIOCIWFIRST] = { | 173 | [IW_IOCTL_IDX(SIOCSIWRATE)] = { |
174 | .header_type = IW_HEADER_TYPE_PARAM, | 174 | .header_type = IW_HEADER_TYPE_PARAM, |
175 | }, | 175 | }, |
176 | [SIOCGIWRATE - SIOCIWFIRST] = { | 176 | [IW_IOCTL_IDX(SIOCGIWRATE)] = { |
177 | .header_type = IW_HEADER_TYPE_PARAM, | 177 | .header_type = IW_HEADER_TYPE_PARAM, |
178 | }, | 178 | }, |
179 | [SIOCSIWRTS - SIOCIWFIRST] = { | 179 | [IW_IOCTL_IDX(SIOCSIWRTS)] = { |
180 | .header_type = IW_HEADER_TYPE_PARAM, | 180 | .header_type = IW_HEADER_TYPE_PARAM, |
181 | }, | 181 | }, |
182 | [SIOCGIWRTS - SIOCIWFIRST] = { | 182 | [IW_IOCTL_IDX(SIOCGIWRTS)] = { |
183 | .header_type = IW_HEADER_TYPE_PARAM, | 183 | .header_type = IW_HEADER_TYPE_PARAM, |
184 | }, | 184 | }, |
185 | [SIOCSIWFRAG - SIOCIWFIRST] = { | 185 | [IW_IOCTL_IDX(SIOCSIWFRAG)] = { |
186 | .header_type = IW_HEADER_TYPE_PARAM, | 186 | .header_type = IW_HEADER_TYPE_PARAM, |
187 | }, | 187 | }, |
188 | [SIOCGIWFRAG - SIOCIWFIRST] = { | 188 | [IW_IOCTL_IDX(SIOCGIWFRAG)] = { |
189 | .header_type = IW_HEADER_TYPE_PARAM, | 189 | .header_type = IW_HEADER_TYPE_PARAM, |
190 | }, | 190 | }, |
191 | [SIOCSIWTXPOW - SIOCIWFIRST] = { | 191 | [IW_IOCTL_IDX(SIOCSIWTXPOW)] = { |
192 | .header_type = IW_HEADER_TYPE_PARAM, | 192 | .header_type = IW_HEADER_TYPE_PARAM, |
193 | }, | 193 | }, |
194 | [SIOCGIWTXPOW - SIOCIWFIRST] = { | 194 | [IW_IOCTL_IDX(SIOCGIWTXPOW)] = { |
195 | .header_type = IW_HEADER_TYPE_PARAM, | 195 | .header_type = IW_HEADER_TYPE_PARAM, |
196 | }, | 196 | }, |
197 | [SIOCSIWRETRY - SIOCIWFIRST] = { | 197 | [IW_IOCTL_IDX(SIOCSIWRETRY)] = { |
198 | .header_type = IW_HEADER_TYPE_PARAM, | 198 | .header_type = IW_HEADER_TYPE_PARAM, |
199 | }, | 199 | }, |
200 | [SIOCGIWRETRY - SIOCIWFIRST] = { | 200 | [IW_IOCTL_IDX(SIOCGIWRETRY)] = { |
201 | .header_type = IW_HEADER_TYPE_PARAM, | 201 | .header_type = IW_HEADER_TYPE_PARAM, |
202 | }, | 202 | }, |
203 | [SIOCSIWENCODE - SIOCIWFIRST] = { | 203 | [IW_IOCTL_IDX(SIOCSIWENCODE)] = { |
204 | .header_type = IW_HEADER_TYPE_POINT, | 204 | .header_type = IW_HEADER_TYPE_POINT, |
205 | .token_size = 1, | 205 | .token_size = 1, |
206 | .max_tokens = IW_ENCODING_TOKEN_MAX, | 206 | .max_tokens = IW_ENCODING_TOKEN_MAX, |
207 | .flags = IW_DESCR_FLAG_EVENT | IW_DESCR_FLAG_RESTRICT, | 207 | .flags = IW_DESCR_FLAG_EVENT | IW_DESCR_FLAG_RESTRICT, |
208 | }, | 208 | }, |
209 | [SIOCGIWENCODE - SIOCIWFIRST] = { | 209 | [IW_IOCTL_IDX(SIOCGIWENCODE)] = { |
210 | .header_type = IW_HEADER_TYPE_POINT, | 210 | .header_type = IW_HEADER_TYPE_POINT, |
211 | .token_size = 1, | 211 | .token_size = 1, |
212 | .max_tokens = IW_ENCODING_TOKEN_MAX, | 212 | .max_tokens = IW_ENCODING_TOKEN_MAX, |
213 | .flags = IW_DESCR_FLAG_DUMP | IW_DESCR_FLAG_RESTRICT, | 213 | .flags = IW_DESCR_FLAG_DUMP | IW_DESCR_FLAG_RESTRICT, |
214 | }, | 214 | }, |
215 | [SIOCSIWPOWER - SIOCIWFIRST] = { | 215 | [IW_IOCTL_IDX(SIOCSIWPOWER)] = { |
216 | .header_type = IW_HEADER_TYPE_PARAM, | 216 | .header_type = IW_HEADER_TYPE_PARAM, |
217 | }, | 217 | }, |
218 | [SIOCGIWPOWER - SIOCIWFIRST] = { | 218 | [IW_IOCTL_IDX(SIOCGIWPOWER)] = { |
219 | .header_type = IW_HEADER_TYPE_PARAM, | 219 | .header_type = IW_HEADER_TYPE_PARAM, |
220 | }, | 220 | }, |
221 | [SIOCSIWGENIE - SIOCIWFIRST] = { | 221 | [IW_IOCTL_IDX(SIOCSIWGENIE)] = { |
222 | .header_type = IW_HEADER_TYPE_POINT, | 222 | .header_type = IW_HEADER_TYPE_POINT, |
223 | .token_size = 1, | 223 | .token_size = 1, |
224 | .max_tokens = IW_GENERIC_IE_MAX, | 224 | .max_tokens = IW_GENERIC_IE_MAX, |
225 | }, | 225 | }, |
226 | [SIOCGIWGENIE - SIOCIWFIRST] = { | 226 | [IW_IOCTL_IDX(SIOCGIWGENIE)] = { |
227 | .header_type = IW_HEADER_TYPE_POINT, | 227 | .header_type = IW_HEADER_TYPE_POINT, |
228 | .token_size = 1, | 228 | .token_size = 1, |
229 | .max_tokens = IW_GENERIC_IE_MAX, | 229 | .max_tokens = IW_GENERIC_IE_MAX, |
230 | }, | 230 | }, |
231 | [SIOCSIWAUTH - SIOCIWFIRST] = { | 231 | [IW_IOCTL_IDX(SIOCSIWAUTH)] = { |
232 | .header_type = IW_HEADER_TYPE_PARAM, | 232 | .header_type = IW_HEADER_TYPE_PARAM, |
233 | }, | 233 | }, |
234 | [SIOCGIWAUTH - SIOCIWFIRST] = { | 234 | [IW_IOCTL_IDX(SIOCGIWAUTH)] = { |
235 | .header_type = IW_HEADER_TYPE_PARAM, | 235 | .header_type = IW_HEADER_TYPE_PARAM, |
236 | }, | 236 | }, |
237 | [SIOCSIWENCODEEXT - SIOCIWFIRST] = { | 237 | [IW_IOCTL_IDX(SIOCSIWENCODEEXT)] = { |
238 | .header_type = IW_HEADER_TYPE_POINT, | 238 | .header_type = IW_HEADER_TYPE_POINT, |
239 | .token_size = 1, | 239 | .token_size = 1, |
240 | .min_tokens = sizeof(struct iw_encode_ext), | 240 | .min_tokens = sizeof(struct iw_encode_ext), |
241 | .max_tokens = sizeof(struct iw_encode_ext) + | 241 | .max_tokens = sizeof(struct iw_encode_ext) + |
242 | IW_ENCODING_TOKEN_MAX, | 242 | IW_ENCODING_TOKEN_MAX, |
243 | }, | 243 | }, |
244 | [SIOCGIWENCODEEXT - SIOCIWFIRST] = { | 244 | [IW_IOCTL_IDX(SIOCGIWENCODEEXT)] = { |
245 | .header_type = IW_HEADER_TYPE_POINT, | 245 | .header_type = IW_HEADER_TYPE_POINT, |
246 | .token_size = 1, | 246 | .token_size = 1, |
247 | .min_tokens = sizeof(struct iw_encode_ext), | 247 | .min_tokens = sizeof(struct iw_encode_ext), |
248 | .max_tokens = sizeof(struct iw_encode_ext) + | 248 | .max_tokens = sizeof(struct iw_encode_ext) + |
249 | IW_ENCODING_TOKEN_MAX, | 249 | IW_ENCODING_TOKEN_MAX, |
250 | }, | 250 | }, |
251 | [SIOCSIWPMKSA - SIOCIWFIRST] = { | 251 | [IW_IOCTL_IDX(SIOCSIWPMKSA)] = { |
252 | .header_type = IW_HEADER_TYPE_POINT, | 252 | .header_type = IW_HEADER_TYPE_POINT, |
253 | .token_size = 1, | 253 | .token_size = 1, |
254 | .min_tokens = sizeof(struct iw_pmksa), | 254 | .min_tokens = sizeof(struct iw_pmksa), |
@@ -262,44 +262,44 @@ static const unsigned standard_ioctl_num = ARRAY_SIZE(standard_ioctl); | |||
262 | * we know about. | 262 | * we know about. |
263 | */ | 263 | */ |
264 | static const struct iw_ioctl_description standard_event[] = { | 264 | static const struct iw_ioctl_description standard_event[] = { |
265 | [IWEVTXDROP - IWEVFIRST] = { | 265 | [IW_EVENT_IDX(IWEVTXDROP)] = { |
266 | .header_type = IW_HEADER_TYPE_ADDR, | 266 | .header_type = IW_HEADER_TYPE_ADDR, |
267 | }, | 267 | }, |
268 | [IWEVQUAL - IWEVFIRST] = { | 268 | [IW_EVENT_IDX(IWEVQUAL)] = { |
269 | .header_type = IW_HEADER_TYPE_QUAL, | 269 | .header_type = IW_HEADER_TYPE_QUAL, |
270 | }, | 270 | }, |
271 | [IWEVCUSTOM - IWEVFIRST] = { | 271 | [IW_EVENT_IDX(IWEVCUSTOM)] = { |
272 | .header_type = IW_HEADER_TYPE_POINT, | 272 | .header_type = IW_HEADER_TYPE_POINT, |
273 | .token_size = 1, | 273 | .token_size = 1, |
274 | .max_tokens = IW_CUSTOM_MAX, | 274 | .max_tokens = IW_CUSTOM_MAX, |
275 | }, | 275 | }, |
276 | [IWEVREGISTERED - IWEVFIRST] = { | 276 | [IW_EVENT_IDX(IWEVREGISTERED)] = { |
277 | .header_type = IW_HEADER_TYPE_ADDR, | 277 | .header_type = IW_HEADER_TYPE_ADDR, |
278 | }, | 278 | }, |
279 | [IWEVEXPIRED - IWEVFIRST] = { | 279 | [IW_EVENT_IDX(IWEVEXPIRED)] = { |
280 | .header_type = IW_HEADER_TYPE_ADDR, | 280 | .header_type = IW_HEADER_TYPE_ADDR, |
281 | }, | 281 | }, |
282 | [IWEVGENIE - IWEVFIRST] = { | 282 | [IW_EVENT_IDX(IWEVGENIE)] = { |
283 | .header_type = IW_HEADER_TYPE_POINT, | 283 | .header_type = IW_HEADER_TYPE_POINT, |
284 | .token_size = 1, | 284 | .token_size = 1, |
285 | .max_tokens = IW_GENERIC_IE_MAX, | 285 | .max_tokens = IW_GENERIC_IE_MAX, |
286 | }, | 286 | }, |
287 | [IWEVMICHAELMICFAILURE - IWEVFIRST] = { | 287 | [IW_EVENT_IDX(IWEVMICHAELMICFAILURE)] = { |
288 | .header_type = IW_HEADER_TYPE_POINT, | 288 | .header_type = IW_HEADER_TYPE_POINT, |
289 | .token_size = 1, | 289 | .token_size = 1, |
290 | .max_tokens = sizeof(struct iw_michaelmicfailure), | 290 | .max_tokens = sizeof(struct iw_michaelmicfailure), |
291 | }, | 291 | }, |
292 | [IWEVASSOCREQIE - IWEVFIRST] = { | 292 | [IW_EVENT_IDX(IWEVASSOCREQIE)] = { |
293 | .header_type = IW_HEADER_TYPE_POINT, | 293 | .header_type = IW_HEADER_TYPE_POINT, |
294 | .token_size = 1, | 294 | .token_size = 1, |
295 | .max_tokens = IW_GENERIC_IE_MAX, | 295 | .max_tokens = IW_GENERIC_IE_MAX, |
296 | }, | 296 | }, |
297 | [IWEVASSOCRESPIE - IWEVFIRST] = { | 297 | [IW_EVENT_IDX(IWEVASSOCRESPIE)] = { |
298 | .header_type = IW_HEADER_TYPE_POINT, | 298 | .header_type = IW_HEADER_TYPE_POINT, |
299 | .token_size = 1, | 299 | .token_size = 1, |
300 | .max_tokens = IW_GENERIC_IE_MAX, | 300 | .max_tokens = IW_GENERIC_IE_MAX, |
301 | }, | 301 | }, |
302 | [IWEVPMKIDCAND - IWEVFIRST] = { | 302 | [IW_EVENT_IDX(IWEVPMKIDCAND)] = { |
303 | .header_type = IW_HEADER_TYPE_POINT, | 303 | .header_type = IW_HEADER_TYPE_POINT, |
304 | .token_size = 1, | 304 | .token_size = 1, |
305 | .max_tokens = sizeof(struct iw_pmkid_cand), | 305 | .max_tokens = sizeof(struct iw_pmkid_cand), |
@@ -450,11 +450,11 @@ void wireless_send_event(struct net_device * dev, | |||
450 | 450 | ||
451 | /* Get the description of the Event */ | 451 | /* Get the description of the Event */ |
452 | if (cmd <= SIOCIWLAST) { | 452 | if (cmd <= SIOCIWLAST) { |
453 | cmd_index = cmd - SIOCIWFIRST; | 453 | cmd_index = IW_IOCTL_IDX(cmd); |
454 | if (cmd_index < standard_ioctl_num) | 454 | if (cmd_index < standard_ioctl_num) |
455 | descr = &(standard_ioctl[cmd_index]); | 455 | descr = &(standard_ioctl[cmd_index]); |
456 | } else { | 456 | } else { |
457 | cmd_index = cmd - IWEVFIRST; | 457 | cmd_index = IW_EVENT_IDX(cmd); |
458 | if (cmd_index < standard_event_num) | 458 | if (cmd_index < standard_event_num) |
459 | descr = &(standard_event[cmd_index]); | 459 | descr = &(standard_event[cmd_index]); |
460 | } | 460 | } |
@@ -663,7 +663,7 @@ static iw_handler get_handler(struct net_device *dev, unsigned int cmd) | |||
663 | return NULL; | 663 | return NULL; |
664 | 664 | ||
665 | /* Try as a standard command */ | 665 | /* Try as a standard command */ |
666 | index = cmd - SIOCIWFIRST; | 666 | index = IW_IOCTL_IDX(cmd); |
667 | if (index < handlers->num_standard) | 667 | if (index < handlers->num_standard) |
668 | return handlers->standard[index]; | 668 | return handlers->standard[index]; |
669 | 669 | ||
@@ -955,9 +955,9 @@ static int ioctl_standard_call(struct net_device * dev, | |||
955 | int ret = -EINVAL; | 955 | int ret = -EINVAL; |
956 | 956 | ||
957 | /* Get the description of the IOCTL */ | 957 | /* Get the description of the IOCTL */ |
958 | if ((cmd - SIOCIWFIRST) >= standard_ioctl_num) | 958 | if (IW_IOCTL_IDX(cmd) >= standard_ioctl_num) |
959 | return -EOPNOTSUPP; | 959 | return -EOPNOTSUPP; |
960 | descr = &(standard_ioctl[cmd - SIOCIWFIRST]); | 960 | descr = &(standard_ioctl[IW_IOCTL_IDX(cmd)]); |
961 | 961 | ||
962 | /* Check if we have a pointer to user space data or not */ | 962 | /* Check if we have a pointer to user space data or not */ |
963 | if (descr->header_type != IW_HEADER_TYPE_POINT) { | 963 | if (descr->header_type != IW_HEADER_TYPE_POINT) { |
@@ -1013,7 +1013,7 @@ static int compat_standard_call(struct net_device *dev, | |||
1013 | struct iw_point iwp; | 1013 | struct iw_point iwp; |
1014 | int err; | 1014 | int err; |
1015 | 1015 | ||
1016 | descr = standard_ioctl + (cmd - SIOCIWFIRST); | 1016 | descr = standard_ioctl + IW_IOCTL_IDX(cmd); |
1017 | 1017 | ||
1018 | if (descr->header_type != IW_HEADER_TYPE_POINT) | 1018 | if (descr->header_type != IW_HEADER_TYPE_POINT) |
1019 | return ioctl_standard_call(dev, iwr, cmd, info, handler); | 1019 | return ioctl_standard_call(dev, iwr, cmd, info, handler); |
diff --git a/net/wireless/wext-sme.c b/net/wireless/wext-sme.c index d5c6140f4cb8..9818198add8a 100644 --- a/net/wireless/wext-sme.c +++ b/net/wireless/wext-sme.c | |||
@@ -108,7 +108,7 @@ int cfg80211_mgd_wext_siwfreq(struct net_device *dev, | |||
108 | 108 | ||
109 | /* SSID is not set, we just want to switch channel */ | 109 | /* SSID is not set, we just want to switch channel */ |
110 | if (chan && !wdev->wext.connect.ssid_len) { | 110 | if (chan && !wdev->wext.connect.ssid_len) { |
111 | err = rdev_set_freq(rdev, wdev, freq, NL80211_CHAN_NO_HT); | 111 | err = cfg80211_set_freq(rdev, wdev, freq, NL80211_CHAN_NO_HT); |
112 | goto out; | 112 | goto out; |
113 | } | 113 | } |
114 | 114 | ||