diff options
author | David S. Miller <davem@davemloft.net> | 2018-07-24 22:21:58 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2018-07-24 22:21:58 -0400 |
commit | 19725496da5602b401eae389736ab00d1817e264 (patch) | |
tree | 4c1a94bf0121769110f1b9c08ee337a55679a48a /net/wireless | |
parent | aea5f654e6b78a0c976f7a25950155932c77a53f (diff) | |
parent | 9981b4fb8684883dcc0daf088891ff32260b9794 (diff) |
Merge ra.kernel.org:/pub/scm/linux/kernel/git/davem/net
Diffstat (limited to 'net/wireless')
-rw-r--r-- | net/wireless/nl80211.c | 25 | ||||
-rw-r--r-- | net/wireless/reg.c | 28 | ||||
-rw-r--r-- | net/wireless/trace.h | 18 |
3 files changed, 29 insertions, 42 deletions
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index e4e5f025d16b..5fb9b7dd9831 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c | |||
@@ -4466,6 +4466,7 @@ static int parse_station_flags(struct genl_info *info, | |||
4466 | params->sta_flags_mask = BIT(NL80211_STA_FLAG_AUTHENTICATED) | | 4466 | params->sta_flags_mask = BIT(NL80211_STA_FLAG_AUTHENTICATED) | |
4467 | BIT(NL80211_STA_FLAG_MFP) | | 4467 | BIT(NL80211_STA_FLAG_MFP) | |
4468 | BIT(NL80211_STA_FLAG_AUTHORIZED); | 4468 | BIT(NL80211_STA_FLAG_AUTHORIZED); |
4469 | break; | ||
4469 | default: | 4470 | default: |
4470 | return -EINVAL; | 4471 | return -EINVAL; |
4471 | } | 4472 | } |
@@ -15029,20 +15030,24 @@ void cfg80211_mgmt_tx_status(struct wireless_dev *wdev, u64 cookie, | |||
15029 | EXPORT_SYMBOL(cfg80211_mgmt_tx_status); | 15030 | EXPORT_SYMBOL(cfg80211_mgmt_tx_status); |
15030 | 15031 | ||
15031 | static int __nl80211_rx_control_port(struct net_device *dev, | 15032 | static int __nl80211_rx_control_port(struct net_device *dev, |
15032 | const u8 *buf, size_t len, | 15033 | struct sk_buff *skb, |
15033 | const u8 *addr, u16 proto, | ||
15034 | bool unencrypted, gfp_t gfp) | 15034 | bool unencrypted, gfp_t gfp) |
15035 | { | 15035 | { |
15036 | struct wireless_dev *wdev = dev->ieee80211_ptr; | 15036 | struct wireless_dev *wdev = dev->ieee80211_ptr; |
15037 | struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); | 15037 | struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); |
15038 | struct ethhdr *ehdr = eth_hdr(skb); | ||
15039 | const u8 *addr = ehdr->h_source; | ||
15040 | u16 proto = be16_to_cpu(skb->protocol); | ||
15038 | struct sk_buff *msg; | 15041 | struct sk_buff *msg; |
15039 | void *hdr; | 15042 | void *hdr; |
15043 | struct nlattr *frame; | ||
15044 | |||
15040 | u32 nlportid = READ_ONCE(wdev->conn_owner_nlportid); | 15045 | u32 nlportid = READ_ONCE(wdev->conn_owner_nlportid); |
15041 | 15046 | ||
15042 | if (!nlportid) | 15047 | if (!nlportid) |
15043 | return -ENOENT; | 15048 | return -ENOENT; |
15044 | 15049 | ||
15045 | msg = nlmsg_new(100 + len, gfp); | 15050 | msg = nlmsg_new(100 + skb->len, gfp); |
15046 | if (!msg) | 15051 | if (!msg) |
15047 | return -ENOMEM; | 15052 | return -ENOMEM; |
15048 | 15053 | ||
@@ -15056,13 +15061,17 @@ static int __nl80211_rx_control_port(struct net_device *dev, | |||
15056 | nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || | 15061 | nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || |
15057 | nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), | 15062 | nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), |
15058 | NL80211_ATTR_PAD) || | 15063 | NL80211_ATTR_PAD) || |
15059 | nla_put(msg, NL80211_ATTR_FRAME, len, buf) || | ||
15060 | nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr) || | 15064 | nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr) || |
15061 | nla_put_u16(msg, NL80211_ATTR_CONTROL_PORT_ETHERTYPE, proto) || | 15065 | nla_put_u16(msg, NL80211_ATTR_CONTROL_PORT_ETHERTYPE, proto) || |
15062 | (unencrypted && nla_put_flag(msg, | 15066 | (unencrypted && nla_put_flag(msg, |
15063 | NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT))) | 15067 | NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT))) |
15064 | goto nla_put_failure; | 15068 | goto nla_put_failure; |
15065 | 15069 | ||
15070 | frame = nla_reserve(msg, NL80211_ATTR_FRAME, skb->len); | ||
15071 | if (!frame) | ||
15072 | goto nla_put_failure; | ||
15073 | |||
15074 | skb_copy_bits(skb, 0, nla_data(frame), skb->len); | ||
15066 | genlmsg_end(msg, hdr); | 15075 | genlmsg_end(msg, hdr); |
15067 | 15076 | ||
15068 | return genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid); | 15077 | return genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid); |
@@ -15073,14 +15082,12 @@ static int __nl80211_rx_control_port(struct net_device *dev, | |||
15073 | } | 15082 | } |
15074 | 15083 | ||
15075 | bool cfg80211_rx_control_port(struct net_device *dev, | 15084 | bool cfg80211_rx_control_port(struct net_device *dev, |
15076 | const u8 *buf, size_t len, | 15085 | struct sk_buff *skb, bool unencrypted) |
15077 | const u8 *addr, u16 proto, bool unencrypted) | ||
15078 | { | 15086 | { |
15079 | int ret; | 15087 | int ret; |
15080 | 15088 | ||
15081 | trace_cfg80211_rx_control_port(dev, buf, len, addr, proto, unencrypted); | 15089 | trace_cfg80211_rx_control_port(dev, skb, unencrypted); |
15082 | ret = __nl80211_rx_control_port(dev, buf, len, addr, proto, | 15090 | ret = __nl80211_rx_control_port(dev, skb, unencrypted, GFP_ATOMIC); |
15083 | unencrypted, GFP_ATOMIC); | ||
15084 | trace_cfg80211_return_bool(ret == 0); | 15091 | trace_cfg80211_return_bool(ret == 0); |
15085 | return ret == 0; | 15092 | return ret == 0; |
15086 | } | 15093 | } |
diff --git a/net/wireless/reg.c b/net/wireless/reg.c index bbe6298e4bb9..4fc66a117b7d 100644 --- a/net/wireless/reg.c +++ b/net/wireless/reg.c | |||
@@ -2240,7 +2240,9 @@ static void wiphy_update_regulatory(struct wiphy *wiphy, | |||
2240 | * as some drivers used this to restore its orig_* reg domain. | 2240 | * as some drivers used this to restore its orig_* reg domain. |
2241 | */ | 2241 | */ |
2242 | if (initiator == NL80211_REGDOM_SET_BY_CORE && | 2242 | if (initiator == NL80211_REGDOM_SET_BY_CORE && |
2243 | wiphy->regulatory_flags & REGULATORY_CUSTOM_REG) | 2243 | wiphy->regulatory_flags & REGULATORY_CUSTOM_REG && |
2244 | !(wiphy->regulatory_flags & | ||
2245 | REGULATORY_WIPHY_SELF_MANAGED)) | ||
2244 | reg_call_notifier(wiphy, lr); | 2246 | reg_call_notifier(wiphy, lr); |
2245 | return; | 2247 | return; |
2246 | } | 2248 | } |
@@ -2787,26 +2789,6 @@ static void notify_self_managed_wiphys(struct regulatory_request *request) | |||
2787 | } | 2789 | } |
2788 | } | 2790 | } |
2789 | 2791 | ||
2790 | static bool reg_only_self_managed_wiphys(void) | ||
2791 | { | ||
2792 | struct cfg80211_registered_device *rdev; | ||
2793 | struct wiphy *wiphy; | ||
2794 | bool self_managed_found = false; | ||
2795 | |||
2796 | ASSERT_RTNL(); | ||
2797 | |||
2798 | list_for_each_entry(rdev, &cfg80211_rdev_list, list) { | ||
2799 | wiphy = &rdev->wiphy; | ||
2800 | if (wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED) | ||
2801 | self_managed_found = true; | ||
2802 | else | ||
2803 | return false; | ||
2804 | } | ||
2805 | |||
2806 | /* make sure at least one self-managed wiphy exists */ | ||
2807 | return self_managed_found; | ||
2808 | } | ||
2809 | |||
2810 | /* | 2792 | /* |
2811 | * Processes regulatory hints, this is all the NL80211_REGDOM_SET_BY_* | 2793 | * Processes regulatory hints, this is all the NL80211_REGDOM_SET_BY_* |
2812 | * Regulatory hints come on a first come first serve basis and we | 2794 | * Regulatory hints come on a first come first serve basis and we |
@@ -2839,10 +2821,6 @@ static void reg_process_pending_hints(void) | |||
2839 | spin_unlock(®_requests_lock); | 2821 | spin_unlock(®_requests_lock); |
2840 | 2822 | ||
2841 | notify_self_managed_wiphys(reg_request); | 2823 | notify_self_managed_wiphys(reg_request); |
2842 | if (reg_only_self_managed_wiphys()) { | ||
2843 | reg_free_request(reg_request); | ||
2844 | return; | ||
2845 | } | ||
2846 | 2824 | ||
2847 | reg_process_hint(reg_request); | 2825 | reg_process_hint(reg_request); |
2848 | 2826 | ||
diff --git a/net/wireless/trace.h b/net/wireless/trace.h index 2b417a2fe63f..7c73510b161f 100644 --- a/net/wireless/trace.h +++ b/net/wireless/trace.h | |||
@@ -2627,23 +2627,25 @@ TRACE_EVENT(cfg80211_mgmt_tx_status, | |||
2627 | ); | 2627 | ); |
2628 | 2628 | ||
2629 | TRACE_EVENT(cfg80211_rx_control_port, | 2629 | TRACE_EVENT(cfg80211_rx_control_port, |
2630 | TP_PROTO(struct net_device *netdev, const u8 *buf, size_t len, | 2630 | TP_PROTO(struct net_device *netdev, struct sk_buff *skb, |
2631 | const u8 *addr, u16 proto, bool unencrypted), | 2631 | bool unencrypted), |
2632 | TP_ARGS(netdev, buf, len, addr, proto, unencrypted), | 2632 | TP_ARGS(netdev, skb, unencrypted), |
2633 | TP_STRUCT__entry( | 2633 | TP_STRUCT__entry( |
2634 | NETDEV_ENTRY | 2634 | NETDEV_ENTRY |
2635 | MAC_ENTRY(addr) | 2635 | __field(int, len) |
2636 | MAC_ENTRY(from) | ||
2636 | __field(u16, proto) | 2637 | __field(u16, proto) |
2637 | __field(bool, unencrypted) | 2638 | __field(bool, unencrypted) |
2638 | ), | 2639 | ), |
2639 | TP_fast_assign( | 2640 | TP_fast_assign( |
2640 | NETDEV_ASSIGN; | 2641 | NETDEV_ASSIGN; |
2641 | MAC_ASSIGN(addr, addr); | 2642 | __entry->len = skb->len; |
2642 | __entry->proto = proto; | 2643 | MAC_ASSIGN(from, eth_hdr(skb)->h_source); |
2644 | __entry->proto = be16_to_cpu(skb->protocol); | ||
2643 | __entry->unencrypted = unencrypted; | 2645 | __entry->unencrypted = unencrypted; |
2644 | ), | 2646 | ), |
2645 | TP_printk(NETDEV_PR_FMT ", " MAC_PR_FMT " proto: 0x%x, unencrypted: %s", | 2647 | TP_printk(NETDEV_PR_FMT ", len=%d, " MAC_PR_FMT ", proto: 0x%x, unencrypted: %s", |
2646 | NETDEV_PR_ARG, MAC_PR_ARG(addr), | 2648 | NETDEV_PR_ARG, __entry->len, MAC_PR_ARG(from), |
2647 | __entry->proto, BOOL_TO_STR(__entry->unencrypted)) | 2649 | __entry->proto, BOOL_TO_STR(__entry->unencrypted)) |
2648 | ); | 2650 | ); |
2649 | 2651 | ||