aboutsummaryrefslogtreecommitdiffstats
path: root/net/wireless/wext-compat.c
diff options
context:
space:
mode:
authorGlenn Elliott <gelliott@cs.unc.edu>2012-03-04 19:47:13 -0500
committerGlenn Elliott <gelliott@cs.unc.edu>2012-03-04 19:47:13 -0500
commitc71c03bda1e86c9d5198c5d83f712e695c4f2a1e (patch)
treeecb166cb3e2b7e2adb3b5e292245fefd23381ac8 /net/wireless/wext-compat.c
parentea53c912f8a86a8567697115b6a0d8152beee5c8 (diff)
parent6a00f206debf8a5c8899055726ad127dbeeed098 (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.c59
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,
432EXPORT_SYMBOL_GPL(cfg80211_wext_giwretry); 435EXPORT_SYMBOL_GPL(cfg80211_wext_giwretry);
433 436
434static int __cfg80211_set_encryption(struct cfg80211_registered_device *rdev, 437static 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
565static int cfg80211_set_encryption(struct cfg80211_registered_device *rdev, 578static 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, &params); 653 idx, &params);
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, &params); 745 idx, &params);
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}