diff options
author | Johannes Berg <johannes.berg@intel.com> | 2019-02-22 07:48:13 -0500 |
---|---|---|
committer | Johannes Berg <johannes.berg@intel.com> | 2019-02-22 07:48:13 -0500 |
commit | b7b14ec1ebef35d22f3f4087816468f22c987f75 (patch) | |
tree | 3f99f4d7b770d7bba3ee84663b32f98dfbe7582d /net/wireless | |
parent | 77ff2c6b49843b01adef1f80abb091753e4c9c65 (diff) | |
parent | 7a25c6c0aac85bbc50d3ce49cd08888adb14508b (diff) |
Merge remote-tracking branch 'net-next/master' into mac80211-next
Merge net-next to resolve a conflict and to get the mac80211
rhashtable fixes so further patches can be applied on top.
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'net/wireless')
-rw-r--r-- | net/wireless/ap.c | 2 | ||||
-rw-r--r-- | net/wireless/core.c | 2 | ||||
-rw-r--r-- | net/wireless/core.h | 2 | ||||
-rw-r--r-- | net/wireless/nl80211.c | 2 | ||||
-rw-r--r-- | net/wireless/pmsr.c | 26 | ||||
-rw-r--r-- | net/wireless/sme.c | 2 | ||||
-rw-r--r-- | net/wireless/util.c | 35 |
7 files changed, 49 insertions, 22 deletions
diff --git a/net/wireless/ap.c b/net/wireless/ap.c index 882d97bdc6bf..550ac9d827fe 100644 --- a/net/wireless/ap.c +++ b/net/wireless/ap.c | |||
@@ -41,6 +41,8 @@ int __cfg80211_stop_ap(struct cfg80211_registered_device *rdev, | |||
41 | cfg80211_sched_dfs_chan_update(rdev); | 41 | cfg80211_sched_dfs_chan_update(rdev); |
42 | } | 42 | } |
43 | 43 | ||
44 | schedule_work(&cfg80211_disconnect_work); | ||
45 | |||
44 | return err; | 46 | return err; |
45 | } | 47 | } |
46 | 48 | ||
diff --git a/net/wireless/core.c b/net/wireless/core.c index 623dfe5e211c..b36ad8efb5e5 100644 --- a/net/wireless/core.c +++ b/net/wireless/core.c | |||
@@ -1068,6 +1068,8 @@ static void __cfg80211_unregister_wdev(struct wireless_dev *wdev, bool sync) | |||
1068 | 1068 | ||
1069 | ASSERT_RTNL(); | 1069 | ASSERT_RTNL(); |
1070 | 1070 | ||
1071 | flush_work(&wdev->pmsr_free_wk); | ||
1072 | |||
1071 | nl80211_notify_iface(rdev, wdev, NL80211_CMD_DEL_INTERFACE); | 1073 | nl80211_notify_iface(rdev, wdev, NL80211_CMD_DEL_INTERFACE); |
1072 | 1074 | ||
1073 | list_del_rcu(&wdev->list); | 1075 | list_del_rcu(&wdev->list); |
diff --git a/net/wireless/core.h b/net/wireless/core.h index f257a2b32ba4..84d36ca7a7ab 100644 --- a/net/wireless/core.h +++ b/net/wireless/core.h | |||
@@ -456,6 +456,8 @@ void cfg80211_process_wdev_events(struct wireless_dev *wdev); | |||
456 | bool cfg80211_does_bw_fit_range(const struct ieee80211_freq_range *freq_range, | 456 | bool cfg80211_does_bw_fit_range(const struct ieee80211_freq_range *freq_range, |
457 | u32 center_freq_khz, u32 bw_khz); | 457 | u32 center_freq_khz, u32 bw_khz); |
458 | 458 | ||
459 | extern struct work_struct cfg80211_disconnect_work; | ||
460 | |||
459 | /** | 461 | /** |
460 | * cfg80211_chandef_dfs_usable - checks if chandef is DFS usable | 462 | * cfg80211_chandef_dfs_usable - checks if chandef is DFS usable |
461 | * @wiphy: the wiphy to validate against | 463 | * @wiphy: the wiphy to validate against |
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index c5df5211d29a..25a9e3b5c154 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c | |||
@@ -238,7 +238,7 @@ nl80211_pmsr_ftm_req_attr_policy[NL80211_PMSR_FTM_REQ_ATTR_MAX + 1] = { | |||
238 | [NL80211_PMSR_FTM_REQ_ATTR_BURST_DURATION] = | 238 | [NL80211_PMSR_FTM_REQ_ATTR_BURST_DURATION] = |
239 | NLA_POLICY_MAX(NLA_U8, 15), | 239 | NLA_POLICY_MAX(NLA_U8, 15), |
240 | [NL80211_PMSR_FTM_REQ_ATTR_FTMS_PER_BURST] = | 240 | [NL80211_PMSR_FTM_REQ_ATTR_FTMS_PER_BURST] = |
241 | NLA_POLICY_MAX(NLA_U8, 15), | 241 | NLA_POLICY_MAX(NLA_U8, 31), |
242 | [NL80211_PMSR_FTM_REQ_ATTR_NUM_FTMR_RETRIES] = { .type = NLA_U8 }, | 242 | [NL80211_PMSR_FTM_REQ_ATTR_NUM_FTMR_RETRIES] = { .type = NLA_U8 }, |
243 | [NL80211_PMSR_FTM_REQ_ATTR_REQUEST_LCI] = { .type = NLA_FLAG }, | 243 | [NL80211_PMSR_FTM_REQ_ATTR_REQUEST_LCI] = { .type = NLA_FLAG }, |
244 | [NL80211_PMSR_FTM_REQ_ATTR_REQUEST_CIVICLOC] = { .type = NLA_FLAG }, | 244 | [NL80211_PMSR_FTM_REQ_ATTR_REQUEST_CIVICLOC] = { .type = NLA_FLAG }, |
diff --git a/net/wireless/pmsr.c b/net/wireless/pmsr.c index 21139b82749f..5e2ab01d325c 100644 --- a/net/wireless/pmsr.c +++ b/net/wireless/pmsr.c | |||
@@ -256,8 +256,7 @@ int nl80211_pmsr_start(struct sk_buff *skb, struct genl_info *info) | |||
256 | if (err) | 256 | if (err) |
257 | goto out_err; | 257 | goto out_err; |
258 | } else { | 258 | } else { |
259 | memcpy(req->mac_addr, nla_data(info->attrs[NL80211_ATTR_MAC]), | 259 | memcpy(req->mac_addr, wdev_address(wdev), ETH_ALEN); |
260 | ETH_ALEN); | ||
261 | eth_broadcast_addr(req->mac_addr_mask); | 260 | eth_broadcast_addr(req->mac_addr_mask); |
262 | } | 261 | } |
263 | 262 | ||
@@ -272,6 +271,7 @@ int nl80211_pmsr_start(struct sk_buff *skb, struct genl_info *info) | |||
272 | 271 | ||
273 | req->n_peers = count; | 272 | req->n_peers = count; |
274 | req->cookie = cfg80211_assign_cookie(rdev); | 273 | req->cookie = cfg80211_assign_cookie(rdev); |
274 | req->nl_portid = info->snd_portid; | ||
275 | 275 | ||
276 | err = rdev_start_pmsr(rdev, wdev, req); | 276 | err = rdev_start_pmsr(rdev, wdev, req); |
277 | if (err) | 277 | if (err) |
@@ -530,14 +530,14 @@ free: | |||
530 | } | 530 | } |
531 | EXPORT_SYMBOL_GPL(cfg80211_pmsr_report); | 531 | EXPORT_SYMBOL_GPL(cfg80211_pmsr_report); |
532 | 532 | ||
533 | void cfg80211_pmsr_free_wk(struct work_struct *work) | 533 | static void cfg80211_pmsr_process_abort(struct wireless_dev *wdev) |
534 | { | 534 | { |
535 | struct wireless_dev *wdev = container_of(work, struct wireless_dev, | ||
536 | pmsr_free_wk); | ||
537 | struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); | 535 | struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); |
538 | struct cfg80211_pmsr_request *req, *tmp; | 536 | struct cfg80211_pmsr_request *req, *tmp; |
539 | LIST_HEAD(free_list); | 537 | LIST_HEAD(free_list); |
540 | 538 | ||
539 | lockdep_assert_held(&wdev->mtx); | ||
540 | |||
541 | spin_lock_bh(&wdev->pmsr_lock); | 541 | spin_lock_bh(&wdev->pmsr_lock); |
542 | list_for_each_entry_safe(req, tmp, &wdev->pmsr_list, list) { | 542 | list_for_each_entry_safe(req, tmp, &wdev->pmsr_list, list) { |
543 | if (req->nl_portid) | 543 | if (req->nl_portid) |
@@ -547,14 +547,22 @@ void cfg80211_pmsr_free_wk(struct work_struct *work) | |||
547 | spin_unlock_bh(&wdev->pmsr_lock); | 547 | spin_unlock_bh(&wdev->pmsr_lock); |
548 | 548 | ||
549 | list_for_each_entry_safe(req, tmp, &free_list, list) { | 549 | list_for_each_entry_safe(req, tmp, &free_list, list) { |
550 | wdev_lock(wdev); | ||
551 | rdev_abort_pmsr(rdev, wdev, req); | 550 | rdev_abort_pmsr(rdev, wdev, req); |
552 | wdev_unlock(wdev); | ||
553 | 551 | ||
554 | kfree(req); | 552 | kfree(req); |
555 | } | 553 | } |
556 | } | 554 | } |
557 | 555 | ||
556 | void cfg80211_pmsr_free_wk(struct work_struct *work) | ||
557 | { | ||
558 | struct wireless_dev *wdev = container_of(work, struct wireless_dev, | ||
559 | pmsr_free_wk); | ||
560 | |||
561 | wdev_lock(wdev); | ||
562 | cfg80211_pmsr_process_abort(wdev); | ||
563 | wdev_unlock(wdev); | ||
564 | } | ||
565 | |||
558 | void cfg80211_pmsr_wdev_down(struct wireless_dev *wdev) | 566 | void cfg80211_pmsr_wdev_down(struct wireless_dev *wdev) |
559 | { | 567 | { |
560 | struct cfg80211_pmsr_request *req; | 568 | struct cfg80211_pmsr_request *req; |
@@ -568,8 +576,8 @@ void cfg80211_pmsr_wdev_down(struct wireless_dev *wdev) | |||
568 | spin_unlock_bh(&wdev->pmsr_lock); | 576 | spin_unlock_bh(&wdev->pmsr_lock); |
569 | 577 | ||
570 | if (found) | 578 | if (found) |
571 | schedule_work(&wdev->pmsr_free_wk); | 579 | cfg80211_pmsr_process_abort(wdev); |
572 | flush_work(&wdev->pmsr_free_wk); | 580 | |
573 | WARN_ON(!list_empty(&wdev->pmsr_list)); | 581 | WARN_ON(!list_empty(&wdev->pmsr_list)); |
574 | } | 582 | } |
575 | 583 | ||
diff --git a/net/wireless/sme.c b/net/wireless/sme.c index f741d8376a46..7d34cb884840 100644 --- a/net/wireless/sme.c +++ b/net/wireless/sme.c | |||
@@ -667,7 +667,7 @@ static void disconnect_work(struct work_struct *work) | |||
667 | rtnl_unlock(); | 667 | rtnl_unlock(); |
668 | } | 668 | } |
669 | 669 | ||
670 | static DECLARE_WORK(cfg80211_disconnect_work, disconnect_work); | 670 | DECLARE_WORK(cfg80211_disconnect_work, disconnect_work); |
671 | 671 | ||
672 | 672 | ||
673 | /* | 673 | /* |
diff --git a/net/wireless/util.c b/net/wireless/util.c index 61fa33d0019e..e4b8db5e81ec 100644 --- a/net/wireless/util.c +++ b/net/wireless/util.c | |||
@@ -5,7 +5,7 @@ | |||
5 | * Copyright 2007-2009 Johannes Berg <johannes@sipsolutions.net> | 5 | * Copyright 2007-2009 Johannes Berg <johannes@sipsolutions.net> |
6 | * Copyright 2013-2014 Intel Mobile Communications GmbH | 6 | * Copyright 2013-2014 Intel Mobile Communications GmbH |
7 | * Copyright 2017 Intel Deutschland GmbH | 7 | * Copyright 2017 Intel Deutschland GmbH |
8 | * Copyright (C) 2018 Intel Corporation | 8 | * Copyright (C) 2018-2019 Intel Corporation |
9 | */ | 9 | */ |
10 | #include <linux/export.h> | 10 | #include <linux/export.h> |
11 | #include <linux/bitops.h> | 11 | #include <linux/bitops.h> |
@@ -19,6 +19,7 @@ | |||
19 | #include <linux/mpls.h> | 19 | #include <linux/mpls.h> |
20 | #include <linux/gcd.h> | 20 | #include <linux/gcd.h> |
21 | #include <linux/bitfield.h> | 21 | #include <linux/bitfield.h> |
22 | #include <linux/nospec.h> | ||
22 | #include "core.h" | 23 | #include "core.h" |
23 | #include "rdev-ops.h" | 24 | #include "rdev-ops.h" |
24 | 25 | ||
@@ -715,20 +716,25 @@ unsigned int cfg80211_classify8021d(struct sk_buff *skb, | |||
715 | { | 716 | { |
716 | unsigned int dscp; | 717 | unsigned int dscp; |
717 | unsigned char vlan_priority; | 718 | unsigned char vlan_priority; |
719 | unsigned int ret; | ||
718 | 720 | ||
719 | /* skb->priority values from 256->263 are magic values to | 721 | /* skb->priority values from 256->263 are magic values to |
720 | * directly indicate a specific 802.1d priority. This is used | 722 | * directly indicate a specific 802.1d priority. This is used |
721 | * to allow 802.1d priority to be passed directly in from VLAN | 723 | * to allow 802.1d priority to be passed directly in from VLAN |
722 | * tags, etc. | 724 | * tags, etc. |
723 | */ | 725 | */ |
724 | if (skb->priority >= 256 && skb->priority <= 263) | 726 | if (skb->priority >= 256 && skb->priority <= 263) { |
725 | return skb->priority - 256; | 727 | ret = skb->priority - 256; |
728 | goto out; | ||
729 | } | ||
726 | 730 | ||
727 | if (skb_vlan_tag_present(skb)) { | 731 | if (skb_vlan_tag_present(skb)) { |
728 | vlan_priority = (skb_vlan_tag_get(skb) & VLAN_PRIO_MASK) | 732 | vlan_priority = (skb_vlan_tag_get(skb) & VLAN_PRIO_MASK) |
729 | >> VLAN_PRIO_SHIFT; | 733 | >> VLAN_PRIO_SHIFT; |
730 | if (vlan_priority > 0) | 734 | if (vlan_priority > 0) { |
731 | return vlan_priority; | 735 | ret = vlan_priority; |
736 | goto out; | ||
737 | } | ||
732 | } | 738 | } |
733 | 739 | ||
734 | switch (skb->protocol) { | 740 | switch (skb->protocol) { |
@@ -747,8 +753,9 @@ unsigned int cfg80211_classify8021d(struct sk_buff *skb, | |||
747 | if (!mpls) | 753 | if (!mpls) |
748 | return 0; | 754 | return 0; |
749 | 755 | ||
750 | return (ntohl(mpls->entry) & MPLS_LS_TC_MASK) | 756 | ret = (ntohl(mpls->entry) & MPLS_LS_TC_MASK) |
751 | >> MPLS_LS_TC_SHIFT; | 757 | >> MPLS_LS_TC_SHIFT; |
758 | goto out; | ||
752 | } | 759 | } |
753 | case htons(ETH_P_80221): | 760 | case htons(ETH_P_80221): |
754 | /* 802.21 is always network control traffic */ | 761 | /* 802.21 is always network control traffic */ |
@@ -761,18 +768,24 @@ unsigned int cfg80211_classify8021d(struct sk_buff *skb, | |||
761 | unsigned int i, tmp_dscp = dscp >> 2; | 768 | unsigned int i, tmp_dscp = dscp >> 2; |
762 | 769 | ||
763 | for (i = 0; i < qos_map->num_des; i++) { | 770 | for (i = 0; i < qos_map->num_des; i++) { |
764 | if (tmp_dscp == qos_map->dscp_exception[i].dscp) | 771 | if (tmp_dscp == qos_map->dscp_exception[i].dscp) { |
765 | return qos_map->dscp_exception[i].up; | 772 | ret = qos_map->dscp_exception[i].up; |
773 | goto out; | ||
774 | } | ||
766 | } | 775 | } |
767 | 776 | ||
768 | for (i = 0; i < 8; i++) { | 777 | for (i = 0; i < 8; i++) { |
769 | if (tmp_dscp >= qos_map->up[i].low && | 778 | if (tmp_dscp >= qos_map->up[i].low && |
770 | tmp_dscp <= qos_map->up[i].high) | 779 | tmp_dscp <= qos_map->up[i].high) { |
771 | return i; | 780 | ret = i; |
781 | goto out; | ||
782 | } | ||
772 | } | 783 | } |
773 | } | 784 | } |
774 | 785 | ||
775 | return dscp >> 5; | 786 | ret = dscp >> 5; |
787 | out: | ||
788 | return array_index_nospec(ret, IEEE80211_NUM_TIDS); | ||
776 | } | 789 | } |
777 | EXPORT_SYMBOL(cfg80211_classify8021d); | 790 | EXPORT_SYMBOL(cfg80211_classify8021d); |
778 | 791 | ||