aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorJohannes Berg <johannes.berg@intel.com>2012-06-15 09:30:18 -0400
committerJohannes Berg <johannes.berg@intel.com>2012-07-09 08:51:47 -0400
commit71bbc9943883cffaf5d7a7728a4e4c50b3ac44d3 (patch)
tree9810d365fc57be75ee59cf4883216202ac2c5e09 /net
parentba22fb5b25db1e18692e2d01f8addb3fea0af813 (diff)
cfg80211: use wdev in mgmt-tx/ROC APIs
The management frame and remain-on-channel APIs will be needed in the P2P device abstraction, so move them over to the new wdev-based APIs. Userspace can still use both the interface index and wdev identifier for them so it's backward compatible, but for the P2P Device wdev it will be able to use the wdev identifier only. Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'net')
-rw-r--r--net/mac80211/cfg.c21
-rw-r--r--net/mac80211/ieee80211_i.h6
-rw-r--r--net/mac80211/offchannel.c6
-rw-r--r--net/mac80211/rx.c2
-rw-r--r--net/mac80211/status.c9
-rw-r--r--net/wireless/core.h2
-rw-r--r--net/wireless/mlme.c34
-rw-r--r--net/wireless/nl80211.c119
-rw-r--r--net/wireless/nl80211.h10
9 files changed, 118 insertions, 91 deletions
diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c
index 6a171e299b57..7d9abea37b17 100644
--- a/net/mac80211/cfg.c
+++ b/net/mac80211/cfg.c
@@ -2299,13 +2299,13 @@ static int ieee80211_start_roc_work(struct ieee80211_local *local,
2299} 2299}
2300 2300
2301static int ieee80211_remain_on_channel(struct wiphy *wiphy, 2301static int ieee80211_remain_on_channel(struct wiphy *wiphy,
2302 struct net_device *dev, 2302 struct wireless_dev *wdev,
2303 struct ieee80211_channel *chan, 2303 struct ieee80211_channel *chan,
2304 enum nl80211_channel_type channel_type, 2304 enum nl80211_channel_type channel_type,
2305 unsigned int duration, 2305 unsigned int duration,
2306 u64 *cookie) 2306 u64 *cookie)
2307{ 2307{
2308 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); 2308 struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
2309 struct ieee80211_local *local = sdata->local; 2309 struct ieee80211_local *local = sdata->local;
2310 int ret; 2310 int ret;
2311 2311
@@ -2392,23 +2392,23 @@ static int ieee80211_cancel_roc(struct ieee80211_local *local,
2392} 2392}
2393 2393
2394static int ieee80211_cancel_remain_on_channel(struct wiphy *wiphy, 2394static int ieee80211_cancel_remain_on_channel(struct wiphy *wiphy,
2395 struct net_device *dev, 2395 struct wireless_dev *wdev,
2396 u64 cookie) 2396 u64 cookie)
2397{ 2397{
2398 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); 2398 struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
2399 struct ieee80211_local *local = sdata->local; 2399 struct ieee80211_local *local = sdata->local;
2400 2400
2401 return ieee80211_cancel_roc(local, cookie, false); 2401 return ieee80211_cancel_roc(local, cookie, false);
2402} 2402}
2403 2403
2404static int ieee80211_mgmt_tx(struct wiphy *wiphy, struct net_device *dev, 2404static int ieee80211_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev,
2405 struct ieee80211_channel *chan, bool offchan, 2405 struct ieee80211_channel *chan, bool offchan,
2406 enum nl80211_channel_type channel_type, 2406 enum nl80211_channel_type channel_type,
2407 bool channel_type_valid, unsigned int wait, 2407 bool channel_type_valid, unsigned int wait,
2408 const u8 *buf, size_t len, bool no_cck, 2408 const u8 *buf, size_t len, bool no_cck,
2409 bool dont_wait_for_ack, u64 *cookie) 2409 bool dont_wait_for_ack, u64 *cookie)
2410{ 2410{
2411 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); 2411 struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
2412 struct ieee80211_local *local = sdata->local; 2412 struct ieee80211_local *local = sdata->local;
2413 struct sk_buff *skb; 2413 struct sk_buff *skb;
2414 struct sta_info *sta; 2414 struct sta_info *sta;
@@ -2513,21 +2513,20 @@ static int ieee80211_mgmt_tx(struct wiphy *wiphy, struct net_device *dev,
2513} 2513}
2514 2514
2515static int ieee80211_mgmt_tx_cancel_wait(struct wiphy *wiphy, 2515static int ieee80211_mgmt_tx_cancel_wait(struct wiphy *wiphy,
2516 struct net_device *dev, 2516 struct wireless_dev *wdev,
2517 u64 cookie) 2517 u64 cookie)
2518{ 2518{
2519 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); 2519 struct ieee80211_local *local = wiphy_priv(wiphy);
2520 struct ieee80211_local *local = sdata->local;
2521 2520
2522 return ieee80211_cancel_roc(local, cookie, true); 2521 return ieee80211_cancel_roc(local, cookie, true);
2523} 2522}
2524 2523
2525static void ieee80211_mgmt_frame_register(struct wiphy *wiphy, 2524static void ieee80211_mgmt_frame_register(struct wiphy *wiphy,
2526 struct net_device *dev, 2525 struct wireless_dev *wdev,
2527 u16 frame_type, bool reg) 2526 u16 frame_type, bool reg)
2528{ 2527{
2529 struct ieee80211_local *local = wiphy_priv(wiphy); 2528 struct ieee80211_local *local = wiphy_priv(wiphy);
2530 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); 2529 struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
2531 2530
2532 switch (frame_type) { 2531 switch (frame_type) {
2533 case IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_AUTH: 2532 case IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_AUTH:
diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h
index e0423f8c0ce1..8f8535ee5995 100644
--- a/net/mac80211/ieee80211_i.h
+++ b/net/mac80211/ieee80211_i.h
@@ -1091,6 +1091,12 @@ IEEE80211_DEV_TO_SUB_IF(struct net_device *dev)
1091 return netdev_priv(dev); 1091 return netdev_priv(dev);
1092} 1092}
1093 1093
1094static inline struct ieee80211_sub_if_data *
1095IEEE80211_WDEV_TO_SUB_IF(struct wireless_dev *wdev)
1096{
1097 return container_of(wdev, struct ieee80211_sub_if_data, wdev);
1098}
1099
1094/* this struct represents 802.11n's RA/TID combination */ 1100/* this struct represents 802.11n's RA/TID combination */
1095struct ieee80211_ra_tid { 1101struct ieee80211_ra_tid {
1096 u8 ra[ETH_ALEN]; 1102 u8 ra[ETH_ALEN];
diff --git a/net/mac80211/offchannel.c b/net/mac80211/offchannel.c
index b0fb6a2b89ad..8c047fc8b325 100644
--- a/net/mac80211/offchannel.c
+++ b/net/mac80211/offchannel.c
@@ -191,7 +191,7 @@ void ieee80211_handle_roc_started(struct ieee80211_roc_work *roc)
191 roc->frame = NULL; 191 roc->frame = NULL;
192 } 192 }
193 } else { 193 } else {
194 cfg80211_ready_on_channel(roc->sdata->dev, (unsigned long)roc, 194 cfg80211_ready_on_channel(&roc->sdata->wdev, (unsigned long)roc,
195 roc->chan, roc->chan_type, 195 roc->chan, roc->chan_type,
196 roc->req_duration, GFP_KERNEL); 196 roc->req_duration, GFP_KERNEL);
197 } 197 }
@@ -299,7 +299,7 @@ void ieee80211_roc_notify_destroy(struct ieee80211_roc_work *roc)
299 299
300 /* was never transmitted */ 300 /* was never transmitted */
301 if (roc->frame) { 301 if (roc->frame) {
302 cfg80211_mgmt_tx_status(roc->sdata->dev, 302 cfg80211_mgmt_tx_status(&roc->sdata->wdev,
303 (unsigned long)roc->frame, 303 (unsigned long)roc->frame,
304 roc->frame->data, roc->frame->len, 304 roc->frame->data, roc->frame->len,
305 false, GFP_KERNEL); 305 false, GFP_KERNEL);
@@ -307,7 +307,7 @@ void ieee80211_roc_notify_destroy(struct ieee80211_roc_work *roc)
307 } 307 }
308 308
309 if (!roc->mgmt_tx_cookie) 309 if (!roc->mgmt_tx_cookie)
310 cfg80211_remain_on_channel_expired(roc->sdata->dev, 310 cfg80211_remain_on_channel_expired(&roc->sdata->wdev,
311 (unsigned long)roc, 311 (unsigned long)roc,
312 roc->chan, roc->chan_type, 312 roc->chan, roc->chan_type,
313 GFP_KERNEL); 313 GFP_KERNEL);
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c
index ab5185054e6c..f8cf9e7477a3 100644
--- a/net/mac80211/rx.c
+++ b/net/mac80211/rx.c
@@ -2404,7 +2404,7 @@ ieee80211_rx_h_userspace_mgmt(struct ieee80211_rx_data *rx)
2404 if (rx->local->hw.flags & IEEE80211_HW_SIGNAL_DBM) 2404 if (rx->local->hw.flags & IEEE80211_HW_SIGNAL_DBM)
2405 sig = status->signal; 2405 sig = status->signal;
2406 2406
2407 if (cfg80211_rx_mgmt(rx->sdata->dev, status->freq, sig, 2407 if (cfg80211_rx_mgmt(&rx->sdata->wdev, status->freq, sig,
2408 rx->skb->data, rx->skb->len, 2408 rx->skb->data, rx->skb->len,
2409 GFP_ATOMIC)) { 2409 GFP_ATOMIC)) {
2410 if (rx->sta) 2410 if (rx->sta)
diff --git a/net/mac80211/status.c b/net/mac80211/status.c
index 2ed2f27fe8a7..8cd72914cdaf 100644
--- a/net/mac80211/status.c
+++ b/net/mac80211/status.c
@@ -519,14 +519,19 @@ void ieee80211_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb)
519 u64 cookie = (unsigned long)skb; 519 u64 cookie = (unsigned long)skb;
520 acked = info->flags & IEEE80211_TX_STAT_ACK; 520 acked = info->flags & IEEE80211_TX_STAT_ACK;
521 521
522 /*
523 * TODO: When we have non-netdev frame TX,
524 * we cannot use skb->dev->ieee80211_ptr
525 */
526
522 if (ieee80211_is_nullfunc(hdr->frame_control) || 527 if (ieee80211_is_nullfunc(hdr->frame_control) ||
523 ieee80211_is_qos_nullfunc(hdr->frame_control)) 528 ieee80211_is_qos_nullfunc(hdr->frame_control))
524 cfg80211_probe_status(skb->dev, hdr->addr1, 529 cfg80211_probe_status(skb->dev, hdr->addr1,
525 cookie, acked, GFP_ATOMIC); 530 cookie, acked, GFP_ATOMIC);
526 else 531 else
527 cfg80211_mgmt_tx_status( 532 cfg80211_mgmt_tx_status(
528 skb->dev, cookie, skb->data, skb->len, 533 skb->dev->ieee80211_ptr, cookie, skb->data,
529 acked, GFP_ATOMIC); 534 skb->len, acked, GFP_ATOMIC);
530 } 535 }
531 536
532 if (unlikely(info->ack_frame_id)) { 537 if (unlikely(info->ack_frame_id)) {
diff --git a/net/wireless/core.h b/net/wireless/core.h
index 6b0170a5f05f..eae5a25a1691 100644
--- a/net/wireless/core.h
+++ b/net/wireless/core.h
@@ -372,7 +372,7 @@ int cfg80211_mlme_register_mgmt(struct wireless_dev *wdev, u32 snd_pid,
372void cfg80211_mlme_unregister_socket(struct wireless_dev *wdev, u32 nlpid); 372void cfg80211_mlme_unregister_socket(struct wireless_dev *wdev, u32 nlpid);
373void cfg80211_mlme_purge_registrations(struct wireless_dev *wdev); 373void cfg80211_mlme_purge_registrations(struct wireless_dev *wdev);
374int cfg80211_mlme_mgmt_tx(struct cfg80211_registered_device *rdev, 374int cfg80211_mlme_mgmt_tx(struct cfg80211_registered_device *rdev,
375 struct net_device *dev, 375 struct wireless_dev *wdev,
376 struct ieee80211_channel *chan, bool offchan, 376 struct ieee80211_channel *chan, bool offchan,
377 enum nl80211_channel_type channel_type, 377 enum nl80211_channel_type channel_type,
378 bool channel_type_valid, unsigned int wait, 378 bool channel_type_valid, unsigned int wait,
diff --git a/net/wireless/mlme.c b/net/wireless/mlme.c
index d4fece3bb18a..abe9f82d5a82 100644
--- a/net/wireless/mlme.c
+++ b/net/wireless/mlme.c
@@ -567,29 +567,28 @@ void cfg80211_mlme_down(struct cfg80211_registered_device *rdev,
567 } 567 }
568} 568}
569 569
570void cfg80211_ready_on_channel(struct net_device *dev, u64 cookie, 570void cfg80211_ready_on_channel(struct wireless_dev *wdev, u64 cookie,
571 struct ieee80211_channel *chan, 571 struct ieee80211_channel *chan,
572 enum nl80211_channel_type channel_type, 572 enum nl80211_channel_type channel_type,
573 unsigned int duration, gfp_t gfp) 573 unsigned int duration, gfp_t gfp)
574{ 574{
575 struct wiphy *wiphy = dev->ieee80211_ptr->wiphy; 575 struct wiphy *wiphy = wdev->wiphy;
576 struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy); 576 struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
577 577
578 nl80211_send_remain_on_channel(rdev, dev, cookie, chan, channel_type, 578 nl80211_send_remain_on_channel(rdev, wdev, cookie, chan, channel_type,
579 duration, gfp); 579 duration, gfp);
580} 580}
581EXPORT_SYMBOL(cfg80211_ready_on_channel); 581EXPORT_SYMBOL(cfg80211_ready_on_channel);
582 582
583void cfg80211_remain_on_channel_expired(struct net_device *dev, 583void cfg80211_remain_on_channel_expired(struct wireless_dev *wdev, u64 cookie,
584 u64 cookie,
585 struct ieee80211_channel *chan, 584 struct ieee80211_channel *chan,
586 enum nl80211_channel_type channel_type, 585 enum nl80211_channel_type channel_type,
587 gfp_t gfp) 586 gfp_t gfp)
588{ 587{
589 struct wiphy *wiphy = dev->ieee80211_ptr->wiphy; 588 struct wiphy *wiphy = wdev->wiphy;
590 struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy); 589 struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
591 590
592 nl80211_send_remain_on_channel_cancel(rdev, dev, cookie, chan, 591 nl80211_send_remain_on_channel_cancel(rdev, wdev, cookie, chan,
593 channel_type, gfp); 592 channel_type, gfp);
594} 593}
595EXPORT_SYMBOL(cfg80211_remain_on_channel_expired); 594EXPORT_SYMBOL(cfg80211_remain_on_channel_expired);
@@ -678,8 +677,7 @@ int cfg80211_mlme_register_mgmt(struct wireless_dev *wdev, u32 snd_pid,
678 list_add(&nreg->list, &wdev->mgmt_registrations); 677 list_add(&nreg->list, &wdev->mgmt_registrations);
679 678
680 if (rdev->ops->mgmt_frame_register) 679 if (rdev->ops->mgmt_frame_register)
681 rdev->ops->mgmt_frame_register(wiphy, wdev->netdev, 680 rdev->ops->mgmt_frame_register(wiphy, wdev, frame_type, true);
682 frame_type, true);
683 681
684 out: 682 out:
685 spin_unlock_bh(&wdev->mgmt_registrations_lock); 683 spin_unlock_bh(&wdev->mgmt_registrations_lock);
@@ -702,7 +700,7 @@ void cfg80211_mlme_unregister_socket(struct wireless_dev *wdev, u32 nlpid)
702 if (rdev->ops->mgmt_frame_register) { 700 if (rdev->ops->mgmt_frame_register) {
703 u16 frame_type = le16_to_cpu(reg->frame_type); 701 u16 frame_type = le16_to_cpu(reg->frame_type);
704 702
705 rdev->ops->mgmt_frame_register(wiphy, wdev->netdev, 703 rdev->ops->mgmt_frame_register(wiphy, wdev,
706 frame_type, false); 704 frame_type, false);
707 } 705 }
708 706
@@ -731,14 +729,14 @@ void cfg80211_mlme_purge_registrations(struct wireless_dev *wdev)
731} 729}
732 730
733int cfg80211_mlme_mgmt_tx(struct cfg80211_registered_device *rdev, 731int cfg80211_mlme_mgmt_tx(struct cfg80211_registered_device *rdev,
734 struct net_device *dev, 732 struct wireless_dev *wdev,
735 struct ieee80211_channel *chan, bool offchan, 733 struct ieee80211_channel *chan, bool offchan,
736 enum nl80211_channel_type channel_type, 734 enum nl80211_channel_type channel_type,
737 bool channel_type_valid, unsigned int wait, 735 bool channel_type_valid, unsigned int wait,
738 const u8 *buf, size_t len, bool no_cck, 736 const u8 *buf, size_t len, bool no_cck,
739 bool dont_wait_for_ack, u64 *cookie) 737 bool dont_wait_for_ack, u64 *cookie)
740{ 738{
741 struct wireless_dev *wdev = dev->ieee80211_ptr; 739 struct net_device *dev = wdev->netdev;
742 const struct ieee80211_mgmt *mgmt; 740 const struct ieee80211_mgmt *mgmt;
743 u16 stype; 741 u16 stype;
744 742
@@ -825,16 +823,15 @@ int cfg80211_mlme_mgmt_tx(struct cfg80211_registered_device *rdev,
825 return -EINVAL; 823 return -EINVAL;
826 824
827 /* Transmit the Action frame as requested by user space */ 825 /* Transmit the Action frame as requested by user space */
828 return rdev->ops->mgmt_tx(&rdev->wiphy, dev, chan, offchan, 826 return rdev->ops->mgmt_tx(&rdev->wiphy, wdev, chan, offchan,
829 channel_type, channel_type_valid, 827 channel_type, channel_type_valid,
830 wait, buf, len, no_cck, dont_wait_for_ack, 828 wait, buf, len, no_cck, dont_wait_for_ack,
831 cookie); 829 cookie);
832} 830}
833 831
834bool cfg80211_rx_mgmt(struct net_device *dev, int freq, int sig_mbm, 832bool cfg80211_rx_mgmt(struct wireless_dev *wdev, int freq, int sig_mbm,
835 const u8 *buf, size_t len, gfp_t gfp) 833 const u8 *buf, size_t len, gfp_t gfp)
836{ 834{
837 struct wireless_dev *wdev = dev->ieee80211_ptr;
838 struct wiphy *wiphy = wdev->wiphy; 835 struct wiphy *wiphy = wdev->wiphy;
839 struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy); 836 struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
840 struct cfg80211_mgmt_registration *reg; 837 struct cfg80211_mgmt_registration *reg;
@@ -871,7 +868,7 @@ bool cfg80211_rx_mgmt(struct net_device *dev, int freq, int sig_mbm,
871 /* found match! */ 868 /* found match! */
872 869
873 /* Indicate the received Action frame to user space */ 870 /* Indicate the received Action frame to user space */
874 if (nl80211_send_mgmt(rdev, dev, reg->nlpid, 871 if (nl80211_send_mgmt(rdev, wdev, reg->nlpid,
875 freq, sig_mbm, 872 freq, sig_mbm,
876 buf, len, gfp)) 873 buf, len, gfp))
877 continue; 874 continue;
@@ -886,15 +883,14 @@ bool cfg80211_rx_mgmt(struct net_device *dev, int freq, int sig_mbm,
886} 883}
887EXPORT_SYMBOL(cfg80211_rx_mgmt); 884EXPORT_SYMBOL(cfg80211_rx_mgmt);
888 885
889void cfg80211_mgmt_tx_status(struct net_device *dev, u64 cookie, 886void cfg80211_mgmt_tx_status(struct wireless_dev *wdev, u64 cookie,
890 const u8 *buf, size_t len, bool ack, gfp_t gfp) 887 const u8 *buf, size_t len, bool ack, gfp_t gfp)
891{ 888{
892 struct wireless_dev *wdev = dev->ieee80211_ptr;
893 struct wiphy *wiphy = wdev->wiphy; 889 struct wiphy *wiphy = wdev->wiphy;
894 struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy); 890 struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
895 891
896 /* Indicate TX status of the Action frame to user space */ 892 /* Indicate TX status of the Action frame to user space */
897 nl80211_send_mgmt_tx_status(rdev, dev, cookie, buf, len, ack, gfp); 893 nl80211_send_mgmt_tx_status(rdev, wdev, cookie, buf, len, ack, gfp);
898} 894}
899EXPORT_SYMBOL(cfg80211_mgmt_tx_status); 895EXPORT_SYMBOL(cfg80211_mgmt_tx_status);
900 896
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
index 5800c49d6942..0dc3356eea40 100644
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
@@ -1728,6 +1728,11 @@ static int nl80211_set_wiphy(struct sk_buff *skb, struct genl_info *info)
1728 return result; 1728 return result;
1729} 1729}
1730 1730
1731static inline u64 wdev_id(struct wireless_dev *wdev)
1732{
1733 return (u64)wdev->identifier |
1734 ((u64)wiphy_to_dev(wdev->wiphy)->wiphy_idx << 32);
1735}
1731 1736
1732static int nl80211_send_iface(struct sk_buff *msg, u32 pid, u32 seq, int flags, 1737static int nl80211_send_iface(struct sk_buff *msg, u32 pid, u32 seq, int flags,
1733 struct cfg80211_registered_device *rdev, 1738 struct cfg80211_registered_device *rdev,
@@ -1735,8 +1740,6 @@ static int nl80211_send_iface(struct sk_buff *msg, u32 pid, u32 seq, int flags,
1735{ 1740{
1736 struct net_device *dev = wdev->netdev; 1741 struct net_device *dev = wdev->netdev;
1737 void *hdr; 1742 void *hdr;
1738 u64 wdev_id = (u64)wdev->identifier |
1739 ((u64)rdev->wiphy_idx << 32);
1740 1743
1741 hdr = nl80211hdr_put(msg, pid, seq, flags, NL80211_CMD_NEW_INTERFACE); 1744 hdr = nl80211hdr_put(msg, pid, seq, flags, NL80211_CMD_NEW_INTERFACE);
1742 if (!hdr) 1745 if (!hdr)
@@ -1750,7 +1753,7 @@ static int nl80211_send_iface(struct sk_buff *msg, u32 pid, u32 seq, int flags,
1750 1753
1751 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 1754 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
1752 nla_put_u32(msg, NL80211_ATTR_IFTYPE, wdev->iftype) || 1755 nla_put_u32(msg, NL80211_ATTR_IFTYPE, wdev->iftype) ||
1753 nla_put_u64(msg, NL80211_ATTR_WDEV, wdev_id) || 1756 nla_put_u64(msg, NL80211_ATTR_WDEV, wdev_id(wdev)) ||
1754 nla_put_u32(msg, NL80211_ATTR_GENERATION, 1757 nla_put_u32(msg, NL80211_ATTR_GENERATION,
1755 rdev->devlist_generation ^ 1758 rdev->devlist_generation ^
1756 (cfg80211_rdev_list_generation << 2))) 1759 (cfg80211_rdev_list_generation << 2)))
@@ -5752,7 +5755,7 @@ static int nl80211_remain_on_channel(struct sk_buff *skb,
5752 struct genl_info *info) 5755 struct genl_info *info)
5753{ 5756{
5754 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 5757 struct cfg80211_registered_device *rdev = info->user_ptr[0];
5755 struct net_device *dev = info->user_ptr[1]; 5758 struct wireless_dev *wdev = info->user_ptr[1];
5756 struct ieee80211_channel *chan; 5759 struct ieee80211_channel *chan;
5757 struct sk_buff *msg; 5760 struct sk_buff *msg;
5758 void *hdr; 5761 void *hdr;
@@ -5800,7 +5803,7 @@ static int nl80211_remain_on_channel(struct sk_buff *skb,
5800 goto free_msg; 5803 goto free_msg;
5801 } 5804 }
5802 5805
5803 err = rdev->ops->remain_on_channel(&rdev->wiphy, dev, chan, 5806 err = rdev->ops->remain_on_channel(&rdev->wiphy, wdev, chan,
5804 channel_type, duration, &cookie); 5807 channel_type, duration, &cookie);
5805 5808
5806 if (err) 5809 if (err)
@@ -5824,7 +5827,7 @@ static int nl80211_cancel_remain_on_channel(struct sk_buff *skb,
5824 struct genl_info *info) 5827 struct genl_info *info)
5825{ 5828{
5826 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 5829 struct cfg80211_registered_device *rdev = info->user_ptr[0];
5827 struct net_device *dev = info->user_ptr[1]; 5830 struct wireless_dev *wdev = info->user_ptr[1];
5828 u64 cookie; 5831 u64 cookie;
5829 5832
5830 if (!info->attrs[NL80211_ATTR_COOKIE]) 5833 if (!info->attrs[NL80211_ATTR_COOKIE])
@@ -5835,7 +5838,7 @@ static int nl80211_cancel_remain_on_channel(struct sk_buff *skb,
5835 5838
5836 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]); 5839 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]);
5837 5840
5838 return rdev->ops->cancel_remain_on_channel(&rdev->wiphy, dev, cookie); 5841 return rdev->ops->cancel_remain_on_channel(&rdev->wiphy, wdev, cookie);
5839} 5842}
5840 5843
5841static u32 rateset_to_mask(struct ieee80211_supported_band *sband, 5844static u32 rateset_to_mask(struct ieee80211_supported_band *sband,
@@ -5984,7 +5987,7 @@ static int nl80211_set_tx_bitrate_mask(struct sk_buff *skb,
5984static int nl80211_register_mgmt(struct sk_buff *skb, struct genl_info *info) 5987static int nl80211_register_mgmt(struct sk_buff *skb, struct genl_info *info)
5985{ 5988{
5986 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 5989 struct cfg80211_registered_device *rdev = info->user_ptr[0];
5987 struct net_device *dev = info->user_ptr[1]; 5990 struct wireless_dev *wdev = info->user_ptr[1];
5988 u16 frame_type = IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_ACTION; 5991 u16 frame_type = IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_ACTION;
5989 5992
5990 if (!info->attrs[NL80211_ATTR_FRAME_MATCH]) 5993 if (!info->attrs[NL80211_ATTR_FRAME_MATCH])
@@ -5993,21 +5996,24 @@ static int nl80211_register_mgmt(struct sk_buff *skb, struct genl_info *info)
5993 if (info->attrs[NL80211_ATTR_FRAME_TYPE]) 5996 if (info->attrs[NL80211_ATTR_FRAME_TYPE])
5994 frame_type = nla_get_u16(info->attrs[NL80211_ATTR_FRAME_TYPE]); 5997 frame_type = nla_get_u16(info->attrs[NL80211_ATTR_FRAME_TYPE]);
5995 5998
5996 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 5999 switch (wdev->iftype) {
5997 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC && 6000 case NL80211_IFTYPE_STATION:
5998 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT && 6001 case NL80211_IFTYPE_ADHOC:
5999 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && 6002 case NL80211_IFTYPE_P2P_CLIENT:
6000 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP_VLAN && 6003 case NL80211_IFTYPE_AP:
6001 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT && 6004 case NL80211_IFTYPE_AP_VLAN:
6002 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) 6005 case NL80211_IFTYPE_MESH_POINT:
6006 case NL80211_IFTYPE_P2P_GO:
6007 break;
6008 default:
6003 return -EOPNOTSUPP; 6009 return -EOPNOTSUPP;
6010 }
6004 6011
6005 /* not much point in registering if we can't reply */ 6012 /* not much point in registering if we can't reply */
6006 if (!rdev->ops->mgmt_tx) 6013 if (!rdev->ops->mgmt_tx)
6007 return -EOPNOTSUPP; 6014 return -EOPNOTSUPP;
6008 6015
6009 return cfg80211_mlme_register_mgmt(dev->ieee80211_ptr, info->snd_pid, 6016 return cfg80211_mlme_register_mgmt(wdev, info->snd_pid, frame_type,
6010 frame_type,
6011 nla_data(info->attrs[NL80211_ATTR_FRAME_MATCH]), 6017 nla_data(info->attrs[NL80211_ATTR_FRAME_MATCH]),
6012 nla_len(info->attrs[NL80211_ATTR_FRAME_MATCH])); 6018 nla_len(info->attrs[NL80211_ATTR_FRAME_MATCH]));
6013} 6019}
@@ -6015,7 +6021,7 @@ static int nl80211_register_mgmt(struct sk_buff *skb, struct genl_info *info)
6015static int nl80211_tx_mgmt(struct sk_buff *skb, struct genl_info *info) 6021static int nl80211_tx_mgmt(struct sk_buff *skb, struct genl_info *info)
6016{ 6022{
6017 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 6023 struct cfg80211_registered_device *rdev = info->user_ptr[0];
6018 struct net_device *dev = info->user_ptr[1]; 6024 struct wireless_dev *wdev = info->user_ptr[1];
6019 struct ieee80211_channel *chan; 6025 struct ieee80211_channel *chan;
6020 enum nl80211_channel_type channel_type = NL80211_CHAN_NO_HT; 6026 enum nl80211_channel_type channel_type = NL80211_CHAN_NO_HT;
6021 bool channel_type_valid = false; 6027 bool channel_type_valid = false;
@@ -6036,14 +6042,18 @@ static int nl80211_tx_mgmt(struct sk_buff *skb, struct genl_info *info)
6036 if (!rdev->ops->mgmt_tx) 6042 if (!rdev->ops->mgmt_tx)
6037 return -EOPNOTSUPP; 6043 return -EOPNOTSUPP;
6038 6044
6039 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 6045 switch (wdev->iftype) {
6040 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC && 6046 case NL80211_IFTYPE_STATION:
6041 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT && 6047 case NL80211_IFTYPE_ADHOC:
6042 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && 6048 case NL80211_IFTYPE_P2P_CLIENT:
6043 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP_VLAN && 6049 case NL80211_IFTYPE_AP:
6044 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT && 6050 case NL80211_IFTYPE_AP_VLAN:
6045 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) 6051 case NL80211_IFTYPE_MESH_POINT:
6052 case NL80211_IFTYPE_P2P_GO:
6053 break;
6054 default:
6046 return -EOPNOTSUPP; 6055 return -EOPNOTSUPP;
6056 }
6047 6057
6048 if (info->attrs[NL80211_ATTR_DURATION]) { 6058 if (info->attrs[NL80211_ATTR_DURATION]) {
6049 if (!(rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX)) 6059 if (!(rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX))
@@ -6092,7 +6102,7 @@ static int nl80211_tx_mgmt(struct sk_buff *skb, struct genl_info *info)
6092 } 6102 }
6093 } 6103 }
6094 6104
6095 err = cfg80211_mlme_mgmt_tx(rdev, dev, chan, offchan, channel_type, 6105 err = cfg80211_mlme_mgmt_tx(rdev, wdev, chan, offchan, channel_type,
6096 channel_type_valid, wait, 6106 channel_type_valid, wait,
6097 nla_data(info->attrs[NL80211_ATTR_FRAME]), 6107 nla_data(info->attrs[NL80211_ATTR_FRAME]),
6098 nla_len(info->attrs[NL80211_ATTR_FRAME]), 6108 nla_len(info->attrs[NL80211_ATTR_FRAME]),
@@ -6120,7 +6130,7 @@ static int nl80211_tx_mgmt(struct sk_buff *skb, struct genl_info *info)
6120static int nl80211_tx_mgmt_cancel_wait(struct sk_buff *skb, struct genl_info *info) 6130static int nl80211_tx_mgmt_cancel_wait(struct sk_buff *skb, struct genl_info *info)
6121{ 6131{
6122 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 6132 struct cfg80211_registered_device *rdev = info->user_ptr[0];
6123 struct net_device *dev = info->user_ptr[1]; 6133 struct wireless_dev *wdev = info->user_ptr[1];
6124 u64 cookie; 6134 u64 cookie;
6125 6135
6126 if (!info->attrs[NL80211_ATTR_COOKIE]) 6136 if (!info->attrs[NL80211_ATTR_COOKIE])
@@ -6129,17 +6139,21 @@ static int nl80211_tx_mgmt_cancel_wait(struct sk_buff *skb, struct genl_info *in
6129 if (!rdev->ops->mgmt_tx_cancel_wait) 6139 if (!rdev->ops->mgmt_tx_cancel_wait)
6130 return -EOPNOTSUPP; 6140 return -EOPNOTSUPP;
6131 6141
6132 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 6142 switch (wdev->iftype) {
6133 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC && 6143 case NL80211_IFTYPE_STATION:
6134 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT && 6144 case NL80211_IFTYPE_ADHOC:
6135 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && 6145 case NL80211_IFTYPE_P2P_CLIENT:
6136 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP_VLAN && 6146 case NL80211_IFTYPE_AP:
6137 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) 6147 case NL80211_IFTYPE_AP_VLAN:
6148 case NL80211_IFTYPE_P2P_GO:
6149 break;
6150 default:
6138 return -EOPNOTSUPP; 6151 return -EOPNOTSUPP;
6152 }
6139 6153
6140 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]); 6154 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]);
6141 6155
6142 return rdev->ops->mgmt_tx_cancel_wait(&rdev->wiphy, dev, cookie); 6156 return rdev->ops->mgmt_tx_cancel_wait(&rdev->wiphy, wdev, cookie);
6143} 6157}
6144 6158
6145static int nl80211_set_power_save(struct sk_buff *skb, struct genl_info *info) 6159static int nl80211_set_power_save(struct sk_buff *skb, struct genl_info *info)
@@ -7172,7 +7186,7 @@ static struct genl_ops nl80211_ops[] = {
7172 .doit = nl80211_remain_on_channel, 7186 .doit = nl80211_remain_on_channel,
7173 .policy = nl80211_policy, 7187 .policy = nl80211_policy,
7174 .flags = GENL_ADMIN_PERM, 7188 .flags = GENL_ADMIN_PERM,
7175 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 7189 .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
7176 NL80211_FLAG_NEED_RTNL, 7190 NL80211_FLAG_NEED_RTNL,
7177 }, 7191 },
7178 { 7192 {
@@ -7180,7 +7194,7 @@ static struct genl_ops nl80211_ops[] = {
7180 .doit = nl80211_cancel_remain_on_channel, 7194 .doit = nl80211_cancel_remain_on_channel,
7181 .policy = nl80211_policy, 7195 .policy = nl80211_policy,
7182 .flags = GENL_ADMIN_PERM, 7196 .flags = GENL_ADMIN_PERM,
7183 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 7197 .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
7184 NL80211_FLAG_NEED_RTNL, 7198 NL80211_FLAG_NEED_RTNL,
7185 }, 7199 },
7186 { 7200 {
@@ -7196,7 +7210,7 @@ static struct genl_ops nl80211_ops[] = {
7196 .doit = nl80211_register_mgmt, 7210 .doit = nl80211_register_mgmt,
7197 .policy = nl80211_policy, 7211 .policy = nl80211_policy,
7198 .flags = GENL_ADMIN_PERM, 7212 .flags = GENL_ADMIN_PERM,
7199 .internal_flags = NL80211_FLAG_NEED_NETDEV | 7213 .internal_flags = NL80211_FLAG_NEED_WDEV |
7200 NL80211_FLAG_NEED_RTNL, 7214 NL80211_FLAG_NEED_RTNL,
7201 }, 7215 },
7202 { 7216 {
@@ -7204,7 +7218,7 @@ static struct genl_ops nl80211_ops[] = {
7204 .doit = nl80211_tx_mgmt, 7218 .doit = nl80211_tx_mgmt,
7205 .policy = nl80211_policy, 7219 .policy = nl80211_policy,
7206 .flags = GENL_ADMIN_PERM, 7220 .flags = GENL_ADMIN_PERM,
7207 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 7221 .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
7208 NL80211_FLAG_NEED_RTNL, 7222 NL80211_FLAG_NEED_RTNL,
7209 }, 7223 },
7210 { 7224 {
@@ -7212,7 +7226,7 @@ static struct genl_ops nl80211_ops[] = {
7212 .doit = nl80211_tx_mgmt_cancel_wait, 7226 .doit = nl80211_tx_mgmt_cancel_wait,
7213 .policy = nl80211_policy, 7227 .policy = nl80211_policy,
7214 .flags = GENL_ADMIN_PERM, 7228 .flags = GENL_ADMIN_PERM,
7215 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 7229 .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
7216 NL80211_FLAG_NEED_RTNL, 7230 NL80211_FLAG_NEED_RTNL,
7217 }, 7231 },
7218 { 7232 {
@@ -8040,7 +8054,7 @@ nla_put_failure:
8040 8054
8041static void nl80211_send_remain_on_chan_event( 8055static void nl80211_send_remain_on_chan_event(
8042 int cmd, struct cfg80211_registered_device *rdev, 8056 int cmd, struct cfg80211_registered_device *rdev,
8043 struct net_device *netdev, u64 cookie, 8057 struct wireless_dev *wdev, u64 cookie,
8044 struct ieee80211_channel *chan, 8058 struct ieee80211_channel *chan,
8045 enum nl80211_channel_type channel_type, 8059 enum nl80211_channel_type channel_type,
8046 unsigned int duration, gfp_t gfp) 8060 unsigned int duration, gfp_t gfp)
@@ -8059,7 +8073,9 @@ static void nl80211_send_remain_on_chan_event(
8059 } 8073 }
8060 8074
8061 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 8075 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
8062 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 8076 (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX,
8077 wdev->netdev->ifindex)) ||
8078 nla_put_u32(msg, NL80211_ATTR_WDEV, wdev_id(wdev)) ||
8063 nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, chan->center_freq) || 8079 nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, chan->center_freq) ||
8064 nla_put_u32(msg, NL80211_ATTR_WIPHY_CHANNEL_TYPE, channel_type) || 8080 nla_put_u32(msg, NL80211_ATTR_WIPHY_CHANNEL_TYPE, channel_type) ||
8065 nla_put_u64(msg, NL80211_ATTR_COOKIE, cookie)) 8081 nla_put_u64(msg, NL80211_ATTR_COOKIE, cookie))
@@ -8081,23 +8097,24 @@ static void nl80211_send_remain_on_chan_event(
8081} 8097}
8082 8098
8083void nl80211_send_remain_on_channel(struct cfg80211_registered_device *rdev, 8099void nl80211_send_remain_on_channel(struct cfg80211_registered_device *rdev,
8084 struct net_device *netdev, u64 cookie, 8100 struct wireless_dev *wdev, u64 cookie,
8085 struct ieee80211_channel *chan, 8101 struct ieee80211_channel *chan,
8086 enum nl80211_channel_type channel_type, 8102 enum nl80211_channel_type channel_type,
8087 unsigned int duration, gfp_t gfp) 8103 unsigned int duration, gfp_t gfp)
8088{ 8104{
8089 nl80211_send_remain_on_chan_event(NL80211_CMD_REMAIN_ON_CHANNEL, 8105 nl80211_send_remain_on_chan_event(NL80211_CMD_REMAIN_ON_CHANNEL,
8090 rdev, netdev, cookie, chan, 8106 rdev, wdev, cookie, chan,
8091 channel_type, duration, gfp); 8107 channel_type, duration, gfp);
8092} 8108}
8093 8109
8094void nl80211_send_remain_on_channel_cancel( 8110void nl80211_send_remain_on_channel_cancel(
8095 struct cfg80211_registered_device *rdev, struct net_device *netdev, 8111 struct cfg80211_registered_device *rdev,
8112 struct wireless_dev *wdev,
8096 u64 cookie, struct ieee80211_channel *chan, 8113 u64 cookie, struct ieee80211_channel *chan,
8097 enum nl80211_channel_type channel_type, gfp_t gfp) 8114 enum nl80211_channel_type channel_type, gfp_t gfp)
8098{ 8115{
8099 nl80211_send_remain_on_chan_event(NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL, 8116 nl80211_send_remain_on_chan_event(NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL,
8100 rdev, netdev, cookie, chan, 8117 rdev, wdev, cookie, chan,
8101 channel_type, 0, gfp); 8118 channel_type, 0, gfp);
8102} 8119}
8103 8120
@@ -8211,10 +8228,11 @@ bool nl80211_unexpected_4addr_frame(struct net_device *dev,
8211} 8228}
8212 8229
8213int nl80211_send_mgmt(struct cfg80211_registered_device *rdev, 8230int nl80211_send_mgmt(struct cfg80211_registered_device *rdev,
8214 struct net_device *netdev, u32 nlpid, 8231 struct wireless_dev *wdev, u32 nlpid,
8215 int freq, int sig_dbm, 8232 int freq, int sig_dbm,
8216 const u8 *buf, size_t len, gfp_t gfp) 8233 const u8 *buf, size_t len, gfp_t gfp)
8217{ 8234{
8235 struct net_device *netdev = wdev->netdev;
8218 struct sk_buff *msg; 8236 struct sk_buff *msg;
8219 void *hdr; 8237 void *hdr;
8220 8238
@@ -8229,7 +8247,8 @@ int nl80211_send_mgmt(struct cfg80211_registered_device *rdev,
8229 } 8247 }
8230 8248
8231 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 8249 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
8232 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 8250 (netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX,
8251 netdev->ifindex)) ||
8233 nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, freq) || 8252 nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, freq) ||
8234 (sig_dbm && 8253 (sig_dbm &&
8235 nla_put_u32(msg, NL80211_ATTR_RX_SIGNAL_DBM, sig_dbm)) || 8254 nla_put_u32(msg, NL80211_ATTR_RX_SIGNAL_DBM, sig_dbm)) ||
@@ -8247,10 +8266,11 @@ int nl80211_send_mgmt(struct cfg80211_registered_device *rdev,
8247} 8266}
8248 8267
8249void nl80211_send_mgmt_tx_status(struct cfg80211_registered_device *rdev, 8268void nl80211_send_mgmt_tx_status(struct cfg80211_registered_device *rdev,
8250 struct net_device *netdev, u64 cookie, 8269 struct wireless_dev *wdev, u64 cookie,
8251 const u8 *buf, size_t len, bool ack, 8270 const u8 *buf, size_t len, bool ack,
8252 gfp_t gfp) 8271 gfp_t gfp)
8253{ 8272{
8273 struct net_device *netdev = wdev->netdev;
8254 struct sk_buff *msg; 8274 struct sk_buff *msg;
8255 void *hdr; 8275 void *hdr;
8256 8276
@@ -8265,7 +8285,8 @@ void nl80211_send_mgmt_tx_status(struct cfg80211_registered_device *rdev,
8265 } 8285 }
8266 8286
8267 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 8287 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
8268 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 8288 (netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX,
8289 netdev->ifindex)) ||
8269 nla_put(msg, NL80211_ATTR_FRAME, len, buf) || 8290 nla_put(msg, NL80211_ATTR_FRAME, len, buf) ||
8270 nla_put_u64(msg, NL80211_ATTR_COOKIE, cookie) || 8291 nla_put_u64(msg, NL80211_ATTR_COOKIE, cookie) ||
8271 (ack && nla_put_flag(msg, NL80211_ATTR_ACK))) 8292 (ack && nla_put_flag(msg, NL80211_ATTR_ACK)))
diff --git a/net/wireless/nl80211.h b/net/wireless/nl80211.h
index 01a1122c3b33..0469303b5c3c 100644
--- a/net/wireless/nl80211.h
+++ b/net/wireless/nl80211.h
@@ -74,13 +74,13 @@ void nl80211_send_ibss_bssid(struct cfg80211_registered_device *rdev,
74 gfp_t gfp); 74 gfp_t gfp);
75 75
76void nl80211_send_remain_on_channel(struct cfg80211_registered_device *rdev, 76void nl80211_send_remain_on_channel(struct cfg80211_registered_device *rdev,
77 struct net_device *netdev, 77 struct wireless_dev *wdev, u64 cookie,
78 u64 cookie,
79 struct ieee80211_channel *chan, 78 struct ieee80211_channel *chan,
80 enum nl80211_channel_type channel_type, 79 enum nl80211_channel_type channel_type,
81 unsigned int duration, gfp_t gfp); 80 unsigned int duration, gfp_t gfp);
82void nl80211_send_remain_on_channel_cancel( 81void nl80211_send_remain_on_channel_cancel(
83 struct cfg80211_registered_device *rdev, struct net_device *netdev, 82 struct cfg80211_registered_device *rdev,
83 struct wireless_dev *wdev,
84 u64 cookie, struct ieee80211_channel *chan, 84 u64 cookie, struct ieee80211_channel *chan,
85 enum nl80211_channel_type channel_type, gfp_t gfp); 85 enum nl80211_channel_type channel_type, gfp_t gfp);
86 86
@@ -92,11 +92,11 @@ void nl80211_send_sta_del_event(struct cfg80211_registered_device *rdev,
92 gfp_t gfp); 92 gfp_t gfp);
93 93
94int nl80211_send_mgmt(struct cfg80211_registered_device *rdev, 94int nl80211_send_mgmt(struct cfg80211_registered_device *rdev,
95 struct net_device *netdev, u32 nlpid, 95 struct wireless_dev *wdev, u32 nlpid,
96 int freq, int sig_dbm, 96 int freq, int sig_dbm,
97 const u8 *buf, size_t len, gfp_t gfp); 97 const u8 *buf, size_t len, gfp_t gfp);
98void nl80211_send_mgmt_tx_status(struct cfg80211_registered_device *rdev, 98void nl80211_send_mgmt_tx_status(struct cfg80211_registered_device *rdev,
99 struct net_device *netdev, u64 cookie, 99 struct wireless_dev *wdev, u64 cookie,
100 const u8 *buf, size_t len, bool ack, 100 const u8 *buf, size_t len, bool ack,
101 gfp_t gfp); 101 gfp_t gfp);
102 102