1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
29bb7e0f2SJohannes Berg /*
39bb7e0f2SJohannes Berg * Portions of this file
400b3d840SAvraham Stern * Copyright (C) 2018, 2020-2022 Intel Corporation
59bb7e0f2SJohannes Berg */
655682965SJohannes Berg #ifndef __NET_WIRELESS_NL80211_H
755682965SJohannes Berg #define __NET_WIRELESS_NL80211_H
855682965SJohannes Berg
955682965SJohannes Berg #include "core.h"
1055682965SJohannes Berg
11dad82330SJohannes Berg int nl80211_init(void);
12dad82330SJohannes Berg void nl80211_exit(void);
139bb7e0f2SJohannes Berg
149bb7e0f2SJohannes Berg void *nl80211hdr_put(struct sk_buff *skb, u32 portid, u32 seq,
159bb7e0f2SJohannes Berg int flags, u8 cmd);
169bb7e0f2SJohannes Berg bool nl80211_put_sta_rate(struct sk_buff *msg, struct rate_info *info,
179bb7e0f2SJohannes Berg int attr);
189bb7e0f2SJohannes Berg
wdev_id(struct wireless_dev * wdev)199bb7e0f2SJohannes Berg static inline u64 wdev_id(struct wireless_dev *wdev)
209bb7e0f2SJohannes Berg {
219bb7e0f2SJohannes Berg return (u64)wdev->identifier |
229bb7e0f2SJohannes Berg ((u64)wiphy_to_rdev(wdev->wiphy)->wiphy_idx << 32);
239bb7e0f2SJohannes Berg }
249bb7e0f2SJohannes Berg
259bb7e0f2SJohannes Berg int nl80211_parse_chandef(struct cfg80211_registered_device *rdev,
269bb7e0f2SJohannes Berg struct genl_info *info,
279bb7e0f2SJohannes Berg struct cfg80211_chan_def *chandef);
289bb7e0f2SJohannes Berg int nl80211_parse_random_mac(struct nlattr **attrs,
299bb7e0f2SJohannes Berg u8 *mac_addr, u8 *mac_addr_mask);
309bb7e0f2SJohannes Berg
313bb20556SJohannes Berg void nl80211_notify_wiphy(struct cfg80211_registered_device *rdev,
323bb20556SJohannes Berg enum nl80211_commands cmd);
33896ff063SDenis Kenzior void nl80211_notify_iface(struct cfg80211_registered_device *rdev,
34896ff063SDenis Kenzior struct wireless_dev *wdev,
35896ff063SDenis Kenzior enum nl80211_commands cmd);
36dad82330SJohannes Berg void nl80211_send_scan_start(struct cfg80211_registered_device *rdev,
37fd014284SJohannes Berg struct wireless_dev *wdev);
38f9d15d16SJohannes Berg struct sk_buff *nl80211_build_scan_msg(struct cfg80211_registered_device *rdev,
39f9d15d16SJohannes Berg struct wireless_dev *wdev, bool aborted);
40505a2e88SArend Van Spriel void nl80211_send_scan_msg(struct cfg80211_registered_device *rdev,
41f9d15d16SJohannes Berg struct sk_buff *msg);
4296b08fd6SArend Van Spriel void nl80211_send_sched_scan(struct cfg80211_sched_scan_request *req, u32 cmd);
43b0d7aa59SJonathan Doron void nl80211_common_reg_change_event(enum nl80211_commands cmd_id,
44b0d7aa59SJonathan Doron struct regulatory_request *request);
45b0d7aa59SJonathan Doron
46b0d7aa59SJonathan Doron static inline void
nl80211_send_reg_change_event(struct regulatory_request * request)47b0d7aa59SJonathan Doron nl80211_send_reg_change_event(struct regulatory_request *request)
48b0d7aa59SJonathan Doron {
49b0d7aa59SJonathan Doron nl80211_common_reg_change_event(NL80211_CMD_REG_CHANGE, request);
50b0d7aa59SJonathan Doron }
51b0d7aa59SJonathan Doron
52b0d7aa59SJonathan Doron static inline void
nl80211_send_wiphy_reg_change_event(struct regulatory_request * request)53b0d7aa59SJonathan Doron nl80211_send_wiphy_reg_change_event(struct regulatory_request *request)
54b0d7aa59SJonathan Doron {
55b0d7aa59SJonathan Doron nl80211_common_reg_change_event(NL80211_CMD_WIPHY_REG_CHANGE, request);
56b0d7aa59SJonathan Doron }
57b0d7aa59SJonathan Doron
58dad82330SJohannes Berg void nl80211_send_rx_auth(struct cfg80211_registered_device *rdev,
596039f6d2SJouni Malinen struct net_device *netdev,
60e6d6e342SJohannes Berg const u8 *buf, size_t len, gfp_t gfp);
61dad82330SJohannes Berg void nl80211_send_rx_assoc(struct cfg80211_registered_device *rdev,
626039f6d2SJouni Malinen struct net_device *netdev,
63cd47c0f5SJohannes Berg struct cfg80211_rx_assoc_resp *data);
64dad82330SJohannes Berg void nl80211_send_deauth(struct cfg80211_registered_device *rdev,
656039f6d2SJouni Malinen struct net_device *netdev,
663bb02143SJohannes Berg const u8 *buf, size_t len,
673bb02143SJohannes Berg bool reconnect, gfp_t gfp);
68dad82330SJohannes Berg void nl80211_send_disassoc(struct cfg80211_registered_device *rdev,
696039f6d2SJouni Malinen struct net_device *netdev,
703bb02143SJohannes Berg const u8 *buf, size_t len,
713bb02143SJohannes Berg bool reconnect, gfp_t gfp);
72dad82330SJohannes Berg void nl80211_send_auth_timeout(struct cfg80211_registered_device *rdev,
731965c853SJouni Malinen struct net_device *netdev,
74e6d6e342SJohannes Berg const u8 *addr, gfp_t gfp);
75dad82330SJohannes Berg void nl80211_send_assoc_timeout(struct cfg80211_registered_device *rdev,
761965c853SJouni Malinen struct net_device *netdev,
77e6d6e342SJohannes Berg const u8 *addr, gfp_t gfp);
78b23aa676SSamuel Ortiz void nl80211_send_connect_result(struct cfg80211_registered_device *rdev,
795349a0f7SVidyullatha Kanchanapally struct net_device *netdev,
805349a0f7SVidyullatha Kanchanapally struct cfg80211_connect_resp_params *params,
813093ebbeSPurushottam Kushwaha gfp_t gfp);
82b23aa676SSamuel Ortiz void nl80211_send_roamed(struct cfg80211_registered_device *rdev,
8329ce6ecbSAvraham Stern struct net_device *netdev,
8429ce6ecbSAvraham Stern struct cfg80211_roam_info *info, gfp_t gfp);
85503c1fb9SAvraham Stern void nl80211_send_port_authorized(struct cfg80211_registered_device *rdev,
860ff57171SVinayak Yadawad struct net_device *netdev, const u8 *bssid,
870ff57171SVinayak Yadawad const u8 *td_bitmap, u8 td_bitmap_len);
88b23aa676SSamuel Ortiz void nl80211_send_disconnected(struct cfg80211_registered_device *rdev,
89b23aa676SSamuel Ortiz struct net_device *netdev, u16 reason,
90667503ddSJohannes Berg const u8 *ie, size_t ie_len, bool from_ap);
91b23aa676SSamuel Ortiz
92dad82330SJohannes Berg void
93a3b8b056SJouni Malinen nl80211_michael_mic_failure(struct cfg80211_registered_device *rdev,
94a3b8b056SJouni Malinen struct net_device *netdev, const u8 *addr,
95a3b8b056SJouni Malinen enum nl80211_key_type key_type,
96e6d6e342SJohannes Berg int key_id, const u8 *tsc, gfp_t gfp);
9755682965SJohannes Berg
98dad82330SJohannes Berg void
996bad8766SLuis R. Rodriguez nl80211_send_beacon_hint_event(struct wiphy *wiphy,
1006bad8766SLuis R. Rodriguez struct ieee80211_channel *channel_before,
1016bad8766SLuis R. Rodriguez struct ieee80211_channel *channel_after);
1026bad8766SLuis R. Rodriguez
10304a773adSJohannes Berg void nl80211_send_ibss_bssid(struct cfg80211_registered_device *rdev,
10404a773adSJohannes Berg struct net_device *netdev, const u8 *bssid,
10504a773adSJohannes Berg gfp_t gfp);
10604a773adSJohannes Berg
1072e161f78SJohannes Berg int nl80211_send_mgmt(struct cfg80211_registered_device *rdev,
10871bbc994SJohannes Berg struct wireless_dev *wdev, u32 nlpid,
10900b3d840SAvraham Stern struct cfg80211_rx_info *info, gfp_t gfp);
11004f39047SSimon Wunderlich
11104f39047SSimon Wunderlich void
11204f39047SSimon Wunderlich nl80211_radar_notify(struct cfg80211_registered_device *rdev,
113d2859df5SJanusz Dziedzic const struct cfg80211_chan_def *chandef,
11404f39047SSimon Wunderlich enum nl80211_radar_event event,
11504f39047SSimon Wunderlich struct net_device *netdev, gfp_t gfp);
11604f39047SSimon Wunderlich
117*cba7217aSAlvin Šipraga void nl80211_send_ap_stopped(struct wireless_dev *wdev, unsigned int link_id);
118348baf0eSJohannes Berg
119be29b99aSAmitkumar Karwar void cfg80211_rdev_free_coalesce(struct cfg80211_registered_device *rdev);
120be29b99aSAmitkumar Karwar
1219bb7e0f2SJohannes Berg /* peer measurement */
1229bb7e0f2SJohannes Berg int nl80211_pmsr_start(struct sk_buff *skb, struct genl_info *info);
1239bb7e0f2SJohannes Berg
12455682965SJohannes Berg #endif /* __NET_WIRELESS_NL80211_H */
125