aboutsummaryrefslogtreecommitdiffstats
path: root/net/wireless
diff options
context:
space:
mode:
authorJohannes Berg <johannes.berg@intel.com>2013-12-16 05:23:45 -0500
committerJohannes Berg <johannes.berg@intel.com>2013-12-16 05:23:45 -0500
commitc4de673b775e4db48cd2db6277e0c6714332ca0c (patch)
tree84f9e4728e6ccf257236d2ba063b6e784ec8b65d /net/wireless
parentbafdc614a1f4f8be8cde41b8ab10ac17e67c1837 (diff)
parent55957fb7a0b61d8ab6ff3f04e279b8fc22b738fa (diff)
Merge remote-tracking branch 'wireless-next/master' into mac80211-next
Diffstat (limited to 'net/wireless')
-rw-r--r--net/wireless/core.c9
-rw-r--r--net/wireless/core.h6
-rw-r--r--net/wireless/ibss.c18
-rw-r--r--net/wireless/nl80211.c266
-rw-r--r--net/wireless/sysfs.h4
5 files changed, 152 insertions, 151 deletions
diff --git a/net/wireless/core.c b/net/wireless/core.c
index 1a92c6a0731f..d89dee2259b5 100644
--- a/net/wireless/core.c
+++ b/net/wireless/core.c
@@ -440,6 +440,15 @@ int wiphy_register(struct wiphy *wiphy)
440 int i; 440 int i;
441 u16 ifmodes = wiphy->interface_modes; 441 u16 ifmodes = wiphy->interface_modes;
442 442
443 /* support for 5/10 MHz is broken due to nl80211 API mess - disable */
444 wiphy->flags &= ~WIPHY_FLAG_SUPPORTS_5_10_MHZ;
445
446 /*
447 * There are major locking problems in nl80211/mac80211 for CSA,
448 * disable for all drivers until this has been reworked.
449 */
450 wiphy->flags &= ~WIPHY_FLAG_HAS_CHANNEL_SWITCH;
451
443#ifdef CONFIG_PM 452#ifdef CONFIG_PM
444 if (WARN_ON(wiphy->wowlan && 453 if (WARN_ON(wiphy->wowlan &&
445 (wiphy->wowlan->flags & WIPHY_WOWLAN_GTK_REKEY_FAILURE) && 454 (wiphy->wowlan->flags & WIPHY_WOWLAN_GTK_REKEY_FAILURE) &&
diff --git a/net/wireless/core.h b/net/wireless/core.h
index 453c6ed880f1..37ec16d7bb1a 100644
--- a/net/wireless/core.h
+++ b/net/wireless/core.h
@@ -232,10 +232,10 @@ struct cfg80211_beacon_registration {
232}; 232};
233 233
234/* free object */ 234/* free object */
235extern void cfg80211_dev_free(struct cfg80211_registered_device *rdev); 235void cfg80211_dev_free(struct cfg80211_registered_device *rdev);
236 236
237extern int cfg80211_dev_rename(struct cfg80211_registered_device *rdev, 237int cfg80211_dev_rename(struct cfg80211_registered_device *rdev,
238 char *newname); 238 char *newname);
239 239
240void ieee80211_set_bitrate_flags(struct wiphy *wiphy); 240void ieee80211_set_bitrate_flags(struct wiphy *wiphy);
241 241
diff --git a/net/wireless/ibss.c b/net/wireless/ibss.c
index f79105712949..730147ed8e65 100644
--- a/net/wireless/ibss.c
+++ b/net/wireless/ibss.c
@@ -262,7 +262,7 @@ int cfg80211_ibss_wext_join(struct cfg80211_registered_device *rdev,
262 262
263 /* try to find an IBSS channel if none requested ... */ 263 /* try to find an IBSS channel if none requested ... */
264 if (!wdev->wext.ibss.chandef.chan) { 264 if (!wdev->wext.ibss.chandef.chan) {
265 wdev->wext.ibss.chandef.width = NL80211_CHAN_WIDTH_20_NOHT; 265 struct ieee80211_channel *new_chan = NULL;
266 266
267 for (band = 0; band < IEEE80211_NUM_BANDS; band++) { 267 for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
268 struct ieee80211_supported_band *sband; 268 struct ieee80211_supported_band *sband;
@@ -278,18 +278,19 @@ int cfg80211_ibss_wext_join(struct cfg80211_registered_device *rdev,
278 continue; 278 continue;
279 if (chan->flags & IEEE80211_CHAN_DISABLED) 279 if (chan->flags & IEEE80211_CHAN_DISABLED)
280 continue; 280 continue;
281 wdev->wext.ibss.chandef.chan = chan; 281 new_chan = chan;
282 wdev->wext.ibss.chandef.center_freq1 =
283 chan->center_freq;
284 break; 282 break;
285 } 283 }
286 284
287 if (wdev->wext.ibss.chandef.chan) 285 if (new_chan)
288 break; 286 break;
289 } 287 }
290 288
291 if (!wdev->wext.ibss.chandef.chan) 289 if (!new_chan)
292 return -EINVAL; 290 return -EINVAL;
291
292 cfg80211_chandef_create(&wdev->wext.ibss.chandef, new_chan,
293 NL80211_CHAN_NO_HT);
293 } 294 }
294 295
295 /* don't join -- SSID is not there */ 296 /* don't join -- SSID is not there */
@@ -363,9 +364,8 @@ int cfg80211_ibss_wext_siwfreq(struct net_device *dev,
363 return err; 364 return err;
364 365
365 if (chan) { 366 if (chan) {
366 wdev->wext.ibss.chandef.chan = chan; 367 cfg80211_chandef_create(&wdev->wext.ibss.chandef, chan,
367 wdev->wext.ibss.chandef.width = NL80211_CHAN_WIDTH_20_NOHT; 368 NL80211_CHAN_NO_HT);
368 wdev->wext.ibss.chandef.center_freq1 = freq;
369 wdev->wext.ibss.channel_fixed = true; 369 wdev->wext.ibss.channel_fixed = true;
370 } else { 370 } else {
371 /* cfg80211_ibss_wext_join will pick one if needed */ 371 /* cfg80211_ibss_wext_join will pick one if needed */
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
index 801e57da88b4..2d0c19c6133b 100644
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
@@ -30,9 +30,9 @@ static int nl80211_crypto_settings(struct cfg80211_registered_device *rdev,
30 struct cfg80211_crypto_settings *settings, 30 struct cfg80211_crypto_settings *settings,
31 int cipher_limit); 31 int cipher_limit);
32 32
33static int nl80211_pre_doit(struct genl_ops *ops, struct sk_buff *skb, 33static int nl80211_pre_doit(const struct genl_ops *ops, struct sk_buff *skb,
34 struct genl_info *info); 34 struct genl_info *info);
35static void nl80211_post_doit(struct genl_ops *ops, struct sk_buff *skb, 35static void nl80211_post_doit(const struct genl_ops *ops, struct sk_buff *skb,
36 struct genl_info *info); 36 struct genl_info *info);
37 37
38/* the netlink family */ 38/* the netlink family */
@@ -47,6 +47,25 @@ static struct genl_family nl80211_fam = {
47 .post_doit = nl80211_post_doit, 47 .post_doit = nl80211_post_doit,
48}; 48};
49 49
50/* multicast groups */
51enum nl80211_multicast_groups {
52 NL80211_MCGRP_CONFIG,
53 NL80211_MCGRP_SCAN,
54 NL80211_MCGRP_REGULATORY,
55 NL80211_MCGRP_MLME,
56 NL80211_MCGRP_TESTMODE /* keep last - ifdef! */
57};
58
59static const struct genl_multicast_group nl80211_mcgrps[] = {
60 [NL80211_MCGRP_CONFIG] = { .name = "config", },
61 [NL80211_MCGRP_SCAN] = { .name = "scan", },
62 [NL80211_MCGRP_REGULATORY] = { .name = "regulatory", },
63 [NL80211_MCGRP_MLME] = { .name = "mlme", },
64#ifdef CONFIG_NL80211_TESTMODE
65 [NL80211_MCGRP_TESTMODE] = { .name = "testmode", }
66#endif
67};
68
50/* returns ERR_PTR values */ 69/* returns ERR_PTR values */
51static struct wireless_dev * 70static struct wireless_dev *
52__cfg80211_wdev_from_attrs(struct net *netns, struct nlattr **attrs) 71__cfg80211_wdev_from_attrs(struct net *netns, struct nlattr **attrs)
@@ -2687,7 +2706,7 @@ static int nl80211_get_key(struct sk_buff *skb, struct genl_info *info)
2687 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 2706 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
2688 NL80211_CMD_NEW_KEY); 2707 NL80211_CMD_NEW_KEY);
2689 if (!hdr) 2708 if (!hdr)
2690 return -ENOBUFS; 2709 goto nla_put_failure;
2691 2710
2692 cookie.msg = msg; 2711 cookie.msg = msg;
2693 cookie.idx = key_idx; 2712 cookie.idx = key_idx;
@@ -5370,6 +5389,10 @@ static int nl80211_trigger_scan(struct sk_buff *skb, struct genl_info *info)
5370 err = -EINVAL; 5389 err = -EINVAL;
5371 goto out_free; 5390 goto out_free;
5372 } 5391 }
5392
5393 if (!wiphy->bands[band])
5394 continue;
5395
5373 err = ieee80211_get_ratemask(wiphy->bands[band], 5396 err = ieee80211_get_ratemask(wiphy->bands[band],
5374 nla_data(attr), 5397 nla_data(attr),
5375 nla_len(attr), 5398 nla_len(attr),
@@ -6735,10 +6758,6 @@ __cfg80211_alloc_vendor_skb(struct cfg80211_registered_device *rdev,
6735} 6758}
6736 6759
6737#ifdef CONFIG_NL80211_TESTMODE 6760#ifdef CONFIG_NL80211_TESTMODE
6738static struct genl_multicast_group nl80211_testmode_mcgrp = {
6739 .name = "testmode",
6740};
6741
6742static int nl80211_testmode_do(struct sk_buff *skb, struct genl_info *info) 6761static int nl80211_testmode_do(struct sk_buff *skb, struct genl_info *info)
6743{ 6762{
6744 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 6763 struct cfg80211_registered_device *rdev = info->user_ptr[0];
@@ -6884,8 +6903,8 @@ void cfg80211_testmode_event(struct sk_buff *skb, gfp_t gfp)
6884 6903
6885 nla_nest_end(skb, data); 6904 nla_nest_end(skb, data);
6886 genlmsg_end(skb, hdr); 6905 genlmsg_end(skb, hdr);
6887 genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), skb, 0, 6906 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), skb, 0,
6888 nl80211_testmode_mcgrp.id, gfp); 6907 NL80211_MCGRP_TESTMODE, gfp);
6889} 6908}
6890EXPORT_SYMBOL(cfg80211_testmode_event); 6909EXPORT_SYMBOL(cfg80211_testmode_event);
6891#endif 6910#endif
@@ -8973,7 +8992,7 @@ EXPORT_SYMBOL_GPL(cfg80211_vendor_cmd_reply);
8973#define NL80211_FLAG_NEED_WDEV_UP (NL80211_FLAG_NEED_WDEV |\ 8992#define NL80211_FLAG_NEED_WDEV_UP (NL80211_FLAG_NEED_WDEV |\
8974 NL80211_FLAG_CHECK_NETDEV_UP) 8993 NL80211_FLAG_CHECK_NETDEV_UP)
8975 8994
8976static int nl80211_pre_doit(struct genl_ops *ops, struct sk_buff *skb, 8995static int nl80211_pre_doit(const struct genl_ops *ops, struct sk_buff *skb,
8977 struct genl_info *info) 8996 struct genl_info *info)
8978{ 8997{
8979 struct cfg80211_registered_device *rdev; 8998 struct cfg80211_registered_device *rdev;
@@ -9042,7 +9061,7 @@ static int nl80211_pre_doit(struct genl_ops *ops, struct sk_buff *skb,
9042 return 0; 9061 return 0;
9043} 9062}
9044 9063
9045static void nl80211_post_doit(struct genl_ops *ops, struct sk_buff *skb, 9064static void nl80211_post_doit(const struct genl_ops *ops, struct sk_buff *skb,
9046 struct genl_info *info) 9065 struct genl_info *info)
9047{ 9066{
9048 if (info->user_ptr[1]) { 9067 if (info->user_ptr[1]) {
@@ -9059,7 +9078,7 @@ static void nl80211_post_doit(struct genl_ops *ops, struct sk_buff *skb,
9059 rtnl_unlock(); 9078 rtnl_unlock();
9060} 9079}
9061 9080
9062static struct genl_ops nl80211_ops[] = { 9081static const struct genl_ops nl80211_ops[] = {
9063 { 9082 {
9064 .cmd = NL80211_CMD_GET_WIPHY, 9083 .cmd = NL80211_CMD_GET_WIPHY,
9065 .doit = nl80211_get_wiphy, 9084 .doit = nl80211_get_wiphy,
@@ -9696,21 +9715,6 @@ static struct genl_ops nl80211_ops[] = {
9696 }, 9715 },
9697}; 9716};
9698 9717
9699static struct genl_multicast_group nl80211_mlme_mcgrp = {
9700 .name = "mlme",
9701};
9702
9703/* multicast groups */
9704static struct genl_multicast_group nl80211_config_mcgrp = {
9705 .name = "config",
9706};
9707static struct genl_multicast_group nl80211_scan_mcgrp = {
9708 .name = "scan",
9709};
9710static struct genl_multicast_group nl80211_regulatory_mcgrp = {
9711 .name = "regulatory",
9712};
9713
9714/* notification functions */ 9718/* notification functions */
9715 9719
9716void nl80211_notify_dev_rename(struct cfg80211_registered_device *rdev) 9720void nl80211_notify_dev_rename(struct cfg80211_registered_device *rdev)
@@ -9727,8 +9731,8 @@ void nl80211_notify_dev_rename(struct cfg80211_registered_device *rdev)
9727 return; 9731 return;
9728 } 9732 }
9729 9733
9730 genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0, 9734 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
9731 nl80211_config_mcgrp.id, GFP_KERNEL); 9735 NL80211_MCGRP_CONFIG, GFP_KERNEL);
9732} 9736}
9733 9737
9734static int nl80211_add_scan_req(struct sk_buff *msg, 9738static int nl80211_add_scan_req(struct sk_buff *msg,
@@ -9763,8 +9767,9 @@ static int nl80211_add_scan_req(struct sk_buff *msg,
9763 nla_put(msg, NL80211_ATTR_IE, req->ie_len, req->ie)) 9767 nla_put(msg, NL80211_ATTR_IE, req->ie_len, req->ie))
9764 goto nla_put_failure; 9768 goto nla_put_failure;
9765 9769
9766 if (req->flags) 9770 if (req->flags &&
9767 nla_put_u32(msg, NL80211_ATTR_SCAN_FLAGS, req->flags); 9771 nla_put_u32(msg, NL80211_ATTR_SCAN_FLAGS, req->flags))
9772 goto nla_put_failure;
9768 9773
9769 return 0; 9774 return 0;
9770 nla_put_failure: 9775 nla_put_failure:
@@ -9837,8 +9842,8 @@ void nl80211_send_scan_start(struct cfg80211_registered_device *rdev,
9837 return; 9842 return;
9838 } 9843 }
9839 9844
9840 genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0, 9845 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
9841 nl80211_scan_mcgrp.id, GFP_KERNEL); 9846 NL80211_MCGRP_SCAN, GFP_KERNEL);
9842} 9847}
9843 9848
9844void nl80211_send_scan_done(struct cfg80211_registered_device *rdev, 9849void nl80211_send_scan_done(struct cfg80211_registered_device *rdev,
@@ -9856,8 +9861,8 @@ void nl80211_send_scan_done(struct cfg80211_registered_device *rdev,
9856 return; 9861 return;
9857 } 9862 }
9858 9863
9859 genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0, 9864 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
9860 nl80211_scan_mcgrp.id, GFP_KERNEL); 9865 NL80211_MCGRP_SCAN, GFP_KERNEL);
9861} 9866}
9862 9867
9863void nl80211_send_scan_aborted(struct cfg80211_registered_device *rdev, 9868void nl80211_send_scan_aborted(struct cfg80211_registered_device *rdev,
@@ -9875,8 +9880,8 @@ void nl80211_send_scan_aborted(struct cfg80211_registered_device *rdev,
9875 return; 9880 return;
9876 } 9881 }
9877 9882
9878 genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0, 9883 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
9879 nl80211_scan_mcgrp.id, GFP_KERNEL); 9884 NL80211_MCGRP_SCAN, GFP_KERNEL);
9880} 9885}
9881 9886
9882void nl80211_send_sched_scan_results(struct cfg80211_registered_device *rdev, 9887void nl80211_send_sched_scan_results(struct cfg80211_registered_device *rdev,
@@ -9894,8 +9899,8 @@ void nl80211_send_sched_scan_results(struct cfg80211_registered_device *rdev,
9894 return; 9899 return;
9895 } 9900 }
9896 9901
9897 genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0, 9902 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
9898 nl80211_scan_mcgrp.id, GFP_KERNEL); 9903 NL80211_MCGRP_SCAN, GFP_KERNEL);
9899} 9904}
9900 9905
9901void nl80211_send_sched_scan(struct cfg80211_registered_device *rdev, 9906void nl80211_send_sched_scan(struct cfg80211_registered_device *rdev,
@@ -9912,8 +9917,8 @@ void nl80211_send_sched_scan(struct cfg80211_registered_device *rdev,
9912 return; 9917 return;
9913 } 9918 }
9914 9919
9915 genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0, 9920 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
9916 nl80211_scan_mcgrp.id, GFP_KERNEL); 9921 NL80211_MCGRP_SCAN, GFP_KERNEL);
9917} 9922}
9918 9923
9919/* 9924/*
@@ -9967,8 +9972,8 @@ void nl80211_send_reg_change_event(struct regulatory_request *request)
9967 genlmsg_end(msg, hdr); 9972 genlmsg_end(msg, hdr);
9968 9973
9969 rcu_read_lock(); 9974 rcu_read_lock();
9970 genlmsg_multicast_allns(msg, 0, nl80211_regulatory_mcgrp.id, 9975 genlmsg_multicast_allns(&nl80211_fam, msg, 0,
9971 GFP_ATOMIC); 9976 NL80211_MCGRP_REGULATORY, GFP_ATOMIC);
9972 rcu_read_unlock(); 9977 rcu_read_unlock();
9973 9978
9974 return; 9979 return;
@@ -10003,8 +10008,8 @@ static void nl80211_send_mlme_event(struct cfg80211_registered_device *rdev,
10003 10008
10004 genlmsg_end(msg, hdr); 10009 genlmsg_end(msg, hdr);
10005 10010
10006 genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0, 10011 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
10007 nl80211_mlme_mcgrp.id, gfp); 10012 NL80211_MCGRP_MLME, gfp);
10008 return; 10013 return;
10009 10014
10010 nla_put_failure: 10015 nla_put_failure:
@@ -10091,8 +10096,8 @@ static void nl80211_send_mlme_timeout(struct cfg80211_registered_device *rdev,
10091 10096
10092 genlmsg_end(msg, hdr); 10097 genlmsg_end(msg, hdr);
10093 10098
10094 genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0, 10099 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
10095 nl80211_mlme_mcgrp.id, gfp); 10100 NL80211_MCGRP_MLME, gfp);
10096 return; 10101 return;
10097 10102
10098 nla_put_failure: 10103 nla_put_failure:
@@ -10147,8 +10152,8 @@ void nl80211_send_connect_result(struct cfg80211_registered_device *rdev,
10147 10152
10148 genlmsg_end(msg, hdr); 10153 genlmsg_end(msg, hdr);
10149 10154
10150 genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0, 10155 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
10151 nl80211_mlme_mcgrp.id, gfp); 10156 NL80211_MCGRP_MLME, gfp);
10152 return; 10157 return;
10153 10158
10154 nla_put_failure: 10159 nla_put_failure:
@@ -10186,8 +10191,8 @@ void nl80211_send_roamed(struct cfg80211_registered_device *rdev,
10186 10191
10187 genlmsg_end(msg, hdr); 10192 genlmsg_end(msg, hdr);
10188 10193
10189 genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0, 10194 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
10190 nl80211_mlme_mcgrp.id, gfp); 10195 NL80211_MCGRP_MLME, gfp);
10191 return; 10196 return;
10192 10197
10193 nla_put_failure: 10198 nla_put_failure:
@@ -10224,8 +10229,8 @@ void nl80211_send_disconnected(struct cfg80211_registered_device *rdev,
10224 10229
10225 genlmsg_end(msg, hdr); 10230 genlmsg_end(msg, hdr);
10226 10231
10227 genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0, 10232 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
10228 nl80211_mlme_mcgrp.id, GFP_KERNEL); 10233 NL80211_MCGRP_MLME, GFP_KERNEL);
10229 return; 10234 return;
10230 10235
10231 nla_put_failure: 10236 nla_put_failure:
@@ -10258,8 +10263,8 @@ void nl80211_send_ibss_bssid(struct cfg80211_registered_device *rdev,
10258 10263
10259 genlmsg_end(msg, hdr); 10264 genlmsg_end(msg, hdr);
10260 10265
10261 genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0, 10266 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
10262 nl80211_mlme_mcgrp.id, gfp); 10267 NL80211_MCGRP_MLME, gfp);
10263 return; 10268 return;
10264 10269
10265 nla_put_failure: 10270 nla_put_failure:
@@ -10299,8 +10304,8 @@ void cfg80211_notify_new_peer_candidate(struct net_device *dev, const u8 *addr,
10299 10304
10300 genlmsg_end(msg, hdr); 10305 genlmsg_end(msg, hdr);
10301 10306
10302 genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0, 10307 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
10303 nl80211_mlme_mcgrp.id, gfp); 10308 NL80211_MCGRP_MLME, gfp);
10304 return; 10309 return;
10305 10310
10306 nla_put_failure: 10311 nla_put_failure:
@@ -10338,8 +10343,8 @@ void nl80211_michael_mic_failure(struct cfg80211_registered_device *rdev,
10338 10343
10339 genlmsg_end(msg, hdr); 10344 genlmsg_end(msg, hdr);
10340 10345
10341 genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0, 10346 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
10342 nl80211_mlme_mcgrp.id, gfp); 10347 NL80211_MCGRP_MLME, gfp);
10343 return; 10348 return;
10344 10349
10345 nla_put_failure: 10350 nla_put_failure:
@@ -10391,8 +10396,8 @@ void nl80211_send_beacon_hint_event(struct wiphy *wiphy,
10391 genlmsg_end(msg, hdr); 10396 genlmsg_end(msg, hdr);
10392 10397
10393 rcu_read_lock(); 10398 rcu_read_lock();
10394 genlmsg_multicast_allns(msg, 0, nl80211_regulatory_mcgrp.id, 10399 genlmsg_multicast_allns(&nl80211_fam, msg, 0,
10395 GFP_ATOMIC); 10400 NL80211_MCGRP_REGULATORY, GFP_ATOMIC);
10396 rcu_read_unlock(); 10401 rcu_read_unlock();
10397 10402
10398 return; 10403 return;
@@ -10437,8 +10442,8 @@ static void nl80211_send_remain_on_chan_event(
10437 10442
10438 genlmsg_end(msg, hdr); 10443 genlmsg_end(msg, hdr);
10439 10444
10440 genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0, 10445 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
10441 nl80211_mlme_mcgrp.id, gfp); 10446 NL80211_MCGRP_MLME, gfp);
10442 return; 10447 return;
10443 10448
10444 nla_put_failure: 10449 nla_put_failure:
@@ -10492,8 +10497,8 @@ void cfg80211_new_sta(struct net_device *dev, const u8 *mac_addr,
10492 return; 10497 return;
10493 } 10498 }
10494 10499
10495 genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0, 10500 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
10496 nl80211_mlme_mcgrp.id, gfp); 10501 NL80211_MCGRP_MLME, gfp);
10497} 10502}
10498EXPORT_SYMBOL(cfg80211_new_sta); 10503EXPORT_SYMBOL(cfg80211_new_sta);
10499 10504
@@ -10522,8 +10527,8 @@ void cfg80211_del_sta(struct net_device *dev, const u8 *mac_addr, gfp_t gfp)
10522 10527
10523 genlmsg_end(msg, hdr); 10528 genlmsg_end(msg, hdr);
10524 10529
10525 genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0, 10530 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
10526 nl80211_mlme_mcgrp.id, gfp); 10531 NL80211_MCGRP_MLME, gfp);
10527 return; 10532 return;
10528 10533
10529 nla_put_failure: 10534 nla_put_failure:
@@ -10558,8 +10563,8 @@ void cfg80211_conn_failed(struct net_device *dev, const u8 *mac_addr,
10558 10563
10559 genlmsg_end(msg, hdr); 10564 genlmsg_end(msg, hdr);
10560 10565
10561 genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0, 10566 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
10562 nl80211_mlme_mcgrp.id, gfp); 10567 NL80211_MCGRP_MLME, gfp);
10563 return; 10568 return;
10564 10569
10565 nla_put_failure: 10570 nla_put_failure:
@@ -10720,8 +10725,8 @@ void cfg80211_mgmt_tx_status(struct wireless_dev *wdev, u64 cookie,
10720 10725
10721 genlmsg_end(msg, hdr); 10726 genlmsg_end(msg, hdr);
10722 10727
10723 genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0, 10728 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
10724 nl80211_mlme_mcgrp.id, gfp); 10729 NL80211_MCGRP_MLME, gfp);
10725 return; 10730 return;
10726 10731
10727 nla_put_failure: 10732 nla_put_failure:
@@ -10769,8 +10774,8 @@ void cfg80211_cqm_rssi_notify(struct net_device *dev,
10769 10774
10770 genlmsg_end(msg, hdr); 10775 genlmsg_end(msg, hdr);
10771 10776
10772 genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0, 10777 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
10773 nl80211_mlme_mcgrp.id, gfp); 10778 NL80211_MCGRP_MLME, gfp);
10774 return; 10779 return;
10775 10780
10776 nla_put_failure: 10781 nla_put_failure:
@@ -10814,8 +10819,8 @@ static void nl80211_gtk_rekey_notify(struct cfg80211_registered_device *rdev,
10814 10819
10815 genlmsg_end(msg, hdr); 10820 genlmsg_end(msg, hdr);
10816 10821
10817 genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0, 10822 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
10818 nl80211_mlme_mcgrp.id, gfp); 10823 NL80211_MCGRP_MLME, gfp);
10819 return; 10824 return;
10820 10825
10821 nla_put_failure: 10826 nla_put_failure:
@@ -10872,8 +10877,8 @@ nl80211_pmksa_candidate_notify(struct cfg80211_registered_device *rdev,
10872 10877
10873 genlmsg_end(msg, hdr); 10878 genlmsg_end(msg, hdr);
10874 10879
10875 genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0, 10880 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
10876 nl80211_mlme_mcgrp.id, gfp); 10881 NL80211_MCGRP_MLME, gfp);
10877 return; 10882 return;
10878 10883
10879 nla_put_failure: 10884 nla_put_failure:
@@ -10919,8 +10924,8 @@ static void nl80211_ch_switch_notify(struct cfg80211_registered_device *rdev,
10919 10924
10920 genlmsg_end(msg, hdr); 10925 genlmsg_end(msg, hdr);
10921 10926
10922 genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0, 10927 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
10923 nl80211_mlme_mcgrp.id, gfp); 10928 NL80211_MCGRP_MLME, gfp);
10924 return; 10929 return;
10925 10930
10926 nla_put_failure: 10931 nla_put_failure:
@@ -10993,8 +10998,8 @@ void cfg80211_cqm_txe_notify(struct net_device *dev,
10993 10998
10994 genlmsg_end(msg, hdr); 10999 genlmsg_end(msg, hdr);
10995 11000
10996 genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0, 11001 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
10997 nl80211_mlme_mcgrp.id, gfp); 11002 NL80211_MCGRP_MLME, gfp);
10998 return; 11003 return;
10999 11004
11000 nla_put_failure: 11005 nla_put_failure:
@@ -11042,8 +11047,8 @@ nl80211_radar_notify(struct cfg80211_registered_device *rdev,
11042 11047
11043 genlmsg_end(msg, hdr); 11048 genlmsg_end(msg, hdr);
11044 11049
11045 genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0, 11050 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
11046 nl80211_mlme_mcgrp.id, gfp); 11051 NL80211_MCGRP_MLME, gfp);
11047 return; 11052 return;
11048 11053
11049 nla_put_failure: 11054 nla_put_failure:
@@ -11089,8 +11094,8 @@ void cfg80211_cqm_pktloss_notify(struct net_device *dev,
11089 11094
11090 genlmsg_end(msg, hdr); 11095 genlmsg_end(msg, hdr);
11091 11096
11092 genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0, 11097 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
11093 nl80211_mlme_mcgrp.id, gfp); 11098 NL80211_MCGRP_MLME, gfp);
11094 return; 11099 return;
11095 11100
11096 nla_put_failure: 11101 nla_put_failure:
@@ -11129,8 +11134,8 @@ void cfg80211_probe_status(struct net_device *dev, const u8 *addr,
11129 11134
11130 genlmsg_end(msg, hdr); 11135 genlmsg_end(msg, hdr);
11131 11136
11132 genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0, 11137 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
11133 nl80211_mlme_mcgrp.id, gfp); 11138 NL80211_MCGRP_MLME, gfp);
11134 return; 11139 return;
11135 11140
11136 nla_put_failure: 11141 nla_put_failure:
@@ -11220,6 +11225,8 @@ void cfg80211_report_wowlan_wakeup(struct wireless_dev *wdev,
11220 struct nlattr *reasons; 11225 struct nlattr *reasons;
11221 11226
11222 reasons = nla_nest_start(msg, NL80211_ATTR_WOWLAN_TRIGGERS); 11227 reasons = nla_nest_start(msg, NL80211_ATTR_WOWLAN_TRIGGERS);
11228 if (!reasons)
11229 goto free_msg;
11223 11230
11224 if (wakeup->disconnect && 11231 if (wakeup->disconnect &&
11225 nla_put_flag(msg, NL80211_WOWLAN_TRIG_DISCONNECT)) 11232 nla_put_flag(msg, NL80211_WOWLAN_TRIG_DISCONNECT))
@@ -11245,16 +11252,18 @@ void cfg80211_report_wowlan_wakeup(struct wireless_dev *wdev,
11245 wakeup->pattern_idx)) 11252 wakeup->pattern_idx))
11246 goto free_msg; 11253 goto free_msg;
11247 11254
11248 if (wakeup->tcp_match) 11255 if (wakeup->tcp_match &&
11249 nla_put_flag(msg, NL80211_WOWLAN_TRIG_WAKEUP_TCP_MATCH); 11256 nla_put_flag(msg, NL80211_WOWLAN_TRIG_WAKEUP_TCP_MATCH))
11257 goto free_msg;
11250 11258
11251 if (wakeup->tcp_connlost) 11259 if (wakeup->tcp_connlost &&
11252 nla_put_flag(msg, 11260 nla_put_flag(msg, NL80211_WOWLAN_TRIG_WAKEUP_TCP_CONNLOST))
11253 NL80211_WOWLAN_TRIG_WAKEUP_TCP_CONNLOST); 11261 goto free_msg;
11254 11262
11255 if (wakeup->tcp_nomoretokens) 11263 if (wakeup->tcp_nomoretokens &&
11256 nla_put_flag(msg, 11264 nla_put_flag(msg,
11257 NL80211_WOWLAN_TRIG_WAKEUP_TCP_NOMORETOKENS); 11265 NL80211_WOWLAN_TRIG_WAKEUP_TCP_NOMORETOKENS))
11266 goto free_msg;
11258 11267
11259 if (wakeup->packet) { 11268 if (wakeup->packet) {
11260 u32 pkt_attr = NL80211_WOWLAN_TRIG_WAKEUP_PKT_80211; 11269 u32 pkt_attr = NL80211_WOWLAN_TRIG_WAKEUP_PKT_80211;
@@ -11281,8 +11290,8 @@ void cfg80211_report_wowlan_wakeup(struct wireless_dev *wdev,
11281 11290
11282 genlmsg_end(msg, hdr); 11291 genlmsg_end(msg, hdr);
11283 11292
11284 genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0, 11293 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
11285 nl80211_mlme_mcgrp.id, gfp); 11294 NL80211_MCGRP_MLME, gfp);
11286 return; 11295 return;
11287 11296
11288 free_msg: 11297 free_msg:
@@ -11323,8 +11332,8 @@ void cfg80211_tdls_oper_request(struct net_device *dev, const u8 *peer,
11323 11332
11324 genlmsg_end(msg, hdr); 11333 genlmsg_end(msg, hdr);
11325 11334
11326 genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0, 11335 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
11327 nl80211_mlme_mcgrp.id, gfp); 11336 NL80211_MCGRP_MLME, gfp);
11328 return; 11337 return;
11329 11338
11330 nla_put_failure: 11339 nla_put_failure:
@@ -11390,24 +11399,29 @@ void cfg80211_ft_event(struct net_device *netdev,
11390 return; 11399 return;
11391 11400
11392 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_FT_EVENT); 11401 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_FT_EVENT);
11393 if (!hdr) { 11402 if (!hdr)
11394 nlmsg_free(msg); 11403 goto out;
11395 return;
11396 }
11397 11404
11398 nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx); 11405 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
11399 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex); 11406 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
11400 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, ft_event->target_ap); 11407 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, ft_event->target_ap))
11401 if (ft_event->ies) 11408 goto out;
11402 nla_put(msg, NL80211_ATTR_IE, ft_event->ies_len, ft_event->ies); 11409
11403 if (ft_event->ric_ies) 11410 if (ft_event->ies &&
11404 nla_put(msg, NL80211_ATTR_IE_RIC, ft_event->ric_ies_len, 11411 nla_put(msg, NL80211_ATTR_IE, ft_event->ies_len, ft_event->ies))
11405 ft_event->ric_ies); 11412 goto out;
11413 if (ft_event->ric_ies &&
11414 nla_put(msg, NL80211_ATTR_IE_RIC, ft_event->ric_ies_len,
11415 ft_event->ric_ies))
11416 goto out;
11406 11417
11407 genlmsg_end(msg, hdr); 11418 genlmsg_end(msg, hdr);
11408 11419
11409 genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0, 11420 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
11410 nl80211_mlme_mcgrp.id, GFP_KERNEL); 11421 NL80211_MCGRP_MLME, GFP_KERNEL);
11422 return;
11423 out:
11424 nlmsg_free(msg);
11411} 11425}
11412EXPORT_SYMBOL(cfg80211_ft_event); 11426EXPORT_SYMBOL(cfg80211_ft_event);
11413 11427
@@ -11456,33 +11470,11 @@ int nl80211_init(void)
11456{ 11470{
11457 int err; 11471 int err;
11458 11472
11459 err = genl_register_family_with_ops(&nl80211_fam, 11473 err = genl_register_family_with_ops_groups(&nl80211_fam, nl80211_ops,
11460 nl80211_ops, ARRAY_SIZE(nl80211_ops)); 11474 nl80211_mcgrps);
11461 if (err) 11475 if (err)
11462 return err; 11476 return err;
11463 11477
11464 err = genl_register_mc_group(&nl80211_fam, &nl80211_config_mcgrp);
11465 if (err)
11466 goto err_out;
11467
11468 err = genl_register_mc_group(&nl80211_fam, &nl80211_scan_mcgrp);
11469 if (err)
11470 goto err_out;
11471
11472 err = genl_register_mc_group(&nl80211_fam, &nl80211_regulatory_mcgrp);
11473 if (err)
11474 goto err_out;
11475
11476 err = genl_register_mc_group(&nl80211_fam, &nl80211_mlme_mcgrp);
11477 if (err)
11478 goto err_out;
11479
11480#ifdef CONFIG_NL80211_TESTMODE
11481 err = genl_register_mc_group(&nl80211_fam, &nl80211_testmode_mcgrp);
11482 if (err)
11483 goto err_out;
11484#endif
11485
11486 err = netlink_register_notifier(&nl80211_netlink_notifier); 11478 err = netlink_register_notifier(&nl80211_netlink_notifier);
11487 if (err) 11479 if (err)
11488 goto err_out; 11480 goto err_out;
diff --git a/net/wireless/sysfs.h b/net/wireless/sysfs.h
index 65acbebd3711..b533ed71daff 100644
--- a/net/wireless/sysfs.h
+++ b/net/wireless/sysfs.h
@@ -1,8 +1,8 @@
1#ifndef __WIRELESS_SYSFS_H 1#ifndef __WIRELESS_SYSFS_H
2#define __WIRELESS_SYSFS_H 2#define __WIRELESS_SYSFS_H
3 3
4extern int wiphy_sysfs_init(void); 4int wiphy_sysfs_init(void);
5extern void wiphy_sysfs_exit(void); 5void wiphy_sysfs_exit(void);
6 6
7extern struct class ieee80211_class; 7extern struct class ieee80211_class;
8 8