summaryrefslogtreecommitdiffstats
path: root/net/wireless
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2018-07-24 22:21:58 -0400
committerDavid S. Miller <davem@davemloft.net>2018-07-24 22:21:58 -0400
commit19725496da5602b401eae389736ab00d1817e264 (patch)
tree4c1a94bf0121769110f1b9c08ee337a55679a48a /net/wireless
parentaea5f654e6b78a0c976f7a25950155932c77a53f (diff)
parent9981b4fb8684883dcc0daf088891ff32260b9794 (diff)
Merge ra.kernel.org:/pub/scm/linux/kernel/git/davem/net
Diffstat (limited to 'net/wireless')
-rw-r--r--net/wireless/nl80211.c25
-rw-r--r--net/wireless/reg.c28
-rw-r--r--net/wireless/trace.h18
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,
15029EXPORT_SYMBOL(cfg80211_mgmt_tx_status); 15030EXPORT_SYMBOL(cfg80211_mgmt_tx_status);
15030 15031
15031static int __nl80211_rx_control_port(struct net_device *dev, 15032static 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
15075bool cfg80211_rx_control_port(struct net_device *dev, 15084bool 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
2790static 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(&reg_requests_lock); 2821 spin_unlock(&reg_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
2629TRACE_EVENT(cfg80211_rx_control_port, 2629TRACE_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