aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2014-12-18 15:33:49 -0500
committerDavid S. Miller <davem@davemloft.net>2014-12-18 15:33:49 -0500
commit86c8fc4bbe14b8950e62d379bb57722427ad3d67 (patch)
tree4bb37ed1a108d2025150f716ca1c2cadadb6153d /net
parent7dce675b28bcd7f9daf3eef896ec2757255e2623 (diff)
parent28a9bc68124c319b2b3dc861e80828a8865fd1ba (diff)
Merge tag 'mac80211-for-davem-2014-12-18' of git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211
Johannes Berg says: ==================== pull-request: mac80211 2014-12-18 Also from me a first pull request - we have a number of really old issues that happened to crop up now with new work (or just more testing) in the right areas as well as some small bugs newly introduced in 3.19. Let me know if there are any problems. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net')
-rw-r--r--net/mac80211/chan.c4
-rw-r--r--net/mac80211/key.c2
-rw-r--r--net/mac80211/mlme.c1
-rw-r--r--net/mac80211/rx.c11
-rw-r--r--net/wireless/chan.c9
-rw-r--r--net/wireless/nl80211.c2
-rw-r--r--net/wireless/reg.c20
7 files changed, 32 insertions, 17 deletions
diff --git a/net/mac80211/chan.c b/net/mac80211/chan.c
index 5d6dae9e4aac..da1c12c34487 100644
--- a/net/mac80211/chan.c
+++ b/net/mac80211/chan.c
@@ -1011,6 +1011,10 @@ ieee80211_vif_use_reserved_reassign(struct ieee80211_sub_if_data *sdata)
1011 1011
1012 ieee80211_vif_update_chandef(sdata, &sdata->reserved_chandef); 1012 ieee80211_vif_update_chandef(sdata, &sdata->reserved_chandef);
1013 1013
1014 ieee80211_recalc_smps_chanctx(local, new_ctx);
1015 ieee80211_recalc_radar_chanctx(local, new_ctx);
1016 ieee80211_recalc_chanctx_min_def(local, new_ctx);
1017
1014 if (changed) 1018 if (changed)
1015 ieee80211_bss_info_change_notify(sdata, changed); 1019 ieee80211_bss_info_change_notify(sdata, changed);
1016 1020
diff --git a/net/mac80211/key.c b/net/mac80211/key.c
index 434a91ad12c8..0bb7038121ac 100644
--- a/net/mac80211/key.c
+++ b/net/mac80211/key.c
@@ -656,7 +656,7 @@ void ieee80211_free_sta_keys(struct ieee80211_local *local,
656 int i; 656 int i;
657 657
658 mutex_lock(&local->key_mtx); 658 mutex_lock(&local->key_mtx);
659 for (i = 0; i < NUM_DEFAULT_KEYS; i++) { 659 for (i = 0; i < ARRAY_SIZE(sta->gtk); i++) {
660 key = key_mtx_dereference(local, sta->gtk[i]); 660 key = key_mtx_dereference(local, sta->gtk[i]);
661 if (!key) 661 if (!key)
662 continue; 662 continue;
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c
index 75a9bf50207e..2c36c4765f47 100644
--- a/net/mac80211/mlme.c
+++ b/net/mac80211/mlme.c
@@ -174,6 +174,7 @@ ieee80211_determine_chantype(struct ieee80211_sub_if_data *sdata,
174 if (!(ht_cap->cap_info & 174 if (!(ht_cap->cap_info &
175 cpu_to_le16(IEEE80211_HT_CAP_SUP_WIDTH_20_40))) { 175 cpu_to_le16(IEEE80211_HT_CAP_SUP_WIDTH_20_40))) {
176 ret = IEEE80211_STA_DISABLE_40MHZ; 176 ret = IEEE80211_STA_DISABLE_40MHZ;
177 vht_chandef = *chandef;
177 goto out; 178 goto out;
178 } 179 }
179 180
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c
index 49c23bdf08bb..683b10f46505 100644
--- a/net/mac80211/rx.c
+++ b/net/mac80211/rx.c
@@ -1761,14 +1761,14 @@ ieee80211_rx_h_defragment(struct ieee80211_rx_data *rx)
1761 sc = le16_to_cpu(hdr->seq_ctrl); 1761 sc = le16_to_cpu(hdr->seq_ctrl);
1762 frag = sc & IEEE80211_SCTL_FRAG; 1762 frag = sc & IEEE80211_SCTL_FRAG;
1763 1763
1764 if (likely(!ieee80211_has_morefrags(fc) && frag == 0))
1765 goto out;
1766
1767 if (is_multicast_ether_addr(hdr->addr1)) { 1764 if (is_multicast_ether_addr(hdr->addr1)) {
1768 rx->local->dot11MulticastReceivedFrameCount++; 1765 rx->local->dot11MulticastReceivedFrameCount++;
1769 goto out; 1766 goto out_no_led;
1770 } 1767 }
1771 1768
1769 if (likely(!ieee80211_has_morefrags(fc) && frag == 0))
1770 goto out;
1771
1772 I802_DEBUG_INC(rx->local->rx_handlers_fragments); 1772 I802_DEBUG_INC(rx->local->rx_handlers_fragments);
1773 1773
1774 if (skb_linearize(rx->skb)) 1774 if (skb_linearize(rx->skb))
@@ -1859,9 +1859,10 @@ ieee80211_rx_h_defragment(struct ieee80211_rx_data *rx)
1859 status->rx_flags |= IEEE80211_RX_FRAGMENTED; 1859 status->rx_flags |= IEEE80211_RX_FRAGMENTED;
1860 1860
1861 out: 1861 out:
1862 ieee80211_led_rx(rx->local);
1863 out_no_led:
1862 if (rx->sta) 1864 if (rx->sta)
1863 rx->sta->rx_packets++; 1865 rx->sta->rx_packets++;
1864 ieee80211_led_rx(rx->local);
1865 return RX_CONTINUE; 1866 return RX_CONTINUE;
1866} 1867}
1867 1868
diff --git a/net/wireless/chan.c b/net/wireless/chan.c
index 85506f1d0789..7aaf7415dc4c 100644
--- a/net/wireless/chan.c
+++ b/net/wireless/chan.c
@@ -603,7 +603,7 @@ bool cfg80211_chandef_usable(struct wiphy *wiphy,
603{ 603{
604 struct ieee80211_sta_ht_cap *ht_cap; 604 struct ieee80211_sta_ht_cap *ht_cap;
605 struct ieee80211_sta_vht_cap *vht_cap; 605 struct ieee80211_sta_vht_cap *vht_cap;
606 u32 width, control_freq; 606 u32 width, control_freq, cap;
607 607
608 if (WARN_ON(!cfg80211_chandef_valid(chandef))) 608 if (WARN_ON(!cfg80211_chandef_valid(chandef)))
609 return false; 609 return false;
@@ -643,7 +643,8 @@ bool cfg80211_chandef_usable(struct wiphy *wiphy,
643 return false; 643 return false;
644 break; 644 break;
645 case NL80211_CHAN_WIDTH_80P80: 645 case NL80211_CHAN_WIDTH_80P80:
646 if (!(vht_cap->cap & IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ)) 646 cap = vht_cap->cap & IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK;
647 if (cap != IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ)
647 return false; 648 return false;
648 case NL80211_CHAN_WIDTH_80: 649 case NL80211_CHAN_WIDTH_80:
649 if (!vht_cap->vht_supported) 650 if (!vht_cap->vht_supported)
@@ -654,7 +655,9 @@ bool cfg80211_chandef_usable(struct wiphy *wiphy,
654 case NL80211_CHAN_WIDTH_160: 655 case NL80211_CHAN_WIDTH_160:
655 if (!vht_cap->vht_supported) 656 if (!vht_cap->vht_supported)
656 return false; 657 return false;
657 if (!(vht_cap->cap & IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ)) 658 cap = vht_cap->cap & IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK;
659 if (cap != IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ &&
660 cap != IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ)
658 return false; 661 return false;
659 prohibited_flags |= IEEE80211_CHAN_NO_160MHZ; 662 prohibited_flags |= IEEE80211_CHAN_NO_160MHZ;
660 width = 160; 663 width = 160;
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
index a17d6bc6b22c..7ca4b5133123 100644
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
@@ -6002,7 +6002,7 @@ nl80211_parse_sched_scan(struct wiphy *wiphy, struct wireless_dev *wdev,
6002 } 6002 }
6003 6003
6004 /* there was no other matchset, so the RSSI one is alone */ 6004 /* there was no other matchset, so the RSSI one is alone */
6005 if (i == 0) 6005 if (i == 0 && n_match_sets)
6006 request->match_sets[0].rssi_thold = default_match_rssi; 6006 request->match_sets[0].rssi_thold = default_match_rssi;
6007 6007
6008 request->min_rssi_thold = INT_MAX; 6008 request->min_rssi_thold = INT_MAX;
diff --git a/net/wireless/reg.c b/net/wireless/reg.c
index 47be6163381c..7b8309840d4e 100644
--- a/net/wireless/reg.c
+++ b/net/wireless/reg.c
@@ -1549,9 +1549,15 @@ static bool reg_wdev_chan_valid(struct wiphy *wiphy, struct wireless_dev *wdev)
1549 ret = cfg80211_reg_can_beacon(wiphy, 1549 ret = cfg80211_reg_can_beacon(wiphy,
1550 &wdev->chandef, wdev->iftype); 1550 &wdev->chandef, wdev->iftype);
1551 break; 1551 break;
1552 case NL80211_IFTYPE_ADHOC:
1553 if (!wdev->ssid_len)
1554 goto out;
1555
1556 ret = cfg80211_reg_can_beacon(wiphy,
1557 &wdev->chandef, wdev->iftype);
1558 break;
1552 case NL80211_IFTYPE_STATION: 1559 case NL80211_IFTYPE_STATION:
1553 case NL80211_IFTYPE_P2P_CLIENT: 1560 case NL80211_IFTYPE_P2P_CLIENT:
1554 case NL80211_IFTYPE_ADHOC:
1555 if (!wdev->current_bss || 1561 if (!wdev->current_bss ||
1556 !wdev->current_bss->pub.channel) 1562 !wdev->current_bss->pub.channel)
1557 goto out; 1563 goto out;
@@ -1907,7 +1913,7 @@ static enum reg_request_treatment
1907reg_process_hint_driver(struct wiphy *wiphy, 1913reg_process_hint_driver(struct wiphy *wiphy,
1908 struct regulatory_request *driver_request) 1914 struct regulatory_request *driver_request)
1909{ 1915{
1910 const struct ieee80211_regdomain *regd; 1916 const struct ieee80211_regdomain *regd, *tmp;
1911 enum reg_request_treatment treatment; 1917 enum reg_request_treatment treatment;
1912 1918
1913 treatment = __reg_process_hint_driver(driver_request); 1919 treatment = __reg_process_hint_driver(driver_request);
@@ -1927,7 +1933,10 @@ reg_process_hint_driver(struct wiphy *wiphy,
1927 reg_free_request(driver_request); 1933 reg_free_request(driver_request);
1928 return REG_REQ_IGNORE; 1934 return REG_REQ_IGNORE;
1929 } 1935 }
1936
1937 tmp = get_wiphy_regdom(wiphy);
1930 rcu_assign_pointer(wiphy->regd, regd); 1938 rcu_assign_pointer(wiphy->regd, regd);
1939 rcu_free_regdom(tmp);
1931 } 1940 }
1932 1941
1933 1942
@@ -1986,11 +1995,8 @@ __reg_process_hint_country_ie(struct wiphy *wiphy,
1986 return REG_REQ_IGNORE; 1995 return REG_REQ_IGNORE;
1987 return REG_REQ_ALREADY_SET; 1996 return REG_REQ_ALREADY_SET;
1988 } 1997 }
1989 /* 1998
1990 * Two consecutive Country IE hints on the same wiphy. 1999 if (regdom_changes(country_ie_request->alpha2))
1991 * This should be picked up early by the driver/stack
1992 */
1993 if (WARN_ON(regdom_changes(country_ie_request->alpha2)))
1994 return REG_REQ_OK; 2000 return REG_REQ_OK;
1995 return REG_REQ_ALREADY_SET; 2001 return REG_REQ_ALREADY_SET;
1996} 2002}