diff options
author | John W. Linville <linville@tuxdriver.com> | 2014-01-13 14:40:59 -0500 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2014-01-13 14:40:59 -0500 |
commit | f13352519ee8c4b22b87fc1a47743d1f53ea193e (patch) | |
tree | 48c18144f3e5e530ec61d5eadbb5a34675a69fe8 /net/wireless | |
parent | 559c33d84da71e07816e692bfd73ad92675256a6 (diff) | |
parent | 26b0e411d37a2ca5992d02884dc3fa4e1907e598 (diff) |
Merge branch 'for-john' of git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211-next
Diffstat (limited to 'net/wireless')
-rw-r--r-- | net/wireless/nl80211.c | 111 | ||||
-rw-r--r-- | net/wireless/scan.c | 7 | ||||
-rw-r--r-- | net/wireless/sme.c | 13 | ||||
-rw-r--r-- | net/wireless/util.c | 15 | ||||
-rw-r--r-- | net/wireless/wext-compat.c | 6 |
5 files changed, 74 insertions, 78 deletions
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index b4f40fe84a01..d0afd82ebd77 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c | |||
@@ -5285,12 +5285,7 @@ static int nl80211_trigger_scan(struct sk_buff *skb, struct genl_info *info) | |||
5285 | goto unlock; | 5285 | goto unlock; |
5286 | } | 5286 | } |
5287 | } else { | 5287 | } else { |
5288 | enum ieee80211_band band; | 5288 | n_channels = ieee80211_get_num_supported_channels(wiphy); |
5289 | n_channels = 0; | ||
5290 | |||
5291 | for (band = 0; band < IEEE80211_NUM_BANDS; band++) | ||
5292 | if (wiphy->bands[band]) | ||
5293 | n_channels += wiphy->bands[band]->n_channels; | ||
5294 | } | 5289 | } |
5295 | 5290 | ||
5296 | if (info->attrs[NL80211_ATTR_SCAN_SSIDS]) | 5291 | if (info->attrs[NL80211_ATTR_SCAN_SSIDS]) |
@@ -5498,11 +5493,7 @@ static int nl80211_start_sched_scan(struct sk_buff *skb, | |||
5498 | if (!n_channels) | 5493 | if (!n_channels) |
5499 | return -EINVAL; | 5494 | return -EINVAL; |
5500 | } else { | 5495 | } else { |
5501 | n_channels = 0; | 5496 | n_channels = ieee80211_get_num_supported_channels(wiphy); |
5502 | |||
5503 | for (band = 0; band < IEEE80211_NUM_BANDS; band++) | ||
5504 | if (wiphy->bands[band]) | ||
5505 | n_channels += wiphy->bands[band]->n_channels; | ||
5506 | } | 5497 | } |
5507 | 5498 | ||
5508 | if (info->attrs[NL80211_ATTR_SCAN_SSIDS]) | 5499 | if (info->attrs[NL80211_ATTR_SCAN_SSIDS]) |
@@ -6795,6 +6786,55 @@ __cfg80211_alloc_vendor_skb(struct cfg80211_registered_device *rdev, | |||
6795 | return NULL; | 6786 | return NULL; |
6796 | } | 6787 | } |
6797 | 6788 | ||
6789 | struct sk_buff *__cfg80211_alloc_event_skb(struct wiphy *wiphy, | ||
6790 | enum nl80211_commands cmd, | ||
6791 | enum nl80211_attrs attr, | ||
6792 | int vendor_event_idx, | ||
6793 | int approxlen, gfp_t gfp) | ||
6794 | { | ||
6795 | struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy); | ||
6796 | const struct nl80211_vendor_cmd_info *info; | ||
6797 | |||
6798 | switch (cmd) { | ||
6799 | case NL80211_CMD_TESTMODE: | ||
6800 | if (WARN_ON(vendor_event_idx != -1)) | ||
6801 | return NULL; | ||
6802 | info = NULL; | ||
6803 | break; | ||
6804 | case NL80211_CMD_VENDOR: | ||
6805 | if (WARN_ON(vendor_event_idx < 0 || | ||
6806 | vendor_event_idx >= wiphy->n_vendor_events)) | ||
6807 | return NULL; | ||
6808 | info = &wiphy->vendor_events[vendor_event_idx]; | ||
6809 | break; | ||
6810 | default: | ||
6811 | WARN_ON(1); | ||
6812 | return NULL; | ||
6813 | } | ||
6814 | |||
6815 | return __cfg80211_alloc_vendor_skb(rdev, approxlen, 0, 0, | ||
6816 | cmd, attr, info, gfp); | ||
6817 | } | ||
6818 | EXPORT_SYMBOL(__cfg80211_alloc_event_skb); | ||
6819 | |||
6820 | void __cfg80211_send_event_skb(struct sk_buff *skb, gfp_t gfp) | ||
6821 | { | ||
6822 | struct cfg80211_registered_device *rdev = ((void **)skb->cb)[0]; | ||
6823 | void *hdr = ((void **)skb->cb)[1]; | ||
6824 | struct nlattr *data = ((void **)skb->cb)[2]; | ||
6825 | enum nl80211_multicast_groups mcgrp = NL80211_MCGRP_TESTMODE; | ||
6826 | |||
6827 | nla_nest_end(skb, data); | ||
6828 | genlmsg_end(skb, hdr); | ||
6829 | |||
6830 | if (data->nla_type == NL80211_ATTR_VENDOR_DATA) | ||
6831 | mcgrp = NL80211_MCGRP_VENDOR; | ||
6832 | |||
6833 | genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), skb, 0, | ||
6834 | mcgrp, gfp); | ||
6835 | } | ||
6836 | EXPORT_SYMBOL(__cfg80211_send_event_skb); | ||
6837 | |||
6798 | #ifdef CONFIG_NL80211_TESTMODE | 6838 | #ifdef CONFIG_NL80211_TESTMODE |
6799 | static int nl80211_testmode_do(struct sk_buff *skb, struct genl_info *info) | 6839 | static int nl80211_testmode_do(struct sk_buff *skb, struct genl_info *info) |
6800 | { | 6840 | { |
@@ -6921,55 +6961,6 @@ static int nl80211_testmode_dump(struct sk_buff *skb, | |||
6921 | rtnl_unlock(); | 6961 | rtnl_unlock(); |
6922 | return err; | 6962 | return err; |
6923 | } | 6963 | } |
6924 | |||
6925 | struct sk_buff *__cfg80211_alloc_event_skb(struct wiphy *wiphy, | ||
6926 | enum nl80211_commands cmd, | ||
6927 | enum nl80211_attrs attr, | ||
6928 | int vendor_event_idx, | ||
6929 | int approxlen, gfp_t gfp) | ||
6930 | { | ||
6931 | struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy); | ||
6932 | const struct nl80211_vendor_cmd_info *info; | ||
6933 | |||
6934 | switch (cmd) { | ||
6935 | case NL80211_CMD_TESTMODE: | ||
6936 | if (WARN_ON(vendor_event_idx != -1)) | ||
6937 | return NULL; | ||
6938 | info = NULL; | ||
6939 | break; | ||
6940 | case NL80211_CMD_VENDOR: | ||
6941 | if (WARN_ON(vendor_event_idx < 0 || | ||
6942 | vendor_event_idx >= wiphy->n_vendor_events)) | ||
6943 | return NULL; | ||
6944 | info = &wiphy->vendor_events[vendor_event_idx]; | ||
6945 | break; | ||
6946 | default: | ||
6947 | WARN_ON(1); | ||
6948 | return NULL; | ||
6949 | } | ||
6950 | |||
6951 | return __cfg80211_alloc_vendor_skb(rdev, approxlen, 0, 0, | ||
6952 | cmd, attr, info, gfp); | ||
6953 | } | ||
6954 | EXPORT_SYMBOL(__cfg80211_alloc_event_skb); | ||
6955 | |||
6956 | void __cfg80211_send_event_skb(struct sk_buff *skb, gfp_t gfp) | ||
6957 | { | ||
6958 | struct cfg80211_registered_device *rdev = ((void **)skb->cb)[0]; | ||
6959 | void *hdr = ((void **)skb->cb)[1]; | ||
6960 | struct nlattr *data = ((void **)skb->cb)[2]; | ||
6961 | enum nl80211_multicast_groups mcgrp = NL80211_MCGRP_TESTMODE; | ||
6962 | |||
6963 | nla_nest_end(skb, data); | ||
6964 | genlmsg_end(skb, hdr); | ||
6965 | |||
6966 | if (data->nla_type == NL80211_ATTR_VENDOR_DATA) | ||
6967 | mcgrp = NL80211_MCGRP_VENDOR; | ||
6968 | |||
6969 | genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), skb, 0, | ||
6970 | mcgrp, gfp); | ||
6971 | } | ||
6972 | EXPORT_SYMBOL(__cfg80211_send_event_skb); | ||
6973 | #endif | 6964 | #endif |
6974 | 6965 | ||
6975 | static int nl80211_connect(struct sk_buff *skb, struct genl_info *info) | 6966 | static int nl80211_connect(struct sk_buff *skb, struct genl_info *info) |
diff --git a/net/wireless/scan.c b/net/wireless/scan.c index a32d52a04c27..b528e31da2cf 100644 --- a/net/wireless/scan.c +++ b/net/wireless/scan.c | |||
@@ -1089,11 +1089,8 @@ int cfg80211_wext_siwscan(struct net_device *dev, | |||
1089 | /* Determine number of channels, needed to allocate creq */ | 1089 | /* Determine number of channels, needed to allocate creq */ |
1090 | if (wreq && wreq->num_channels) | 1090 | if (wreq && wreq->num_channels) |
1091 | n_channels = wreq->num_channels; | 1091 | n_channels = wreq->num_channels; |
1092 | else { | 1092 | else |
1093 | for (band = 0; band < IEEE80211_NUM_BANDS; band++) | 1093 | n_channels = ieee80211_get_num_supported_channels(wiphy); |
1094 | if (wiphy->bands[band]) | ||
1095 | n_channels += wiphy->bands[band]->n_channels; | ||
1096 | } | ||
1097 | 1094 | ||
1098 | creq = kzalloc(sizeof(*creq) + sizeof(struct cfg80211_ssid) + | 1095 | creq = kzalloc(sizeof(*creq) + sizeof(struct cfg80211_ssid) + |
1099 | n_channels * sizeof(void *), | 1096 | n_channels * sizeof(void *), |
diff --git a/net/wireless/sme.c b/net/wireless/sme.c index 5d6e7bb2fc89..a63509118508 100644 --- a/net/wireless/sme.c +++ b/net/wireless/sme.c | |||
@@ -70,18 +70,11 @@ static int cfg80211_conn_scan(struct wireless_dev *wdev) | |||
70 | if (rdev->scan_req) | 70 | if (rdev->scan_req) |
71 | return -EBUSY; | 71 | return -EBUSY; |
72 | 72 | ||
73 | if (wdev->conn->params.channel) { | 73 | if (wdev->conn->params.channel) |
74 | n_channels = 1; | 74 | n_channels = 1; |
75 | } else { | 75 | else |
76 | enum ieee80211_band band; | 76 | n_channels = ieee80211_get_num_supported_channels(wdev->wiphy); |
77 | n_channels = 0; | ||
78 | 77 | ||
79 | for (band = 0; band < IEEE80211_NUM_BANDS; band++) { | ||
80 | if (!wdev->wiphy->bands[band]) | ||
81 | continue; | ||
82 | n_channels += wdev->wiphy->bands[band]->n_channels; | ||
83 | } | ||
84 | } | ||
85 | request = kzalloc(sizeof(*request) + sizeof(request->ssids[0]) + | 78 | request = kzalloc(sizeof(*request) + sizeof(request->ssids[0]) + |
86 | sizeof(request->channels[0]) * n_channels, | 79 | sizeof(request->channels[0]) * n_channels, |
87 | GFP_KERNEL); | 80 | GFP_KERNEL); |
diff --git a/net/wireless/util.c b/net/wireless/util.c index 5618888853b2..d39c37104ae2 100644 --- a/net/wireless/util.c +++ b/net/wireless/util.c | |||
@@ -879,7 +879,9 @@ int cfg80211_change_iface(struct cfg80211_registered_device *rdev, | |||
879 | 879 | ||
880 | dev->ieee80211_ptr->use_4addr = false; | 880 | dev->ieee80211_ptr->use_4addr = false; |
881 | dev->ieee80211_ptr->mesh_id_up_len = 0; | 881 | dev->ieee80211_ptr->mesh_id_up_len = 0; |
882 | wdev_lock(dev->ieee80211_ptr); | ||
882 | rdev_set_qos_map(rdev, dev, NULL); | 883 | rdev_set_qos_map(rdev, dev, NULL); |
884 | wdev_unlock(dev->ieee80211_ptr); | ||
883 | 885 | ||
884 | switch (otype) { | 886 | switch (otype) { |
885 | case NL80211_IFTYPE_AP: | 887 | case NL80211_IFTYPE_AP: |
@@ -1479,6 +1481,19 @@ int ieee80211_get_ratemask(struct ieee80211_supported_band *sband, | |||
1479 | return 0; | 1481 | return 0; |
1480 | } | 1482 | } |
1481 | 1483 | ||
1484 | unsigned int ieee80211_get_num_supported_channels(struct wiphy *wiphy) | ||
1485 | { | ||
1486 | enum ieee80211_band band; | ||
1487 | unsigned int n_channels = 0; | ||
1488 | |||
1489 | for (band = 0; band < IEEE80211_NUM_BANDS; band++) | ||
1490 | if (wiphy->bands[band]) | ||
1491 | n_channels += wiphy->bands[band]->n_channels; | ||
1492 | |||
1493 | return n_channels; | ||
1494 | } | ||
1495 | EXPORT_SYMBOL(ieee80211_get_num_supported_channels); | ||
1496 | |||
1482 | /* See IEEE 802.1H for LLC/SNAP encapsulation/decapsulation */ | 1497 | /* See IEEE 802.1H for LLC/SNAP encapsulation/decapsulation */ |
1483 | /* Ethernet-II snap header (RFC1042 for most EtherTypes) */ | 1498 | /* Ethernet-II snap header (RFC1042 for most EtherTypes) */ |
1484 | const unsigned char rfc1042_header[] __aligned(2) = | 1499 | const unsigned char rfc1042_header[] __aligned(2) = |
diff --git a/net/wireless/wext-compat.c b/net/wireless/wext-compat.c index e7c6e862580d..5661a54ac7ee 100644 --- a/net/wireless/wext-compat.c +++ b/net/wireless/wext-compat.c | |||
@@ -370,7 +370,7 @@ static int cfg80211_wext_siwretry(struct net_device *dev, | |||
370 | u8 oshort = wdev->wiphy->retry_short; | 370 | u8 oshort = wdev->wiphy->retry_short; |
371 | int err; | 371 | int err; |
372 | 372 | ||
373 | if (retry->disabled || | 373 | if (retry->disabled || retry->value < 1 || retry->value > 255 || |
374 | (retry->flags & IW_RETRY_TYPE) != IW_RETRY_LIMIT) | 374 | (retry->flags & IW_RETRY_TYPE) != IW_RETRY_LIMIT) |
375 | return -EINVAL; | 375 | return -EINVAL; |
376 | 376 | ||
@@ -412,9 +412,9 @@ int cfg80211_wext_giwretry(struct net_device *dev, | |||
412 | * First return short value, iwconfig will ask long value | 412 | * First return short value, iwconfig will ask long value |
413 | * later if needed | 413 | * later if needed |
414 | */ | 414 | */ |
415 | retry->flags |= IW_RETRY_LIMIT; | 415 | retry->flags |= IW_RETRY_LIMIT | IW_RETRY_SHORT; |
416 | retry->value = wdev->wiphy->retry_short; | 416 | retry->value = wdev->wiphy->retry_short; |
417 | if (wdev->wiphy->retry_long != wdev->wiphy->retry_short) | 417 | if (wdev->wiphy->retry_long == wdev->wiphy->retry_short) |
418 | retry->flags |= IW_RETRY_LONG; | 418 | retry->flags |= IW_RETRY_LONG; |
419 | 419 | ||
420 | return 0; | 420 | return 0; |