Blame view
net/wireless/core.h
17.9 KB
b24413180
|
1 |
/* SPDX-License-Identifier: GPL-2.0 */ |
704232c27
|
2 3 4 |
/* * Wireless configuration interface internals. * |
5f2aa25e0
|
5 |
* Copyright 2006-2010 Johannes Berg <johannes@sipsolutions.net> |
c8cb5b854
|
6 |
* Copyright (C) 2018-2020 Intel Corporation |
704232c27
|
7 8 9 |
*/ #ifndef __NET_WIRELESS_CORE_H #define __NET_WIRELESS_CORE_H |
704232c27
|
10 11 |
#include <linux/list.h> #include <linux/netdevice.h> |
2a5193119
|
12 |
#include <linux/rbtree.h> |
1ac61302d
|
13 |
#include <linux/debugfs.h> |
1f87f7d3a
|
14 15 |
#include <linux/rfkill.h> #include <linux/workqueue.h> |
c5a7e5824
|
16 |
#include <linux/rtnetlink.h> |
704232c27
|
17 |
#include <net/genetlink.h> |
704232c27
|
18 |
#include <net/cfg80211.h> |
3f2355cb9
|
19 |
#include "reg.h" |
704232c27
|
20 |
|
f41737669
|
21 22 |
#define WIPHY_IDX_INVALID -1 |
704232c27
|
23 |
struct cfg80211_registered_device { |
3dcf670ba
|
24 |
const struct cfg80211_ops *ops; |
704232c27
|
25 |
struct list_head list; |
704232c27
|
26 |
|
1f87f7d3a
|
27 28 29 |
/* rfkill support */ struct rfkill_ops rfkill_ops; struct rfkill *rfkill; |
3cfe91c4c
|
30 |
struct work_struct rfkill_block; |
1f87f7d3a
|
31 |
|
3f2355cb9
|
32 33 34 35 36 37 38 |
/* ISO / IEC 3166 alpha2 for which this device is receiving * country IEs on, this can help disregard country IEs from APs * on the same alpha2 quickly. The alpha2 may differ from * cfg80211_regdomain's alpha2 when an intersection has occurred. * If the AP is reconfigured this can also be used to tell us if * the country on the country IE changed. */ char country_ie_alpha2[2]; |
b0d7aa595
|
39 40 41 42 43 44 |
/* * the driver requests the regulatory core to set this regulatory * domain as the wiphy's. Only used for %REGULATORY_WIPHY_SELF_MANAGED * devices using the regulatory_set_wiphy_regd() API */ const struct ieee80211_regdomain *requested_regd; |
3f2355cb9
|
45 46 47 |
/* If a Country IE has been received this tells us the environment * which its telling us its in. This defaults to ENVIRON_ANY */ enum environment_cap env; |
704232c27
|
48 |
/* wiphy index, internal only */ |
b5850a7a4
|
49 |
int wiphy_idx; |
704232c27
|
50 |
|
53873f134
|
51 |
/* protected by RTNL */ |
89a54e48b
|
52 |
int devlist_generation, wdev_id; |
8b9b2f069
|
53 |
int opencount; |
ad002395f
|
54 |
wait_queue_head_t dev_wait; |
704232c27
|
55 |
|
37c73b5f3
|
56 57 |
struct list_head beacon_registrations; spinlock_t beacon_registrations_lock; |
5e760230e
|
58 |
|
c5a7e5824
|
59 |
/* protected by RTNL only */ |
dbbae26af
|
60 61 |
int num_running_ifaces; int num_running_monitor_ifaces; |
b60ad3485
|
62 |
u64 cookie_counter; |
dbbae26af
|
63 |
|
2a5193119
|
64 65 66 67 68 |
/* BSSes/scanning */ spinlock_t bss_lock; struct list_head bss_list; struct rb_root bss_tree; u32 bss_generation; |
9853a55ef
|
69 |
u32 bss_entries; |
2a5193119
|
70 |
struct cfg80211_scan_request *scan_req; /* protected by RTNL */ |
c8cb5b854
|
71 |
struct cfg80211_scan_request *int_scan_req; |
f9d15d162
|
72 |
struct sk_buff *scan_msg; |
ca986ad9b
|
73 |
struct list_head sched_scan_req_list; |
fe0984d38
|
74 |
time64_t suspend_at; |
667503ddc
|
75 |
struct work_struct scan_done_wk; |
2a5193119
|
76 |
|
ad7e718c9
|
77 |
struct genl_info *cur_cmd_info; |
aff89a9b9
|
78 |
|
6829c878e
|
79 |
struct work_struct conn_work; |
667503ddc
|
80 |
struct work_struct event_work; |
6829c878e
|
81 |
|
04f39047a
|
82 |
struct delayed_work dfs_update_channels_wk; |
5de179848
|
83 84 |
/* netlink port which started critical protocol (0 means not started) */ u32 crit_proto_nlportid; |
be29b99a9
|
85 |
struct cfg80211_coalesce *coalesce; |
78f22b6a3
|
86 |
struct work_struct destroy_work; |
93a1e86ce
|
87 |
struct work_struct sched_scan_stop_wk; |
b34939b98
|
88 |
struct work_struct sched_scan_res_wk; |
93a1e86ce
|
89 |
|
897667273
|
90 91 92 93 94 |
struct cfg80211_chan_def radar_chandef; struct work_struct propagate_radar_detect_wk; struct cfg80211_chan_def cac_done_chandef; struct work_struct propagate_cac_done_wk; |
79ea1e12c
|
95 |
struct work_struct mgmt_registrations_update_wk; |
704232c27
|
96 97 |
/* must be last because of the way we do wiphy_priv(), * and it should at least be aligned to NETDEV_ALIGN */ |
1c06ef983
|
98 |
struct wiphy wiphy __aligned(NETDEV_ALIGN); |
704232c27
|
99 100 101 |
}; static inline |
f26cbf401
|
102 |
struct cfg80211_registered_device *wiphy_to_rdev(struct wiphy *wiphy) |
704232c27
|
103 104 105 106 |
{ BUG_ON(!wiphy); return container_of(wiphy, struct cfg80211_registered_device, wiphy); } |
ff1b6e69a
|
107 108 109 |
static inline void cfg80211_rdev_free_wowlan(struct cfg80211_registered_device *rdev) { |
6abb9cb99
|
110 |
#ifdef CONFIG_PM |
ff1b6e69a
|
111 |
int i; |
6abb9cb99
|
112 |
if (!rdev->wiphy.wowlan_config) |
ff1b6e69a
|
113 |
return; |
6abb9cb99
|
114 115 116 117 118 119 120 |
for (i = 0; i < rdev->wiphy.wowlan_config->n_patterns; i++) kfree(rdev->wiphy.wowlan_config->patterns[i].mask); kfree(rdev->wiphy.wowlan_config->patterns); if (rdev->wiphy.wowlan_config->tcp && rdev->wiphy.wowlan_config->tcp->sock) sock_release(rdev->wiphy.wowlan_config->tcp->sock); kfree(rdev->wiphy.wowlan_config->tcp); |
8cd4d4563
|
121 |
kfree(rdev->wiphy.wowlan_config->nd_config); |
6abb9cb99
|
122 123 |
kfree(rdev->wiphy.wowlan_config); #endif |
ff1b6e69a
|
124 |
} |
e60d7443e
|
125 |
|
b60ad3485
|
126 127 128 129 130 131 132 133 134 |
static inline u64 cfg80211_assign_cookie(struct cfg80211_registered_device *rdev) { u64 r = ++rdev->cookie_counter; if (WARN_ON(r == 0)) r = ++rdev->cookie_counter; return r; } |
e60d7443e
|
135 |
extern struct workqueue_struct *cfg80211_wq; |
79c97e97a
|
136 |
extern struct list_head cfg80211_rdev_list; |
f5ea9120b
|
137 |
extern int cfg80211_rdev_list_generation; |
704232c27
|
138 |
|
2a5193119
|
139 140 |
struct cfg80211_internal_bss { struct list_head list; |
776b35801
|
141 |
struct list_head hidden_list; |
2a5193119
|
142 |
struct rb_node rbn; |
6e19bc4b7
|
143 |
u64 ts_boottime; |
2a5193119
|
144 |
unsigned long ts; |
776b35801
|
145 |
unsigned long refcount; |
19957bb39
|
146 |
atomic_t hold; |
a08c1c1ac
|
147 |
|
1d76250bd
|
148 149 150 151 152 153 154 155 156 157 158 |
/* time at the start of the reception of the first octet of the * timestamp field of the last beacon/probe received for this BSS. * The time is the TSF of the BSS specified by %parent_bssid. */ u64 parent_tsf; /* the BSS according to which %parent_tsf is set. This is set to * the BSS that the interface that requested the scan was connected to * when the beacon/probe was received. */ u8 parent_bssid[ETH_ALEN] __aligned(2); |
2a5193119
|
159 160 161 |
/* must be last because of priv member */ struct cfg80211_bss pub; }; |
19957bb39
|
162 163 164 165 166 167 168 169 |
static inline struct cfg80211_internal_bss *bss_from_pub(struct cfg80211_bss *pub) { return container_of(pub, struct cfg80211_internal_bss, pub); } static inline void cfg80211_hold_bss(struct cfg80211_internal_bss *bss) { atomic_inc(&bss->hold); |
7011ba583
|
170 171 |
if (bss->pub.transmitted_bss) { bss = container_of(bss->pub.transmitted_bss, |
a3584f56d
|
172 173 174 |
struct cfg80211_internal_bss, pub); atomic_inc(&bss->hold); } |
19957bb39
|
175 176 177 178 179 180 |
} static inline void cfg80211_unhold_bss(struct cfg80211_internal_bss *bss) { int r = atomic_dec_return(&bss->hold); WARN_ON(r < 0); |
7011ba583
|
181 182 |
if (bss->pub.transmitted_bss) { bss = container_of(bss->pub.transmitted_bss, |
a3584f56d
|
183 184 185 186 |
struct cfg80211_internal_bss, pub); r = atomic_dec_return(&bss->hold); WARN_ON(r < 0); } |
19957bb39
|
187 |
} |
79c97e97a
|
188 |
struct cfg80211_registered_device *cfg80211_rdev_by_wiphy_idx(int wiphy_idx); |
806a9e396
|
189 |
int get_wiphy_idx(struct wiphy *wiphy); |
806a9e396
|
190 |
struct wiphy *wiphy_idx_to_wiphy(int wiphy_idx); |
463d01832
|
191 192 |
int cfg80211_switch_netns(struct cfg80211_registered_device *rdev, struct net *net); |
556829657
|
193 |
|
9bdaf3b91
|
194 195 196 |
void cfg80211_init_wdev(struct wireless_dev *wdev); void cfg80211_register_wdev(struct cfg80211_registered_device *rdev, struct wireless_dev *wdev); |
e4d4216e9
|
197 |
|
667503ddc
|
198 199 200 201 202 203 204 205 206 207 208 209 210 |
static inline void wdev_lock(struct wireless_dev *wdev) __acquires(wdev) { mutex_lock(&wdev->mtx); __acquire(wdev->mtx); } static inline void wdev_unlock(struct wireless_dev *wdev) __releases(wdev) { __release(wdev->mtx); mutex_unlock(&wdev->mtx); } |
46a5ebaf0
|
211 |
#define ASSERT_WDEV_LOCK(wdev) lockdep_assert_held(&(wdev)->mtx) |
667503ddc
|
212 |
|
dbbae26af
|
213 214 |
static inline bool cfg80211_has_monitors_only(struct cfg80211_registered_device *rdev) { |
c5a7e5824
|
215 |
ASSERT_RTNL(); |
dbbae26af
|
216 217 218 219 |
return rdev->num_running_ifaces == rdev->num_running_monitor_ifaces && rdev->num_running_ifaces > 0; } |
667503ddc
|
220 221 222 223 224 |
enum cfg80211_event_type { EVENT_CONNECT_RESULT, EVENT_ROAMED, EVENT_DISCONNECTED, EVENT_IBSS_JOINED, |
f04c22033
|
225 |
EVENT_STOPPED, |
503c1fb98
|
226 |
EVENT_PORT_AUTHORIZED, |
667503ddc
|
227 228 229 230 231 232 233 |
}; struct cfg80211_event { struct list_head list; enum cfg80211_event_type type; union { |
5349a0f7b
|
234 |
struct cfg80211_connect_resp_params cr; |
29ce6ecbb
|
235 |
struct cfg80211_roam_info rm; |
667503ddc
|
236 237 238 239 |
struct { const u8 *ie; size_t ie_len; u16 reason; |
80279fb7b
|
240 |
bool locally_generated; |
667503ddc
|
241 242 243 |
} dc; struct { u8 bssid[ETH_ALEN]; |
fe94f3a4f
|
244 |
struct ieee80211_channel *channel; |
667503ddc
|
245 |
} ij; |
503c1fb98
|
246 247 248 |
struct { u8 bssid[ETH_ALEN]; } pa; |
667503ddc
|
249 250 |
}; }; |
fffd0934b
|
251 |
struct cfg80211_cached_keys { |
b8676221f
|
252 253 |
struct key_params params[CFG80211_MAX_WEP_KEYS]; u8 data[CFG80211_MAX_WEP_KEYS][WLAN_KEY_LEN_WEP104]; |
89b706fb2
|
254 |
int def; |
fffd0934b
|
255 |
}; |
26ab9a0c5
|
256 257 258 259 260 |
enum cfg80211_chan_mode { CHAN_MODE_UNDEFINED, CHAN_MODE_SHARED, CHAN_MODE_EXCLUSIVE, }; |
37c73b5f3
|
261 262 263 264 |
struct cfg80211_beacon_registration { struct list_head list; u32 nlportid; }; |
667503ddc
|
265 |
|
4a4b81695
|
266 267 268 269 |
struct cfg80211_cqm_config { u32 rssi_hyst; s32 last_rssi_event_value; int n_rssi_thresholds; |
396fba0a5
|
270 |
s32 rssi_thresholds[]; |
4a4b81695
|
271 |
}; |
78f22b6a3
|
272 |
void cfg80211_destroy_ifaces(struct cfg80211_registered_device *rdev); |
704232c27
|
273 |
/* free object */ |
c1b1203d6
|
274 |
void cfg80211_dev_free(struct cfg80211_registered_device *rdev); |
704232c27
|
275 |
|
c1b1203d6
|
276 277 |
int cfg80211_dev_rename(struct cfg80211_registered_device *rdev, char *newname); |
556829657
|
278 |
|
8318d78a4
|
279 |
void ieee80211_set_bitrate_flags(struct wiphy *wiphy); |
8318d78a4
|
280 |
|
1b8ec87aa
|
281 282 |
void cfg80211_bss_expire(struct cfg80211_registered_device *rdev); void cfg80211_bss_age(struct cfg80211_registered_device *rdev, |
cb3a8eec0
|
283 |
unsigned long age_secs); |
0afd425b1
|
284 285 |
void cfg80211_update_assoc_bss_entry(struct wireless_dev *wdev, struct ieee80211_channel *channel); |
2a5193119
|
286 |
|
04a773ade
|
287 |
/* IBSS */ |
f8d16d3ed
|
288 289 290 291 |
int __cfg80211_join_ibss(struct cfg80211_registered_device *rdev, struct net_device *dev, struct cfg80211_ibss_params *params, struct cfg80211_cached_keys *connkeys); |
9d308429a
|
292 |
void cfg80211_clear_ibss(struct net_device *dev, bool nowext); |
98d3a7ca9
|
293 294 |
int __cfg80211_leave_ibss(struct cfg80211_registered_device *rdev, struct net_device *dev, bool nowext); |
04a773ade
|
295 |
int cfg80211_leave_ibss(struct cfg80211_registered_device *rdev, |
9d308429a
|
296 |
struct net_device *dev, bool nowext); |
fe94f3a4f
|
297 298 |
void __cfg80211_ibss_joined(struct net_device *dev, const u8 *bssid, struct ieee80211_channel *channel); |
fffd0934b
|
299 300 |
int cfg80211_ibss_wext_join(struct cfg80211_registered_device *rdev, struct wireless_dev *wdev); |
04a773ade
|
301 |
|
29cbe68c5
|
302 303 |
/* mesh */ extern const struct mesh_config default_mesh_config; |
c80d545da
|
304 |
extern const struct mesh_setup default_mesh_setup; |
29cbe68c5
|
305 306 |
int __cfg80211_join_mesh(struct cfg80211_registered_device *rdev, struct net_device *dev, |
cc1d2806b
|
307 |
struct mesh_setup *setup, |
29cbe68c5
|
308 |
const struct mesh_config *conf); |
f04c22033
|
309 310 |
int __cfg80211_leave_mesh(struct cfg80211_registered_device *rdev, struct net_device *dev); |
29cbe68c5
|
311 312 |
int cfg80211_leave_mesh(struct cfg80211_registered_device *rdev, struct net_device *dev); |
683b6d3b3
|
313 314 315 |
int cfg80211_set_mesh_channel(struct cfg80211_registered_device *rdev, struct wireless_dev *wdev, struct cfg80211_chan_def *chandef); |
29cbe68c5
|
316 |
|
6e0bd6c35
|
317 318 319 320 321 322 323 324 325 326 327 |
/* OCB */ int __cfg80211_join_ocb(struct cfg80211_registered_device *rdev, struct net_device *dev, struct ocb_setup *setup); int cfg80211_join_ocb(struct cfg80211_registered_device *rdev, struct net_device *dev, struct ocb_setup *setup); int __cfg80211_leave_ocb(struct cfg80211_registered_device *rdev, struct net_device *dev); int cfg80211_leave_ocb(struct cfg80211_registered_device *rdev, struct net_device *dev); |
60771780c
|
328 |
/* AP */ |
f04c22033
|
329 330 |
int __cfg80211_stop_ap(struct cfg80211_registered_device *rdev, struct net_device *dev, bool notify); |
60771780c
|
331 |
int cfg80211_stop_ap(struct cfg80211_registered_device *rdev, |
7c8d5e03a
|
332 |
struct net_device *dev, bool notify); |
60771780c
|
333 |
|
19957bb39
|
334 335 |
/* MLME */ int cfg80211_mlme_auth(struct cfg80211_registered_device *rdev, |
91bf9b26f
|
336 337 338 339 |
struct net_device *dev, struct ieee80211_channel *chan, enum nl80211_auth_type auth_type, const u8 *bssid, |
19957bb39
|
340 |
const u8 *ssid, int ssid_len, |
fffd0934b
|
341 |
const u8 *ie, int ie_len, |
e39e5b5e7
|
342 |
const u8 *key, int key_len, int key_idx, |
11b6b5a4c
|
343 |
const u8 *auth_data, int auth_data_len); |
19957bb39
|
344 |
int cfg80211_mlme_assoc(struct cfg80211_registered_device *rdev, |
f62fab735
|
345 346 347 |
struct net_device *dev, struct ieee80211_channel *chan, const u8 *bssid, |
3e5d7649a
|
348 |
const u8 *ssid, int ssid_len, |
f62fab735
|
349 |
struct cfg80211_assoc_request *req); |
19957bb39
|
350 351 |
int cfg80211_mlme_deauth(struct cfg80211_registered_device *rdev, struct net_device *dev, const u8 *bssid, |
d5cdfacb3
|
352 353 |
const u8 *ie, int ie_len, u16 reason, bool local_state_change); |
19957bb39
|
354 355 |
int cfg80211_mlme_disassoc(struct cfg80211_registered_device *rdev, struct net_device *dev, const u8 *bssid, |
d5cdfacb3
|
356 357 |
const u8 *ie, int ie_len, u16 reason, bool local_state_change); |
19957bb39
|
358 359 |
void cfg80211_mlme_down(struct cfg80211_registered_device *rdev, struct net_device *dev); |
2e161f78e
|
360 361 |
int cfg80211_mlme_register_mgmt(struct wireless_dev *wdev, u32 snd_pid, u16 frame_type, const u8 *match_data, |
9dba48a6e
|
362 363 |
int match_len, bool multicast_rx, struct netlink_ext_ack *extack); |
6cd536fe6
|
364 |
void cfg80211_mgmt_registrations_update_wk(struct work_struct *wk); |
2e161f78e
|
365 366 367 |
void cfg80211_mlme_unregister_socket(struct wireless_dev *wdev, u32 nlpid); void cfg80211_mlme_purge_registrations(struct wireless_dev *wdev); int cfg80211_mlme_mgmt_tx(struct cfg80211_registered_device *rdev, |
71bbc9943
|
368 |
struct wireless_dev *wdev, |
b176e6294
|
369 370 |
struct cfg80211_mgmt_tx_params *params, u64 *cookie); |
7e7c8926b
|
371 372 |
void cfg80211_oper_and_ht_capa(struct ieee80211_ht_cap *ht_capa, const struct ieee80211_ht_cap *ht_capa_mask); |
ee2aca343
|
373 374 |
void cfg80211_oper_and_vht_capa(struct ieee80211_vht_cap *vht_capa, const struct ieee80211_vht_cap *vht_capa_mask); |
19957bb39
|
375 |
|
ceca7b712
|
376 |
/* SME events */ |
b23aa676a
|
377 378 |
int cfg80211_connect(struct cfg80211_registered_device *rdev, struct net_device *dev, |
fffd0934b
|
379 |
struct cfg80211_connect_params *connect, |
83739b03d
|
380 381 |
struct cfg80211_cached_keys *connkeys, const u8 *prev_bssid); |
5349a0f7b
|
382 383 384 |
void __cfg80211_connect_result(struct net_device *dev, struct cfg80211_connect_resp_params *params, bool wextev); |
ceca7b712
|
385 386 |
void __cfg80211_disconnected(struct net_device *dev, const u8 *ie, size_t ie_len, u16 reason, bool from_ap); |
b23aa676a
|
387 |
int cfg80211_disconnect(struct cfg80211_registered_device *rdev, |
f21293549
|
388 389 |
struct net_device *dev, u16 reason, bool wextev); |
ed9d01026
|
390 |
void __cfg80211_roamed(struct wireless_dev *wdev, |
29ce6ecbb
|
391 |
struct cfg80211_roam_info *info); |
503c1fb98
|
392 |
void __cfg80211_port_authorized(struct wireless_dev *wdev, const u8 *bssid); |
fffd0934b
|
393 394 |
int cfg80211_mgd_wext_connect(struct cfg80211_registered_device *rdev, struct wireless_dev *wdev); |
bd2522b16
|
395 |
void cfg80211_autodisconnect_wk(struct work_struct *work); |
b23aa676a
|
396 |
|
ceca7b712
|
397 |
/* SME implementation */ |
6829c878e
|
398 |
void cfg80211_conn_work(struct work_struct *work); |
ceca7b712
|
399 400 401 402 403 404 405 |
void cfg80211_sme_scan_done(struct net_device *dev); bool cfg80211_sme_rx_assoc_resp(struct wireless_dev *wdev, u16 status); void cfg80211_sme_rx_auth(struct wireless_dev *wdev, const u8 *buf, size_t len); void cfg80211_sme_disassoc(struct wireless_dev *wdev); void cfg80211_sme_deauth(struct wireless_dev *wdev); void cfg80211_sme_auth_timeout(struct wireless_dev *wdev); void cfg80211_sme_assoc_timeout(struct wireless_dev *wdev); |
e6f462df9
|
406 |
void cfg80211_sme_abandon_assoc(struct wireless_dev *wdev); |
6829c878e
|
407 |
|
08645126d
|
408 |
/* internal helpers */ |
38ba3c57a
|
409 |
bool cfg80211_supported_cipher_suite(struct wiphy *wiphy, u32 cipher); |
05725b40b
|
410 411 |
bool cfg80211_valid_key_idx(struct cfg80211_registered_device *rdev, int key_idx, bool pairwise); |
fffd0934b
|
412 413 |
int cfg80211_validate_key_settings(struct cfg80211_registered_device *rdev, struct key_params *params, int key_idx, |
e31b82136
|
414 |
bool pairwise, const u8 *mac_addr); |
667503ddc
|
415 |
void __cfg80211_scan_done(struct work_struct *wk); |
f9d15d162
|
416 417 |
void ___cfg80211_scan_done(struct cfg80211_registered_device *rdev, bool send_message); |
ca986ad9b
|
418 419 420 421 |
void cfg80211_add_sched_scan_req(struct cfg80211_registered_device *rdev, struct cfg80211_sched_scan_request *req); int cfg80211_sched_scan_req_possible(struct cfg80211_registered_device *rdev, bool want_multi); |
b34939b98
|
422 |
void cfg80211_sched_scan_results_wk(struct work_struct *work); |
ca986ad9b
|
423 424 425 |
int cfg80211_stop_sched_scan_req(struct cfg80211_registered_device *rdev, struct cfg80211_sched_scan_request *req, bool driver_initiated); |
807f8a8c3
|
426 |
int __cfg80211_stop_sched_scan(struct cfg80211_registered_device *rdev, |
ca986ad9b
|
427 |
u64 reqid, bool driver_initiated); |
fffd0934b
|
428 |
void cfg80211_upload_connect_keys(struct wireless_dev *wdev); |
3d54d2551
|
429 430 |
int cfg80211_change_iface(struct cfg80211_registered_device *rdev, struct net_device *dev, enum nl80211_iftype ntype, |
818a986e4
|
431 |
struct vif_params *params); |
3d54d2551
|
432 |
void cfg80211_process_rdev_events(struct cfg80211_registered_device *rdev); |
1f6fc43e6
|
433 |
void cfg80211_process_wdev_events(struct wireless_dev *wdev); |
08645126d
|
434 |
|
4787cfa08
|
435 436 |
bool cfg80211_does_bw_fit_range(const struct ieee80211_freq_range *freq_range, u32 center_freq_khz, u32 bw_khz); |
c8cb5b854
|
437 |
int cfg80211_scan(struct cfg80211_registered_device *rdev); |
e005bd7dd
|
438 |
extern struct work_struct cfg80211_disconnect_work; |
fe7c3a1f2
|
439 440 441 442 443 444 445 |
/** * cfg80211_chandef_dfs_usable - checks if chandef is DFS usable * @wiphy: the wiphy to validate against * @chandef: the channel definition to check * * Checks if chandef is usable and we can/need start CAC on such channel. * |
b42c8edfd
|
446 447 |
* Return: true if all channels available and at least * one channel requires CAC (NL80211_DFS_USABLE) |
fe7c3a1f2
|
448 449 450 |
*/ bool cfg80211_chandef_dfs_usable(struct wiphy *wiphy, const struct cfg80211_chan_def *chandef); |
04f39047a
|
451 452 453 454 455 |
void cfg80211_set_dfs_state(struct wiphy *wiphy, const struct cfg80211_chan_def *chandef, enum nl80211_dfs_state dfs_state); void cfg80211_dfs_channels_update_work(struct work_struct *work); |
31559f35c
|
456 457 458 |
unsigned int cfg80211_chandef_dfs_cac_time(struct wiphy *wiphy, const struct cfg80211_chan_def *chandef); |
04f39047a
|
459 |
|
b35a51c7d
|
460 461 462 463 464 465 466 467 468 |
void cfg80211_sched_dfs_chan_update(struct cfg80211_registered_device *rdev); bool cfg80211_any_wiphy_oper_chan(struct wiphy *wiphy, struct ieee80211_channel *chan); bool cfg80211_beaconing_iface_active(struct wireless_dev *wdev); bool cfg80211_is_sub_chan(struct cfg80211_chan_def *chandef, struct ieee80211_channel *chan); |
04f39047a
|
469 470 471 472 473 474 |
static inline unsigned int elapsed_jiffies_msecs(unsigned long start) { unsigned long end = jiffies; if (end >= start) return jiffies_to_msecs(end - start); |
0ce12026d
|
475 |
return jiffies_to_msecs(end + (ULONG_MAX - start) + 1); |
04f39047a
|
476 |
} |
26ab9a0c5
|
477 |
void |
8e95ea49c
|
478 |
cfg80211_get_chan_state(struct wireless_dev *wdev, |
26ab9a0c5
|
479 |
struct ieee80211_channel **chan, |
9e0e29615
|
480 481 |
enum cfg80211_chan_mode *chanmode, u8 *radar_detect); |
26ab9a0c5
|
482 |
|
e8c9bd5b8
|
483 |
int cfg80211_set_monitor_channel(struct cfg80211_registered_device *rdev, |
683b6d3b3
|
484 |
struct cfg80211_chan_def *chandef); |
59bbb6f75
|
485 |
|
34850ab25
|
486 487 488 |
int ieee80211_get_ratemask(struct ieee80211_supported_band *sband, const u8 *rates, unsigned int n_rates, u32 *mask); |
56d1893d9
|
489 |
int cfg80211_validate_beacon_int(struct cfg80211_registered_device *rdev, |
0c317a02c
|
490 |
enum nl80211_iftype iftype, u32 beacon_int); |
56d1893d9
|
491 |
|
dbbae26af
|
492 493 |
void cfg80211_update_iface_num(struct cfg80211_registered_device *rdev, enum nl80211_iftype iftype, int num); |
f04c22033
|
494 495 |
void __cfg80211_leave(struct cfg80211_registered_device *rdev, struct wireless_dev *wdev); |
812569699
|
496 497 |
void cfg80211_leave(struct cfg80211_registered_device *rdev, struct wireless_dev *wdev); |
f9f475292
|
498 499 |
void cfg80211_stop_p2p_device(struct cfg80211_registered_device *rdev, struct wireless_dev *wdev); |
cb3b7d876
|
500 501 |
void cfg80211_stop_nan(struct cfg80211_registered_device *rdev, struct wireless_dev *wdev); |
a3ce17d14
|
502 503 504 505 |
struct cfg80211_internal_bss * cfg80211_bss_update(struct cfg80211_registered_device *rdev, struct cfg80211_internal_bss *tmp, bool signal_valid, unsigned long ts); |
f7969969f
|
506 507 508 509 510 511 512 513 514 515 |
#ifdef CONFIG_CFG80211_DEVELOPER_WARNINGS #define CFG80211_DEV_WARN_ON(cond) WARN_ON(cond) #else /* * Trick to enable using it as a condition, * and also not give a warning when it's * not used that way. */ #define CFG80211_DEV_WARN_ON(cond) ({bool __r = (cond); __r; }) #endif |
4a4b81695
|
516 |
void cfg80211_cqm_config_free(struct wireless_dev *wdev); |
9bb7e0f24
|
517 518 519 |
void cfg80211_release_pmsr(struct wireless_dev *wdev, u32 portid); void cfg80211_pmsr_wdev_down(struct wireless_dev *wdev); void cfg80211_pmsr_free_wk(struct work_struct *work); |
704232c27
|
520 |
#endif /* __NET_WIRELESS_CORE_H */ |