aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--net/wireless/ap.c62
-rw-r--r--net/wireless/mesh.c14
-rw-r--r--net/wireless/mlme.c159
-rw-r--r--net/wireless/nl80211.c266
-rw-r--r--net/wireless/nl80211.h68
5 files changed, 195 insertions, 374 deletions
diff --git a/net/wireless/ap.c b/net/wireless/ap.c
index a4a14e8f55cc..324e8d851dc4 100644
--- a/net/wireless/ap.c
+++ b/net/wireless/ap.c
@@ -46,65 +46,3 @@ int cfg80211_stop_ap(struct cfg80211_registered_device *rdev,
46 46
47 return err; 47 return err;
48} 48}
49
50void cfg80211_ch_switch_notify(struct net_device *dev,
51 struct cfg80211_chan_def *chandef)
52{
53 struct wireless_dev *wdev = dev->ieee80211_ptr;
54 struct wiphy *wiphy = wdev->wiphy;
55 struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
56
57 trace_cfg80211_ch_switch_notify(dev, chandef);
58
59 wdev_lock(wdev);
60
61 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_AP &&
62 wdev->iftype != NL80211_IFTYPE_P2P_GO))
63 goto out;
64
65 wdev->channel = chandef->chan;
66 nl80211_ch_switch_notify(rdev, dev, chandef, GFP_KERNEL);
67out:
68 wdev_unlock(wdev);
69 return;
70}
71EXPORT_SYMBOL(cfg80211_ch_switch_notify);
72
73bool cfg80211_rx_spurious_frame(struct net_device *dev,
74 const u8 *addr, gfp_t gfp)
75{
76 struct wireless_dev *wdev = dev->ieee80211_ptr;
77 bool ret;
78
79 trace_cfg80211_rx_spurious_frame(dev, addr);
80
81 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_AP &&
82 wdev->iftype != NL80211_IFTYPE_P2P_GO)) {
83 trace_cfg80211_return_bool(false);
84 return false;
85 }
86 ret = nl80211_unexpected_frame(dev, addr, gfp);
87 trace_cfg80211_return_bool(ret);
88 return ret;
89}
90EXPORT_SYMBOL(cfg80211_rx_spurious_frame);
91
92bool cfg80211_rx_unexpected_4addr_frame(struct net_device *dev,
93 const u8 *addr, gfp_t gfp)
94{
95 struct wireless_dev *wdev = dev->ieee80211_ptr;
96 bool ret;
97
98 trace_cfg80211_rx_unexpected_4addr_frame(dev, addr);
99
100 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_AP &&
101 wdev->iftype != NL80211_IFTYPE_P2P_GO &&
102 wdev->iftype != NL80211_IFTYPE_AP_VLAN)) {
103 trace_cfg80211_return_bool(false);
104 return false;
105 }
106 ret = nl80211_unexpected_4addr_frame(dev, addr, gfp);
107 trace_cfg80211_return_bool(ret);
108 return ret;
109}
110EXPORT_SYMBOL(cfg80211_rx_unexpected_4addr_frame);
diff --git a/net/wireless/mesh.c b/net/wireless/mesh.c
index 55957a284f6c..9688b249a805 100644
--- a/net/wireless/mesh.c
+++ b/net/wireless/mesh.c
@@ -233,20 +233,6 @@ int cfg80211_set_mesh_channel(struct cfg80211_registered_device *rdev,
233 return 0; 233 return 0;
234} 234}
235 235
236void cfg80211_notify_new_peer_candidate(struct net_device *dev,
237 const u8 *macaddr, const u8* ie, u8 ie_len, gfp_t gfp)
238{
239 struct wireless_dev *wdev = dev->ieee80211_ptr;
240
241 trace_cfg80211_notify_new_peer_candidate(dev, macaddr);
242 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_MESH_POINT))
243 return;
244
245 nl80211_send_new_peer_candidate(wiphy_to_dev(wdev->wiphy), dev,
246 macaddr, ie, ie_len, gfp);
247}
248EXPORT_SYMBOL(cfg80211_notify_new_peer_candidate);
249
250static int __cfg80211_leave_mesh(struct cfg80211_registered_device *rdev, 236static int __cfg80211_leave_mesh(struct cfg80211_registered_device *rdev,
251 struct net_device *dev) 237 struct net_device *dev)
252{ 238{
diff --git a/net/wireless/mlme.c b/net/wireless/mlme.c
index caddca35d686..5a97ce6d283b 100644
--- a/net/wireless/mlme.c
+++ b/net/wireless/mlme.c
@@ -187,30 +187,6 @@ void cfg80211_send_disassoc(struct net_device *dev, const u8 *buf, size_t len)
187} 187}
188EXPORT_SYMBOL(cfg80211_send_disassoc); 188EXPORT_SYMBOL(cfg80211_send_disassoc);
189 189
190void cfg80211_send_unprot_deauth(struct net_device *dev, const u8 *buf,
191 size_t len)
192{
193 struct wireless_dev *wdev = dev->ieee80211_ptr;
194 struct wiphy *wiphy = wdev->wiphy;
195 struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
196
197 trace_cfg80211_send_unprot_deauth(dev);
198 nl80211_send_unprot_deauth(rdev, dev, buf, len, GFP_ATOMIC);
199}
200EXPORT_SYMBOL(cfg80211_send_unprot_deauth);
201
202void cfg80211_send_unprot_disassoc(struct net_device *dev, const u8 *buf,
203 size_t len)
204{
205 struct wireless_dev *wdev = dev->ieee80211_ptr;
206 struct wiphy *wiphy = wdev->wiphy;
207 struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
208
209 trace_cfg80211_send_unprot_disassoc(dev);
210 nl80211_send_unprot_disassoc(rdev, dev, buf, len, GFP_ATOMIC);
211}
212EXPORT_SYMBOL(cfg80211_send_unprot_disassoc);
213
214void cfg80211_send_auth_timeout(struct net_device *dev, const u8 *addr) 190void cfg80211_send_auth_timeout(struct net_device *dev, const u8 *addr)
215{ 191{
216 struct wireless_dev *wdev = dev->ieee80211_ptr; 192 struct wireless_dev *wdev = dev->ieee80211_ptr;
@@ -577,62 +553,6 @@ void cfg80211_mlme_down(struct cfg80211_registered_device *rdev,
577 } 553 }
578} 554}
579 555
580void cfg80211_ready_on_channel(struct wireless_dev *wdev, u64 cookie,
581 struct ieee80211_channel *chan,
582 unsigned int duration, gfp_t gfp)
583{
584 struct wiphy *wiphy = wdev->wiphy;
585 struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
586
587 trace_cfg80211_ready_on_channel(wdev, cookie, chan, duration);
588 nl80211_send_remain_on_channel(rdev, wdev, cookie, chan, duration, gfp);
589}
590EXPORT_SYMBOL(cfg80211_ready_on_channel);
591
592void cfg80211_remain_on_channel_expired(struct wireless_dev *wdev, u64 cookie,
593 struct ieee80211_channel *chan,
594 gfp_t gfp)
595{
596 struct wiphy *wiphy = wdev->wiphy;
597 struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
598
599 trace_cfg80211_ready_on_channel_expired(wdev, cookie, chan);
600 nl80211_send_remain_on_channel_cancel(rdev, wdev, cookie, chan, gfp);
601}
602EXPORT_SYMBOL(cfg80211_remain_on_channel_expired);
603
604void cfg80211_new_sta(struct net_device *dev, const u8 *mac_addr,
605 struct station_info *sinfo, gfp_t gfp)
606{
607 struct wiphy *wiphy = dev->ieee80211_ptr->wiphy;
608 struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
609
610 trace_cfg80211_new_sta(dev, mac_addr, sinfo);
611 nl80211_send_sta_event(rdev, dev, mac_addr, sinfo, gfp);
612}
613EXPORT_SYMBOL(cfg80211_new_sta);
614
615void cfg80211_del_sta(struct net_device *dev, const u8 *mac_addr, gfp_t gfp)
616{
617 struct wiphy *wiphy = dev->ieee80211_ptr->wiphy;
618 struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
619
620 trace_cfg80211_del_sta(dev, mac_addr);
621 nl80211_send_sta_del_event(rdev, dev, mac_addr, gfp);
622}
623EXPORT_SYMBOL(cfg80211_del_sta);
624
625void cfg80211_conn_failed(struct net_device *dev, const u8 *mac_addr,
626 enum nl80211_connect_failed_reason reason,
627 gfp_t gfp)
628{
629 struct wiphy *wiphy = dev->ieee80211_ptr->wiphy;
630 struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
631
632 nl80211_send_conn_failed_event(rdev, dev, mac_addr, reason, gfp);
633}
634EXPORT_SYMBOL(cfg80211_conn_failed);
635
636struct cfg80211_mgmt_registration { 556struct cfg80211_mgmt_registration {
637 struct list_head list; 557 struct list_head list;
638 558
@@ -909,85 +829,6 @@ bool cfg80211_rx_mgmt(struct wireless_dev *wdev, int freq, int sig_mbm,
909} 829}
910EXPORT_SYMBOL(cfg80211_rx_mgmt); 830EXPORT_SYMBOL(cfg80211_rx_mgmt);
911 831
912void cfg80211_mgmt_tx_status(struct wireless_dev *wdev, u64 cookie,
913 const u8 *buf, size_t len, bool ack, gfp_t gfp)
914{
915 struct wiphy *wiphy = wdev->wiphy;
916 struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
917
918 trace_cfg80211_mgmt_tx_status(wdev, cookie, ack);
919
920 /* Indicate TX status of the Action frame to user space */
921 nl80211_send_mgmt_tx_status(rdev, wdev, cookie, buf, len, ack, gfp);
922}
923EXPORT_SYMBOL(cfg80211_mgmt_tx_status);
924
925void cfg80211_cqm_rssi_notify(struct net_device *dev,
926 enum nl80211_cqm_rssi_threshold_event rssi_event,
927 gfp_t gfp)
928{
929 struct wireless_dev *wdev = dev->ieee80211_ptr;
930 struct wiphy *wiphy = wdev->wiphy;
931 struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
932
933 trace_cfg80211_cqm_rssi_notify(dev, rssi_event);
934
935 /* Indicate roaming trigger event to user space */
936 nl80211_send_cqm_rssi_notify(rdev, dev, rssi_event, gfp);
937}
938EXPORT_SYMBOL(cfg80211_cqm_rssi_notify);
939
940void cfg80211_cqm_pktloss_notify(struct net_device *dev,
941 const u8 *peer, u32 num_packets, gfp_t gfp)
942{
943 struct wireless_dev *wdev = dev->ieee80211_ptr;
944 struct wiphy *wiphy = wdev->wiphy;
945 struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
946
947 trace_cfg80211_cqm_pktloss_notify(dev, peer, num_packets);
948
949 /* Indicate roaming trigger event to user space */
950 nl80211_send_cqm_pktloss_notify(rdev, dev, peer, num_packets, gfp);
951}
952EXPORT_SYMBOL(cfg80211_cqm_pktloss_notify);
953
954void cfg80211_cqm_txe_notify(struct net_device *dev,
955 const u8 *peer, u32 num_packets,
956 u32 rate, u32 intvl, gfp_t gfp)
957{
958 struct wireless_dev *wdev = dev->ieee80211_ptr;
959 struct wiphy *wiphy = wdev->wiphy;
960 struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
961
962 nl80211_send_cqm_txe_notify(rdev, dev, peer, num_packets,
963 rate, intvl, gfp);
964}
965EXPORT_SYMBOL(cfg80211_cqm_txe_notify);
966
967void cfg80211_gtk_rekey_notify(struct net_device *dev, const u8 *bssid,
968 const u8 *replay_ctr, gfp_t gfp)
969{
970 struct wireless_dev *wdev = dev->ieee80211_ptr;
971 struct wiphy *wiphy = wdev->wiphy;
972 struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
973
974 trace_cfg80211_gtk_rekey_notify(dev, bssid);
975 nl80211_gtk_rekey_notify(rdev, dev, bssid, replay_ctr, gfp);
976}
977EXPORT_SYMBOL(cfg80211_gtk_rekey_notify);
978
979void cfg80211_pmksa_candidate_notify(struct net_device *dev, int index,
980 const u8 *bssid, bool preauth, gfp_t gfp)
981{
982 struct wireless_dev *wdev = dev->ieee80211_ptr;
983 struct wiphy *wiphy = wdev->wiphy;
984 struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
985
986 trace_cfg80211_pmksa_candidate_notify(dev, index, bssid, preauth);
987 nl80211_pmksa_candidate_notify(rdev, dev, index, bssid, preauth, gfp);
988}
989EXPORT_SYMBOL(cfg80211_pmksa_candidate_notify);
990
991void cfg80211_dfs_channels_update_work(struct work_struct *work) 832void cfg80211_dfs_channels_update_work(struct work_struct *work)
992{ 833{
993 struct delayed_work *delayed_work; 834 struct delayed_work *delayed_work;
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
index 3a45ea614cbb..0e5176784b42 100644
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
@@ -9151,21 +9151,31 @@ void nl80211_send_disassoc(struct cfg80211_registered_device *rdev,
9151 NL80211_CMD_DISASSOCIATE, gfp); 9151 NL80211_CMD_DISASSOCIATE, gfp);
9152} 9152}
9153 9153
9154void nl80211_send_unprot_deauth(struct cfg80211_registered_device *rdev, 9154void cfg80211_send_unprot_deauth(struct net_device *dev, const u8 *buf,
9155 struct net_device *netdev, const u8 *buf, 9155 size_t len)
9156 size_t len, gfp_t gfp)
9157{ 9156{
9158 nl80211_send_mlme_event(rdev, netdev, buf, len, 9157 struct wireless_dev *wdev = dev->ieee80211_ptr;
9159 NL80211_CMD_UNPROT_DEAUTHENTICATE, gfp); 9158 struct wiphy *wiphy = wdev->wiphy;
9159 struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
9160
9161 trace_cfg80211_send_unprot_deauth(dev);
9162 nl80211_send_mlme_event(rdev, dev, buf, len,
9163 NL80211_CMD_UNPROT_DEAUTHENTICATE, GFP_ATOMIC);
9160} 9164}
9165EXPORT_SYMBOL(cfg80211_send_unprot_deauth);
9161 9166
9162void nl80211_send_unprot_disassoc(struct cfg80211_registered_device *rdev, 9167void cfg80211_send_unprot_disassoc(struct net_device *dev, const u8 *buf,
9163 struct net_device *netdev, const u8 *buf, 9168 size_t len)
9164 size_t len, gfp_t gfp)
9165{ 9169{
9166 nl80211_send_mlme_event(rdev, netdev, buf, len, 9170 struct wireless_dev *wdev = dev->ieee80211_ptr;
9167 NL80211_CMD_UNPROT_DISASSOCIATE, gfp); 9171 struct wiphy *wiphy = wdev->wiphy;
9172 struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
9173
9174 trace_cfg80211_send_unprot_disassoc(dev);
9175 nl80211_send_mlme_event(rdev, dev, buf, len,
9176 NL80211_CMD_UNPROT_DISASSOCIATE, GFP_ATOMIC);
9168} 9177}
9178EXPORT_SYMBOL(cfg80211_send_unprot_disassoc);
9169 9179
9170static void nl80211_send_mlme_timeout(struct cfg80211_registered_device *rdev, 9180static void nl80211_send_mlme_timeout(struct cfg80211_registered_device *rdev,
9171 struct net_device *netdev, int cmd, 9181 struct net_device *netdev, int cmd,
@@ -9368,14 +9378,19 @@ void nl80211_send_ibss_bssid(struct cfg80211_registered_device *rdev,
9368 nlmsg_free(msg); 9378 nlmsg_free(msg);
9369} 9379}
9370 9380
9371void nl80211_send_new_peer_candidate(struct cfg80211_registered_device *rdev, 9381void cfg80211_notify_new_peer_candidate(struct net_device *dev, const u8 *addr,
9372 struct net_device *netdev, 9382 const u8* ie, u8 ie_len, gfp_t gfp)
9373 const u8 *macaddr, const u8* ie, u8 ie_len,
9374 gfp_t gfp)
9375{ 9383{
9384 struct wireless_dev *wdev = dev->ieee80211_ptr;
9385 struct cfg80211_registered_device *rdev = wiphy_to_dev(wdev->wiphy);
9376 struct sk_buff *msg; 9386 struct sk_buff *msg;
9377 void *hdr; 9387 void *hdr;
9378 9388
9389 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_MESH_POINT))
9390 return;
9391
9392 trace_cfg80211_notify_new_peer_candidate(dev, addr);
9393
9379 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 9394 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
9380 if (!msg) 9395 if (!msg)
9381 return; 9396 return;
@@ -9387,8 +9402,8 @@ void nl80211_send_new_peer_candidate(struct cfg80211_registered_device *rdev,
9387 } 9402 }
9388 9403
9389 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 9404 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
9390 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 9405 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
9391 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, macaddr) || 9406 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr) ||
9392 (ie_len && ie && 9407 (ie_len && ie &&
9393 nla_put(msg, NL80211_ATTR_IE, ie_len , ie))) 9408 nla_put(msg, NL80211_ATTR_IE, ie_len , ie)))
9394 goto nla_put_failure; 9409 goto nla_put_failure;
@@ -9403,6 +9418,7 @@ void nl80211_send_new_peer_candidate(struct cfg80211_registered_device *rdev,
9403 genlmsg_cancel(msg, hdr); 9418 genlmsg_cancel(msg, hdr);
9404 nlmsg_free(msg); 9419 nlmsg_free(msg);
9405} 9420}
9421EXPORT_SYMBOL(cfg80211_notify_new_peer_candidate);
9406 9422
9407void nl80211_michael_mic_failure(struct cfg80211_registered_device *rdev, 9423void nl80211_michael_mic_failure(struct cfg80211_registered_device *rdev,
9408 struct net_device *netdev, const u8 *addr, 9424 struct net_device *netdev, const u8 *addr,
@@ -9541,31 +9557,42 @@ static void nl80211_send_remain_on_chan_event(
9541 nlmsg_free(msg); 9557 nlmsg_free(msg);
9542} 9558}
9543 9559
9544void nl80211_send_remain_on_channel(struct cfg80211_registered_device *rdev, 9560void cfg80211_ready_on_channel(struct wireless_dev *wdev, u64 cookie,
9545 struct wireless_dev *wdev, u64 cookie, 9561 struct ieee80211_channel *chan,
9546 struct ieee80211_channel *chan, 9562 unsigned int duration, gfp_t gfp)
9547 unsigned int duration, gfp_t gfp)
9548{ 9563{
9564 struct wiphy *wiphy = wdev->wiphy;
9565 struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
9566
9567 trace_cfg80211_ready_on_channel(wdev, cookie, chan, duration);
9549 nl80211_send_remain_on_chan_event(NL80211_CMD_REMAIN_ON_CHANNEL, 9568 nl80211_send_remain_on_chan_event(NL80211_CMD_REMAIN_ON_CHANNEL,
9550 rdev, wdev, cookie, chan, 9569 rdev, wdev, cookie, chan,
9551 duration, gfp); 9570 duration, gfp);
9552} 9571}
9572EXPORT_SYMBOL(cfg80211_ready_on_channel);
9553 9573
9554void nl80211_send_remain_on_channel_cancel( 9574void cfg80211_remain_on_channel_expired(struct wireless_dev *wdev, u64 cookie,
9555 struct cfg80211_registered_device *rdev, 9575 struct ieee80211_channel *chan,
9556 struct wireless_dev *wdev, 9576 gfp_t gfp)
9557 u64 cookie, struct ieee80211_channel *chan, gfp_t gfp)
9558{ 9577{
9578 struct wiphy *wiphy = wdev->wiphy;
9579 struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
9580
9581 trace_cfg80211_ready_on_channel_expired(wdev, cookie, chan);
9559 nl80211_send_remain_on_chan_event(NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL, 9582 nl80211_send_remain_on_chan_event(NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL,
9560 rdev, wdev, cookie, chan, 0, gfp); 9583 rdev, wdev, cookie, chan, 0, gfp);
9561} 9584}
9585EXPORT_SYMBOL(cfg80211_remain_on_channel_expired);
9562 9586
9563void nl80211_send_sta_event(struct cfg80211_registered_device *rdev, 9587void cfg80211_new_sta(struct net_device *dev, const u8 *mac_addr,
9564 struct net_device *dev, const u8 *mac_addr, 9588 struct station_info *sinfo, gfp_t gfp)
9565 struct station_info *sinfo, gfp_t gfp)
9566{ 9589{
9590 struct wiphy *wiphy = dev->ieee80211_ptr->wiphy;
9591 struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
9567 struct sk_buff *msg; 9592 struct sk_buff *msg;
9568 9593
9594 trace_cfg80211_new_sta(dev, mac_addr, sinfo);
9595
9569 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 9596 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
9570 if (!msg) 9597 if (!msg)
9571 return; 9598 return;
@@ -9579,14 +9606,17 @@ void nl80211_send_sta_event(struct cfg80211_registered_device *rdev,
9579 genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0, 9606 genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0,
9580 nl80211_mlme_mcgrp.id, gfp); 9607 nl80211_mlme_mcgrp.id, gfp);
9581} 9608}
9609EXPORT_SYMBOL(cfg80211_new_sta);
9582 9610
9583void nl80211_send_sta_del_event(struct cfg80211_registered_device *rdev, 9611void cfg80211_del_sta(struct net_device *dev, const u8 *mac_addr, gfp_t gfp)
9584 struct net_device *dev, const u8 *mac_addr,
9585 gfp_t gfp)
9586{ 9612{
9613 struct wiphy *wiphy = dev->ieee80211_ptr->wiphy;
9614 struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
9587 struct sk_buff *msg; 9615 struct sk_buff *msg;
9588 void *hdr; 9616 void *hdr;
9589 9617
9618 trace_cfg80211_del_sta(dev, mac_addr);
9619
9590 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 9620 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
9591 if (!msg) 9621 if (!msg)
9592 return; 9622 return;
@@ -9611,12 +9641,14 @@ void nl80211_send_sta_del_event(struct cfg80211_registered_device *rdev,
9611 genlmsg_cancel(msg, hdr); 9641 genlmsg_cancel(msg, hdr);
9612 nlmsg_free(msg); 9642 nlmsg_free(msg);
9613} 9643}
9644EXPORT_SYMBOL(cfg80211_del_sta);
9614 9645
9615void nl80211_send_conn_failed_event(struct cfg80211_registered_device *rdev, 9646void cfg80211_conn_failed(struct net_device *dev, const u8 *mac_addr,
9616 struct net_device *dev, const u8 *mac_addr, 9647 enum nl80211_connect_failed_reason reason,
9617 enum nl80211_connect_failed_reason reason, 9648 gfp_t gfp)
9618 gfp_t gfp)
9619{ 9649{
9650 struct wiphy *wiphy = dev->ieee80211_ptr->wiphy;
9651 struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
9620 struct sk_buff *msg; 9652 struct sk_buff *msg;
9621 void *hdr; 9653 void *hdr;
9622 9654
@@ -9645,6 +9677,7 @@ void nl80211_send_conn_failed_event(struct cfg80211_registered_device *rdev,
9645 genlmsg_cancel(msg, hdr); 9677 genlmsg_cancel(msg, hdr);
9646 nlmsg_free(msg); 9678 nlmsg_free(msg);
9647} 9679}
9680EXPORT_SYMBOL(cfg80211_conn_failed);
9648 9681
9649static bool __nl80211_unexpected_frame(struct net_device *dev, u8 cmd, 9682static bool __nl80211_unexpected_frame(struct net_device *dev, u8 cmd,
9650 const u8 *addr, gfp_t gfp) 9683 const u8 *addr, gfp_t gfp)
@@ -9689,19 +9722,47 @@ static bool __nl80211_unexpected_frame(struct net_device *dev, u8 cmd,
9689 return true; 9722 return true;
9690} 9723}
9691 9724
9692bool nl80211_unexpected_frame(struct net_device *dev, const u8 *addr, gfp_t gfp) 9725bool cfg80211_rx_spurious_frame(struct net_device *dev,
9726 const u8 *addr, gfp_t gfp)
9693{ 9727{
9694 return __nl80211_unexpected_frame(dev, NL80211_CMD_UNEXPECTED_FRAME, 9728 struct wireless_dev *wdev = dev->ieee80211_ptr;
9695 addr, gfp); 9729 bool ret;
9730
9731 trace_cfg80211_rx_spurious_frame(dev, addr);
9732
9733 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_AP &&
9734 wdev->iftype != NL80211_IFTYPE_P2P_GO)) {
9735 trace_cfg80211_return_bool(false);
9736 return false;
9737 }
9738 ret = __nl80211_unexpected_frame(dev, NL80211_CMD_UNEXPECTED_FRAME,
9739 addr, gfp);
9740 trace_cfg80211_return_bool(ret);
9741 return ret;
9696} 9742}
9743EXPORT_SYMBOL(cfg80211_rx_spurious_frame);
9697 9744
9698bool nl80211_unexpected_4addr_frame(struct net_device *dev, 9745bool cfg80211_rx_unexpected_4addr_frame(struct net_device *dev,
9699 const u8 *addr, gfp_t gfp) 9746 const u8 *addr, gfp_t gfp)
9700{ 9747{
9701 return __nl80211_unexpected_frame(dev, 9748 struct wireless_dev *wdev = dev->ieee80211_ptr;
9702 NL80211_CMD_UNEXPECTED_4ADDR_FRAME, 9749 bool ret;
9703 addr, gfp); 9750
9751 trace_cfg80211_rx_unexpected_4addr_frame(dev, addr);
9752
9753 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_AP &&
9754 wdev->iftype != NL80211_IFTYPE_P2P_GO &&
9755 wdev->iftype != NL80211_IFTYPE_AP_VLAN)) {
9756 trace_cfg80211_return_bool(false);
9757 return false;
9758 }
9759 ret = __nl80211_unexpected_frame(dev,
9760 NL80211_CMD_UNEXPECTED_4ADDR_FRAME,
9761 addr, gfp);
9762 trace_cfg80211_return_bool(ret);
9763 return ret;
9704} 9764}
9765EXPORT_SYMBOL(cfg80211_rx_unexpected_4addr_frame);
9705 9766
9706int nl80211_send_mgmt(struct cfg80211_registered_device *rdev, 9767int nl80211_send_mgmt(struct cfg80211_registered_device *rdev,
9707 struct wireless_dev *wdev, u32 nlportid, 9768 struct wireless_dev *wdev, u32 nlportid,
@@ -9741,15 +9802,17 @@ int nl80211_send_mgmt(struct cfg80211_registered_device *rdev,
9741 return -ENOBUFS; 9802 return -ENOBUFS;
9742} 9803}
9743 9804
9744void nl80211_send_mgmt_tx_status(struct cfg80211_registered_device *rdev, 9805void cfg80211_mgmt_tx_status(struct wireless_dev *wdev, u64 cookie,
9745 struct wireless_dev *wdev, u64 cookie, 9806 const u8 *buf, size_t len, bool ack, gfp_t gfp)
9746 const u8 *buf, size_t len, bool ack,
9747 gfp_t gfp)
9748{ 9807{
9808 struct wiphy *wiphy = wdev->wiphy;
9809 struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
9749 struct net_device *netdev = wdev->netdev; 9810 struct net_device *netdev = wdev->netdev;
9750 struct sk_buff *msg; 9811 struct sk_buff *msg;
9751 void *hdr; 9812 void *hdr;
9752 9813
9814 trace_cfg80211_mgmt_tx_status(wdev, cookie, ack);
9815
9753 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 9816 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
9754 if (!msg) 9817 if (!msg)
9755 return; 9818 return;
@@ -9777,17 +9840,21 @@ void nl80211_send_mgmt_tx_status(struct cfg80211_registered_device *rdev,
9777 genlmsg_cancel(msg, hdr); 9840 genlmsg_cancel(msg, hdr);
9778 nlmsg_free(msg); 9841 nlmsg_free(msg);
9779} 9842}
9843EXPORT_SYMBOL(cfg80211_mgmt_tx_status);
9780 9844
9781void 9845void cfg80211_cqm_rssi_notify(struct net_device *dev,
9782nl80211_send_cqm_rssi_notify(struct cfg80211_registered_device *rdev, 9846 enum nl80211_cqm_rssi_threshold_event rssi_event,
9783 struct net_device *netdev, 9847 gfp_t gfp)
9784 enum nl80211_cqm_rssi_threshold_event rssi_event,
9785 gfp_t gfp)
9786{ 9848{
9849 struct wireless_dev *wdev = dev->ieee80211_ptr;
9850 struct wiphy *wiphy = wdev->wiphy;
9851 struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
9787 struct sk_buff *msg; 9852 struct sk_buff *msg;
9788 struct nlattr *pinfoattr; 9853 struct nlattr *pinfoattr;
9789 void *hdr; 9854 void *hdr;
9790 9855
9856 trace_cfg80211_cqm_rssi_notify(dev, rssi_event);
9857
9791 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 9858 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
9792 if (!msg) 9859 if (!msg)
9793 return; 9860 return;
@@ -9799,7 +9866,7 @@ nl80211_send_cqm_rssi_notify(struct cfg80211_registered_device *rdev,
9799 } 9866 }
9800 9867
9801 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 9868 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
9802 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex)) 9869 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex))
9803 goto nla_put_failure; 9870 goto nla_put_failure;
9804 9871
9805 pinfoattr = nla_nest_start(msg, NL80211_ATTR_CQM); 9872 pinfoattr = nla_nest_start(msg, NL80211_ATTR_CQM);
@@ -9822,10 +9889,11 @@ nl80211_send_cqm_rssi_notify(struct cfg80211_registered_device *rdev,
9822 genlmsg_cancel(msg, hdr); 9889 genlmsg_cancel(msg, hdr);
9823 nlmsg_free(msg); 9890 nlmsg_free(msg);
9824} 9891}
9892EXPORT_SYMBOL(cfg80211_cqm_rssi_notify);
9825 9893
9826void nl80211_gtk_rekey_notify(struct cfg80211_registered_device *rdev, 9894static void nl80211_gtk_rekey_notify(struct cfg80211_registered_device *rdev,
9827 struct net_device *netdev, const u8 *bssid, 9895 struct net_device *netdev, const u8 *bssid,
9828 const u8 *replay_ctr, gfp_t gfp) 9896 const u8 *replay_ctr, gfp_t gfp)
9829{ 9897{
9830 struct sk_buff *msg; 9898 struct sk_buff *msg;
9831 struct nlattr *rekey_attr; 9899 struct nlattr *rekey_attr;
@@ -9867,9 +9935,22 @@ void nl80211_gtk_rekey_notify(struct cfg80211_registered_device *rdev,
9867 nlmsg_free(msg); 9935 nlmsg_free(msg);
9868} 9936}
9869 9937
9870void nl80211_pmksa_candidate_notify(struct cfg80211_registered_device *rdev, 9938void cfg80211_gtk_rekey_notify(struct net_device *dev, const u8 *bssid,
9871 struct net_device *netdev, int index, 9939 const u8 *replay_ctr, gfp_t gfp)
9872 const u8 *bssid, bool preauth, gfp_t gfp) 9940{
9941 struct wireless_dev *wdev = dev->ieee80211_ptr;
9942 struct wiphy *wiphy = wdev->wiphy;
9943 struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
9944
9945 trace_cfg80211_gtk_rekey_notify(dev, bssid);
9946 nl80211_gtk_rekey_notify(rdev, dev, bssid, replay_ctr, gfp);
9947}
9948EXPORT_SYMBOL(cfg80211_gtk_rekey_notify);
9949
9950static void
9951nl80211_pmksa_candidate_notify(struct cfg80211_registered_device *rdev,
9952 struct net_device *netdev, int index,
9953 const u8 *bssid, bool preauth, gfp_t gfp)
9873{ 9954{
9874 struct sk_buff *msg; 9955 struct sk_buff *msg;
9875 struct nlattr *attr; 9956 struct nlattr *attr;
@@ -9912,9 +9993,22 @@ void nl80211_pmksa_candidate_notify(struct cfg80211_registered_device *rdev,
9912 nlmsg_free(msg); 9993 nlmsg_free(msg);
9913} 9994}
9914 9995
9915void nl80211_ch_switch_notify(struct cfg80211_registered_device *rdev, 9996void cfg80211_pmksa_candidate_notify(struct net_device *dev, int index,
9916 struct net_device *netdev, 9997 const u8 *bssid, bool preauth, gfp_t gfp)
9917 struct cfg80211_chan_def *chandef, gfp_t gfp) 9998{
9999 struct wireless_dev *wdev = dev->ieee80211_ptr;
10000 struct wiphy *wiphy = wdev->wiphy;
10001 struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
10002
10003 trace_cfg80211_pmksa_candidate_notify(dev, index, bssid, preauth);
10004 nl80211_pmksa_candidate_notify(rdev, dev, index, bssid, preauth, gfp);
10005}
10006EXPORT_SYMBOL(cfg80211_pmksa_candidate_notify);
10007
10008static void nl80211_ch_switch_notify(struct cfg80211_registered_device *rdev,
10009 struct net_device *netdev,
10010 struct cfg80211_chan_def *chandef,
10011 gfp_t gfp)
9918{ 10012{
9919 struct sk_buff *msg; 10013 struct sk_buff *msg;
9920 void *hdr; 10014 void *hdr;
@@ -9946,11 +10040,36 @@ void nl80211_ch_switch_notify(struct cfg80211_registered_device *rdev,
9946 nlmsg_free(msg); 10040 nlmsg_free(msg);
9947} 10041}
9948 10042
9949void 10043void cfg80211_ch_switch_notify(struct net_device *dev,
9950nl80211_send_cqm_txe_notify(struct cfg80211_registered_device *rdev, 10044 struct cfg80211_chan_def *chandef)
9951 struct net_device *netdev, const u8 *peer,
9952 u32 num_packets, u32 rate, u32 intvl, gfp_t gfp)
9953{ 10045{
10046 struct wireless_dev *wdev = dev->ieee80211_ptr;
10047 struct wiphy *wiphy = wdev->wiphy;
10048 struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
10049
10050 trace_cfg80211_ch_switch_notify(dev, chandef);
10051
10052 wdev_lock(wdev);
10053
10054 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_AP &&
10055 wdev->iftype != NL80211_IFTYPE_P2P_GO))
10056 goto out;
10057
10058 wdev->channel = chandef->chan;
10059 nl80211_ch_switch_notify(rdev, dev, chandef, GFP_KERNEL);
10060out:
10061 wdev_unlock(wdev);
10062 return;
10063}
10064EXPORT_SYMBOL(cfg80211_ch_switch_notify);
10065
10066void cfg80211_cqm_txe_notify(struct net_device *dev,
10067 const u8 *peer, u32 num_packets,
10068 u32 rate, u32 intvl, gfp_t gfp)
10069{
10070 struct wireless_dev *wdev = dev->ieee80211_ptr;
10071 struct wiphy *wiphy = wdev->wiphy;
10072 struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
9954 struct sk_buff *msg; 10073 struct sk_buff *msg;
9955 struct nlattr *pinfoattr; 10074 struct nlattr *pinfoattr;
9956 void *hdr; 10075 void *hdr;
@@ -9966,7 +10085,7 @@ nl80211_send_cqm_txe_notify(struct cfg80211_registered_device *rdev,
9966 } 10085 }
9967 10086
9968 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 10087 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
9969 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 10088 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
9970 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, peer)) 10089 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, peer))
9971 goto nla_put_failure; 10090 goto nla_put_failure;
9972 10091
@@ -9995,6 +10114,7 @@ nl80211_send_cqm_txe_notify(struct cfg80211_registered_device *rdev,
9995 genlmsg_cancel(msg, hdr); 10114 genlmsg_cancel(msg, hdr);
9996 nlmsg_free(msg); 10115 nlmsg_free(msg);
9997} 10116}
10117EXPORT_SYMBOL(cfg80211_cqm_txe_notify);
9998 10118
9999void 10119void
10000nl80211_radar_notify(struct cfg80211_registered_device *rdev, 10120nl80211_radar_notify(struct cfg80211_registered_device *rdev,
@@ -10047,15 +10167,18 @@ nl80211_radar_notify(struct cfg80211_registered_device *rdev,
10047 nlmsg_free(msg); 10167 nlmsg_free(msg);
10048} 10168}
10049 10169
10050void 10170void cfg80211_cqm_pktloss_notify(struct net_device *dev,
10051nl80211_send_cqm_pktloss_notify(struct cfg80211_registered_device *rdev, 10171 const u8 *peer, u32 num_packets, gfp_t gfp)
10052 struct net_device *netdev, const u8 *peer,
10053 u32 num_packets, gfp_t gfp)
10054{ 10172{
10173 struct wireless_dev *wdev = dev->ieee80211_ptr;
10174 struct wiphy *wiphy = wdev->wiphy;
10175 struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
10055 struct sk_buff *msg; 10176 struct sk_buff *msg;
10056 struct nlattr *pinfoattr; 10177 struct nlattr *pinfoattr;
10057 void *hdr; 10178 void *hdr;
10058 10179
10180 trace_cfg80211_cqm_pktloss_notify(dev, peer, num_packets);
10181
10059 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 10182 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
10060 if (!msg) 10183 if (!msg)
10061 return; 10184 return;
@@ -10067,7 +10190,7 @@ nl80211_send_cqm_pktloss_notify(struct cfg80211_registered_device *rdev,
10067 } 10190 }
10068 10191
10069 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 10192 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
10070 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 10193 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
10071 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, peer)) 10194 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, peer))
10072 goto nla_put_failure; 10195 goto nla_put_failure;
10073 10196
@@ -10090,6 +10213,7 @@ nl80211_send_cqm_pktloss_notify(struct cfg80211_registered_device *rdev,
10090 genlmsg_cancel(msg, hdr); 10213 genlmsg_cancel(msg, hdr);
10091 nlmsg_free(msg); 10214 nlmsg_free(msg);
10092} 10215}
10216EXPORT_SYMBOL(cfg80211_cqm_pktloss_notify);
10093 10217
10094void cfg80211_probe_status(struct net_device *dev, const u8 *addr, 10218void cfg80211_probe_status(struct net_device *dev, const u8 *addr,
10095 u64 cookie, bool acked, gfp_t gfp) 10219 u64 cookie, bool acked, gfp_t gfp)
diff --git a/net/wireless/nl80211.h b/net/wireless/nl80211.h
index b061da4919e1..a4073e808c13 100644
--- a/net/wireless/nl80211.h
+++ b/net/wireless/nl80211.h
@@ -29,12 +29,6 @@ void nl80211_send_deauth(struct cfg80211_registered_device *rdev,
29void nl80211_send_disassoc(struct cfg80211_registered_device *rdev, 29void nl80211_send_disassoc(struct cfg80211_registered_device *rdev,
30 struct net_device *netdev, 30 struct net_device *netdev,
31 const u8 *buf, size_t len, gfp_t gfp); 31 const u8 *buf, size_t len, gfp_t gfp);
32void nl80211_send_unprot_deauth(struct cfg80211_registered_device *rdev,
33 struct net_device *netdev,
34 const u8 *buf, size_t len, gfp_t gfp);
35void nl80211_send_unprot_disassoc(struct cfg80211_registered_device *rdev,
36 struct net_device *netdev,
37 const u8 *buf, size_t len, gfp_t gfp);
38void nl80211_send_auth_timeout(struct cfg80211_registered_device *rdev, 32void nl80211_send_auth_timeout(struct cfg80211_registered_device *rdev,
39 struct net_device *netdev, 33 struct net_device *netdev,
40 const u8 *addr, gfp_t gfp); 34 const u8 *addr, gfp_t gfp);
@@ -54,10 +48,6 @@ void nl80211_send_disconnected(struct cfg80211_registered_device *rdev,
54 struct net_device *netdev, u16 reason, 48 struct net_device *netdev, u16 reason,
55 const u8 *ie, size_t ie_len, bool from_ap); 49 const u8 *ie, size_t ie_len, bool from_ap);
56 50
57void nl80211_send_new_peer_candidate(struct cfg80211_registered_device *rdev,
58 struct net_device *netdev,
59 const u8 *macaddr, const u8* ie, u8 ie_len,
60 gfp_t gfp);
61void 51void
62nl80211_michael_mic_failure(struct cfg80211_registered_device *rdev, 52nl80211_michael_mic_failure(struct cfg80211_registered_device *rdev,
63 struct net_device *netdev, const u8 *addr, 53 struct net_device *netdev, const u8 *addr,
@@ -73,41 +63,10 @@ void nl80211_send_ibss_bssid(struct cfg80211_registered_device *rdev,
73 struct net_device *netdev, const u8 *bssid, 63 struct net_device *netdev, const u8 *bssid,
74 gfp_t gfp); 64 gfp_t gfp);
75 65
76void nl80211_send_remain_on_channel(struct cfg80211_registered_device *rdev,
77 struct wireless_dev *wdev, u64 cookie,
78 struct ieee80211_channel *chan,
79 unsigned int duration, gfp_t gfp);
80void nl80211_send_remain_on_channel_cancel(
81 struct cfg80211_registered_device *rdev,
82 struct wireless_dev *wdev,
83 u64 cookie, struct ieee80211_channel *chan, gfp_t gfp);
84
85void nl80211_send_sta_event(struct cfg80211_registered_device *rdev,
86 struct net_device *dev, const u8 *mac_addr,
87 struct station_info *sinfo, gfp_t gfp);
88void nl80211_send_sta_del_event(struct cfg80211_registered_device *rdev,
89 struct net_device *dev, const u8 *mac_addr,
90 gfp_t gfp);
91
92void nl80211_send_conn_failed_event(struct cfg80211_registered_device *rdev,
93 struct net_device *dev, const u8 *mac_addr,
94 enum nl80211_connect_failed_reason reason,
95 gfp_t gfp);
96
97int nl80211_send_mgmt(struct cfg80211_registered_device *rdev, 66int nl80211_send_mgmt(struct cfg80211_registered_device *rdev,
98 struct wireless_dev *wdev, u32 nlpid, 67 struct wireless_dev *wdev, u32 nlpid,
99 int freq, int sig_dbm, 68 int freq, int sig_dbm,
100 const u8 *buf, size_t len, gfp_t gfp); 69 const u8 *buf, size_t len, gfp_t gfp);
101void nl80211_send_mgmt_tx_status(struct cfg80211_registered_device *rdev,
102 struct wireless_dev *wdev, u64 cookie,
103 const u8 *buf, size_t len, bool ack,
104 gfp_t gfp);
105
106void
107nl80211_send_cqm_rssi_notify(struct cfg80211_registered_device *rdev,
108 struct net_device *netdev,
109 enum nl80211_cqm_rssi_threshold_event rssi_event,
110 gfp_t gfp);
111 70
112void 71void
113nl80211_radar_notify(struct cfg80211_registered_device *rdev, 72nl80211_radar_notify(struct cfg80211_registered_device *rdev,
@@ -115,31 +74,4 @@ nl80211_radar_notify(struct cfg80211_registered_device *rdev,
115 enum nl80211_radar_event event, 74 enum nl80211_radar_event event,
116 struct net_device *netdev, gfp_t gfp); 75 struct net_device *netdev, gfp_t gfp);
117 76
118void
119nl80211_send_cqm_pktloss_notify(struct cfg80211_registered_device *rdev,
120 struct net_device *netdev, const u8 *peer,
121 u32 num_packets, gfp_t gfp);
122
123void
124nl80211_send_cqm_txe_notify(struct cfg80211_registered_device *rdev,
125 struct net_device *netdev, const u8 *peer,
126 u32 num_packets, u32 rate, u32 intvl, gfp_t gfp);
127
128void nl80211_gtk_rekey_notify(struct cfg80211_registered_device *rdev,
129 struct net_device *netdev, const u8 *bssid,
130 const u8 *replay_ctr, gfp_t gfp);
131
132void nl80211_pmksa_candidate_notify(struct cfg80211_registered_device *rdev,
133 struct net_device *netdev, int index,
134 const u8 *bssid, bool preauth, gfp_t gfp);
135
136void nl80211_ch_switch_notify(struct cfg80211_registered_device *rdev,
137 struct net_device *dev,
138 struct cfg80211_chan_def *chandef, gfp_t gfp);
139
140bool nl80211_unexpected_frame(struct net_device *dev,
141 const u8 *addr, gfp_t gfp);
142bool nl80211_unexpected_4addr_frame(struct net_device *dev,
143 const u8 *addr, gfp_t gfp);
144
145#endif /* __NET_WIRELESS_NL80211_H */ 77#endif /* __NET_WIRELESS_NL80211_H */