diff options
author | Glenn Elliott <gelliott@cs.unc.edu> | 2012-03-04 19:47:13 -0500 |
---|---|---|
committer | Glenn Elliott <gelliott@cs.unc.edu> | 2012-03-04 19:47:13 -0500 |
commit | c71c03bda1e86c9d5198c5d83f712e695c4f2a1e (patch) | |
tree | ecb166cb3e2b7e2adb3b5e292245fefd23381ac8 /net/wireless/wext-compat.c | |
parent | ea53c912f8a86a8567697115b6a0d8152beee5c8 (diff) | |
parent | 6a00f206debf8a5c8899055726ad127dbeeed098 (diff) |
Merge branch 'mpi-master' into wip-k-fmlpwip-k-fmlp
Conflicts:
litmus/sched_cedf.c
Diffstat (limited to 'net/wireless/wext-compat.c')
-rw-r--r-- | net/wireless/wext-compat.c | 59 |
1 files changed, 39 insertions, 20 deletions
diff --git a/net/wireless/wext-compat.c b/net/wireless/wext-compat.c index 7e5c3a45f811..0bf169bb770e 100644 --- a/net/wireless/wext-compat.c +++ b/net/wireless/wext-compat.c | |||
@@ -267,9 +267,12 @@ int cfg80211_wext_freq(struct wiphy *wiphy, struct iw_freq *freq) | |||
267 | * -EINVAL for impossible things. | 267 | * -EINVAL for impossible things. |
268 | */ | 268 | */ |
269 | if (freq->e == 0) { | 269 | if (freq->e == 0) { |
270 | enum ieee80211_band band = IEEE80211_BAND_2GHZ; | ||
270 | if (freq->m < 0) | 271 | if (freq->m < 0) |
271 | return 0; | 272 | return 0; |
272 | return ieee80211_channel_to_frequency(freq->m); | 273 | if (freq->m > 14) |
274 | band = IEEE80211_BAND_5GHZ; | ||
275 | return ieee80211_channel_to_frequency(freq->m, band); | ||
273 | } else { | 276 | } else { |
274 | int i, div = 1000000; | 277 | int i, div = 1000000; |
275 | for (i = 0; i < freq->e; i++) | 278 | for (i = 0; i < freq->e; i++) |
@@ -432,14 +435,17 @@ int cfg80211_wext_giwretry(struct net_device *dev, | |||
432 | EXPORT_SYMBOL_GPL(cfg80211_wext_giwretry); | 435 | EXPORT_SYMBOL_GPL(cfg80211_wext_giwretry); |
433 | 436 | ||
434 | static int __cfg80211_set_encryption(struct cfg80211_registered_device *rdev, | 437 | static int __cfg80211_set_encryption(struct cfg80211_registered_device *rdev, |
435 | struct net_device *dev, const u8 *addr, | 438 | struct net_device *dev, bool pairwise, |
436 | bool remove, bool tx_key, int idx, | 439 | const u8 *addr, bool remove, bool tx_key, |
437 | struct key_params *params) | 440 | int idx, struct key_params *params) |
438 | { | 441 | { |
439 | struct wireless_dev *wdev = dev->ieee80211_ptr; | 442 | struct wireless_dev *wdev = dev->ieee80211_ptr; |
440 | int err, i; | 443 | int err, i; |
441 | bool rejoin = false; | 444 | bool rejoin = false; |
442 | 445 | ||
446 | if (pairwise && !addr) | ||
447 | return -EINVAL; | ||
448 | |||
443 | if (!wdev->wext.keys) { | 449 | if (!wdev->wext.keys) { |
444 | wdev->wext.keys = kzalloc(sizeof(*wdev->wext.keys), | 450 | wdev->wext.keys = kzalloc(sizeof(*wdev->wext.keys), |
445 | GFP_KERNEL); | 451 | GFP_KERNEL); |
@@ -478,7 +484,13 @@ static int __cfg80211_set_encryption(struct cfg80211_registered_device *rdev, | |||
478 | __cfg80211_leave_ibss(rdev, wdev->netdev, true); | 484 | __cfg80211_leave_ibss(rdev, wdev->netdev, true); |
479 | rejoin = true; | 485 | rejoin = true; |
480 | } | 486 | } |
481 | err = rdev->ops->del_key(&rdev->wiphy, dev, idx, addr); | 487 | |
488 | if (!pairwise && addr && | ||
489 | !(rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN)) | ||
490 | err = -ENOENT; | ||
491 | else | ||
492 | err = rdev->ops->del_key(&rdev->wiphy, dev, idx, | ||
493 | pairwise, addr); | ||
482 | } | 494 | } |
483 | wdev->wext.connect.privacy = false; | 495 | wdev->wext.connect.privacy = false; |
484 | /* | 496 | /* |
@@ -507,12 +519,13 @@ static int __cfg80211_set_encryption(struct cfg80211_registered_device *rdev, | |||
507 | if (addr) | 519 | if (addr) |
508 | tx_key = false; | 520 | tx_key = false; |
509 | 521 | ||
510 | if (cfg80211_validate_key_settings(rdev, params, idx, addr)) | 522 | if (cfg80211_validate_key_settings(rdev, params, idx, pairwise, addr)) |
511 | return -EINVAL; | 523 | return -EINVAL; |
512 | 524 | ||
513 | err = 0; | 525 | err = 0; |
514 | if (wdev->current_bss) | 526 | if (wdev->current_bss) |
515 | err = rdev->ops->add_key(&rdev->wiphy, dev, idx, addr, params); | 527 | err = rdev->ops->add_key(&rdev->wiphy, dev, idx, |
528 | pairwise, addr, params); | ||
516 | if (err) | 529 | if (err) |
517 | return err; | 530 | return err; |
518 | 531 | ||
@@ -538,8 +551,8 @@ static int __cfg80211_set_encryption(struct cfg80211_registered_device *rdev, | |||
538 | __cfg80211_leave_ibss(rdev, wdev->netdev, true); | 551 | __cfg80211_leave_ibss(rdev, wdev->netdev, true); |
539 | rejoin = true; | 552 | rejoin = true; |
540 | } | 553 | } |
541 | err = rdev->ops->set_default_key(&rdev->wiphy, | 554 | err = rdev->ops->set_default_key(&rdev->wiphy, dev, |
542 | dev, idx); | 555 | idx, true, true); |
543 | } | 556 | } |
544 | if (!err) { | 557 | if (!err) { |
545 | wdev->wext.default_key = idx; | 558 | wdev->wext.default_key = idx; |
@@ -563,17 +576,17 @@ static int __cfg80211_set_encryption(struct cfg80211_registered_device *rdev, | |||
563 | } | 576 | } |
564 | 577 | ||
565 | static int cfg80211_set_encryption(struct cfg80211_registered_device *rdev, | 578 | static int cfg80211_set_encryption(struct cfg80211_registered_device *rdev, |
566 | struct net_device *dev, const u8 *addr, | 579 | struct net_device *dev, bool pairwise, |
567 | bool remove, bool tx_key, int idx, | 580 | const u8 *addr, bool remove, bool tx_key, |
568 | struct key_params *params) | 581 | int idx, struct key_params *params) |
569 | { | 582 | { |
570 | int err; | 583 | int err; |
571 | 584 | ||
572 | /* devlist mutex needed for possible IBSS re-join */ | 585 | /* devlist mutex needed for possible IBSS re-join */ |
573 | mutex_lock(&rdev->devlist_mtx); | 586 | mutex_lock(&rdev->devlist_mtx); |
574 | wdev_lock(dev->ieee80211_ptr); | 587 | wdev_lock(dev->ieee80211_ptr); |
575 | err = __cfg80211_set_encryption(rdev, dev, addr, remove, | 588 | err = __cfg80211_set_encryption(rdev, dev, pairwise, addr, |
576 | tx_key, idx, params); | 589 | remove, tx_key, idx, params); |
577 | wdev_unlock(dev->ieee80211_ptr); | 590 | wdev_unlock(dev->ieee80211_ptr); |
578 | mutex_unlock(&rdev->devlist_mtx); | 591 | mutex_unlock(&rdev->devlist_mtx); |
579 | 592 | ||
@@ -617,8 +630,8 @@ int cfg80211_wext_siwencode(struct net_device *dev, | |||
617 | err = 0; | 630 | err = 0; |
618 | wdev_lock(wdev); | 631 | wdev_lock(wdev); |
619 | if (wdev->current_bss) | 632 | if (wdev->current_bss) |
620 | err = rdev->ops->set_default_key(&rdev->wiphy, | 633 | err = rdev->ops->set_default_key(&rdev->wiphy, dev, |
621 | dev, idx); | 634 | idx, true, true); |
622 | if (!err) | 635 | if (!err) |
623 | wdev->wext.default_key = idx; | 636 | wdev->wext.default_key = idx; |
624 | wdev_unlock(wdev); | 637 | wdev_unlock(wdev); |
@@ -635,7 +648,7 @@ int cfg80211_wext_siwencode(struct net_device *dev, | |||
635 | else if (!remove) | 648 | else if (!remove) |
636 | return -EINVAL; | 649 | return -EINVAL; |
637 | 650 | ||
638 | return cfg80211_set_encryption(rdev, dev, NULL, remove, | 651 | return cfg80211_set_encryption(rdev, dev, false, NULL, remove, |
639 | wdev->wext.default_key == -1, | 652 | wdev->wext.default_key == -1, |
640 | idx, ¶ms); | 653 | idx, ¶ms); |
641 | } | 654 | } |
@@ -725,7 +738,9 @@ int cfg80211_wext_siwencodeext(struct net_device *dev, | |||
725 | } | 738 | } |
726 | 739 | ||
727 | return cfg80211_set_encryption( | 740 | return cfg80211_set_encryption( |
728 | rdev, dev, addr, remove, | 741 | rdev, dev, |
742 | !(ext->ext_flags & IW_ENCODE_EXT_GROUP_KEY), | ||
743 | addr, remove, | ||
729 | ext->ext_flags & IW_ENCODE_EXT_SET_TX_KEY, | 744 | ext->ext_flags & IW_ENCODE_EXT_SET_TX_KEY, |
730 | idx, ¶ms); | 745 | idx, ¶ms); |
731 | } | 746 | } |
@@ -790,11 +805,11 @@ int cfg80211_wext_siwfreq(struct net_device *dev, | |||
790 | return freq; | 805 | return freq; |
791 | if (freq == 0) | 806 | if (freq == 0) |
792 | return -EINVAL; | 807 | return -EINVAL; |
793 | wdev_lock(wdev); | ||
794 | mutex_lock(&rdev->devlist_mtx); | 808 | mutex_lock(&rdev->devlist_mtx); |
809 | wdev_lock(wdev); | ||
795 | err = cfg80211_set_freq(rdev, wdev, freq, NL80211_CHAN_NO_HT); | 810 | err = cfg80211_set_freq(rdev, wdev, freq, NL80211_CHAN_NO_HT); |
796 | mutex_unlock(&rdev->devlist_mtx); | ||
797 | wdev_unlock(wdev); | 811 | wdev_unlock(wdev); |
812 | mutex_unlock(&rdev->devlist_mtx); | ||
798 | return err; | 813 | return err; |
799 | default: | 814 | default: |
800 | return -EOPNOTSUPP; | 815 | return -EOPNOTSUPP; |
@@ -1354,6 +1369,10 @@ struct iw_statistics *cfg80211_wireless_stats(struct net_device *dev) | |||
1354 | } | 1369 | } |
1355 | 1370 | ||
1356 | wstats.qual.updated |= IW_QUAL_NOISE_INVALID; | 1371 | wstats.qual.updated |= IW_QUAL_NOISE_INVALID; |
1372 | if (sinfo.filled & STATION_INFO_RX_DROP_MISC) | ||
1373 | wstats.discard.misc = sinfo.rx_dropped_misc; | ||
1374 | if (sinfo.filled & STATION_INFO_TX_FAILED) | ||
1375 | wstats.discard.retries = sinfo.tx_failed; | ||
1357 | 1376 | ||
1358 | return &wstats; | 1377 | return &wstats; |
1359 | } | 1378 | } |