]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blame - net/wireless/core.h
p54: fix queue stall due to underrun
[mirror_ubuntu-bionic-kernel.git] / net / wireless / core.h
CommitLineData
704232c2
JB
1/*
2 * Wireless configuration interface internals.
3 *
08645126 4 * Copyright 2006-2009 Johannes Berg <johannes@sipsolutions.net>
704232c2
JB
5 */
6#ifndef __NET_WIRELESS_CORE_H
7#define __NET_WIRELESS_CORE_H
8#include <linux/mutex.h>
9#include <linux/list.h>
10#include <linux/netdevice.h>
2a519311
JB
11#include <linux/kref.h>
12#include <linux/rbtree.h>
1ac61302 13#include <linux/debugfs.h>
1f87f7d3
JB
14#include <linux/rfkill.h>
15#include <linux/workqueue.h>
704232c2 16#include <net/genetlink.h>
704232c2 17#include <net/cfg80211.h>
3f2355cb 18#include "reg.h"
704232c2
JB
19
20struct cfg80211_registered_device {
3dcf670b 21 const struct cfg80211_ops *ops;
704232c2
JB
22 struct list_head list;
23 /* we hold this mutex during any call so that
24 * we cannot do multiple calls at once, and also
25 * to avoid the deregister call to proceed while
26 * any call is in progress */
27 struct mutex mtx;
28
1f87f7d3
JB
29 /* rfkill support */
30 struct rfkill_ops rfkill_ops;
31 struct rfkill *rfkill;
32 struct work_struct rfkill_sync;
33
3f2355cb
LR
34 /* ISO / IEC 3166 alpha2 for which this device is receiving
35 * country IEs on, this can help disregard country IEs from APs
36 * on the same alpha2 quickly. The alpha2 may differ from
37 * cfg80211_regdomain's alpha2 when an intersection has occurred.
38 * If the AP is reconfigured this can also be used to tell us if
39 * the country on the country IE changed. */
40 char country_ie_alpha2[2];
41
42 /* If a Country IE has been received this tells us the environment
43 * which its telling us its in. This defaults to ENVIRON_ANY */
44 enum environment_cap env;
45
704232c2 46 /* wiphy index, internal only */
b5850a7a 47 int wiphy_idx;
704232c2
JB
48
49 /* associate netdev list */
50 struct mutex devlist_mtx;
51 struct list_head netdev_list;
52
2a519311
JB
53 /* BSSes/scanning */
54 spinlock_t bss_lock;
55 struct list_head bss_list;
56 struct rb_root bss_tree;
57 u32 bss_generation;
58 struct cfg80211_scan_request *scan_req; /* protected by RTNL */
cb3a8eec 59 unsigned long suspend_at;
2a519311 60
aff89a9b
JB
61#ifdef CONFIG_NL80211_TESTMODE
62 struct genl_info *testmode_info;
63#endif
64
6829c878
JB
65 struct work_struct conn_work;
66
e43e820c 67#ifdef CONFIG_CFG80211_DEBUGFS
1ac61302
LR
68 /* Debugfs entries */
69 struct wiphy_debugfsdentries {
70 struct dentry *rts_threshold;
71 struct dentry *fragmentation_threshold;
72 struct dentry *short_retry_limit;
73 struct dentry *long_retry_limit;
80a3511d 74 struct dentry *ht40allow_map;
1ac61302
LR
75 } debugfs;
76#endif
77
704232c2
JB
78 /* must be last because of the way we do wiphy_priv(),
79 * and it should at least be aligned to NETDEV_ALIGN */
80 struct wiphy wiphy __attribute__((__aligned__(NETDEV_ALIGN)));
81};
82
83static inline
84struct cfg80211_registered_device *wiphy_to_dev(struct wiphy *wiphy)
85{
86 BUG_ON(!wiphy);
87 return container_of(wiphy, struct cfg80211_registered_device, wiphy);
88}
89
85fd129a
LR
90/* Note 0 is valid, hence phy0 */
91static inline
92bool wiphy_idx_valid(int wiphy_idx)
93{
94 return (wiphy_idx >= 0);
95}
96
a1794390 97extern struct mutex cfg80211_mutex;
704232c2
JB
98extern struct list_head cfg80211_drv_list;
99
7edfab7a 100#define assert_cfg80211_lock() WARN_ON(!mutex_is_locked(&cfg80211_mutex))
761cf7ec 101
806a9e39
LR
102/*
103 * You can use this to mark a wiphy_idx as not having an associated wiphy.
104 * It guarantees cfg80211_drv_by_wiphy_idx(wiphy_idx) will return NULL
105 */
106#define WIPHY_IDX_STALE -1
107
2a519311
JB
108struct cfg80211_internal_bss {
109 struct list_head list;
110 struct rb_node rbn;
111 unsigned long ts;
112 struct kref ref;
19957bb3
JB
113 atomic_t hold;
114 bool ies_allocated;
a08c1c1a 115
2a519311
JB
116 /* must be last because of priv member */
117 struct cfg80211_bss pub;
118};
119
19957bb3
JB
120static inline struct cfg80211_internal_bss *bss_from_pub(struct cfg80211_bss *pub)
121{
122 return container_of(pub, struct cfg80211_internal_bss, pub);
123}
124
125static inline void cfg80211_hold_bss(struct cfg80211_internal_bss *bss)
126{
127 atomic_inc(&bss->hold);
128}
129
130static inline void cfg80211_unhold_bss(struct cfg80211_internal_bss *bss)
131{
132 int r = atomic_dec_return(&bss->hold);
133 WARN_ON(r < 0);
134}
135
136
806a9e39
LR
137struct cfg80211_registered_device *cfg80211_drv_by_wiphy_idx(int wiphy_idx);
138int get_wiphy_idx(struct wiphy *wiphy);
139
4bbf4d56
JB
140struct cfg80211_registered_device *
141__cfg80211_drv_from_info(struct genl_info *info);
142
55682965
JB
143/*
144 * This function returns a pointer to the driver
145 * that the genl_info item that is passed refers to.
146 * If successful, it returns non-NULL and also locks
147 * the driver's mutex!
148 *
149 * This means that you need to call cfg80211_put_dev()
a1794390 150 * before being allowed to acquire &cfg80211_mutex!
55682965
JB
151 *
152 * This is necessary because we need to lock the global
153 * mutex to get an item off the list safely, and then
154 * we lock the drv mutex so it doesn't go away under us.
155 *
a1794390 156 * We don't want to keep cfg80211_mutex locked
55682965
JB
157 * for all the time in order to allow requests on
158 * other interfaces to go through at the same time.
159 *
160 * The result of this can be a PTR_ERR and hence must
161 * be checked with IS_ERR() for errors.
162 */
163extern struct cfg80211_registered_device *
164cfg80211_get_dev_from_info(struct genl_info *info);
165
806a9e39
LR
166/* requires cfg80211_drv_mutex to be held! */
167struct wiphy *wiphy_idx_to_wiphy(int wiphy_idx);
168
55682965
JB
169/* identical to cfg80211_get_dev_from_info but only operate on ifindex */
170extern struct cfg80211_registered_device *
171cfg80211_get_dev_from_ifindex(int ifindex);
172
173extern void cfg80211_put_dev(struct cfg80211_registered_device *drv);
174
704232c2
JB
175/* free object */
176extern void cfg80211_dev_free(struct cfg80211_registered_device *drv);
177
55682965
JB
178extern int cfg80211_dev_rename(struct cfg80211_registered_device *drv,
179 char *newname);
180
8318d78a 181void ieee80211_set_bitrate_flags(struct wiphy *wiphy);
7db90f4a
LR
182void wiphy_update_regulatory(struct wiphy *wiphy,
183 enum nl80211_reg_initiator setby);
8318d78a 184
2a519311 185void cfg80211_bss_expire(struct cfg80211_registered_device *dev);
cb3a8eec
DW
186void cfg80211_bss_age(struct cfg80211_registered_device *dev,
187 unsigned long age_secs);
2a519311 188
04a773ad
JB
189/* IBSS */
190int cfg80211_join_ibss(struct cfg80211_registered_device *rdev,
191 struct net_device *dev,
192 struct cfg80211_ibss_params *params);
9d308429 193void cfg80211_clear_ibss(struct net_device *dev, bool nowext);
04a773ad 194int cfg80211_leave_ibss(struct cfg80211_registered_device *rdev,
9d308429 195 struct net_device *dev, bool nowext);
04a773ad 196
19957bb3
JB
197/* MLME */
198int cfg80211_mlme_auth(struct cfg80211_registered_device *rdev,
199 struct net_device *dev, struct ieee80211_channel *chan,
200 enum nl80211_auth_type auth_type, const u8 *bssid,
201 const u8 *ssid, int ssid_len,
202 const u8 *ie, int ie_len);
203int cfg80211_mlme_assoc(struct cfg80211_registered_device *rdev,
204 struct net_device *dev, struct ieee80211_channel *chan,
205 const u8 *bssid, const u8 *ssid, int ssid_len,
206 const u8 *ie, int ie_len, bool use_mfp,
207 struct cfg80211_crypto_settings *crypt);
208int cfg80211_mlme_deauth(struct cfg80211_registered_device *rdev,
209 struct net_device *dev, const u8 *bssid,
210 const u8 *ie, int ie_len, u16 reason);
211int cfg80211_mlme_disassoc(struct cfg80211_registered_device *rdev,
212 struct net_device *dev, const u8 *bssid,
213 const u8 *ie, int ie_len, u16 reason);
214void cfg80211_mlme_down(struct cfg80211_registered_device *rdev,
215 struct net_device *dev);
216
b23aa676
SO
217/* SME */
218int cfg80211_connect(struct cfg80211_registered_device *rdev,
219 struct net_device *dev,
220 struct cfg80211_connect_params *connect);
221int cfg80211_disconnect(struct cfg80211_registered_device *rdev,
f2129354
JB
222 struct net_device *dev, u16 reason,
223 bool wextev);
b23aa676 224
6829c878
JB
225void cfg80211_conn_work(struct work_struct *work);
226
08645126
JB
227/* internal helpers */
228int cfg80211_validate_key_settings(struct key_params *params, int key_idx,
229 const u8 *mac_addr);
6829c878
JB
230void __cfg80211_disconnected(struct net_device *dev, gfp_t gfp, u8 *ie,
231 size_t ie_len, u16 reason, bool from_ap);
232void cfg80211_sme_scan_done(struct net_device *dev);
233void cfg80211_sme_rx_auth(struct net_device *dev, const u8 *buf, size_t len);
19957bb3 234void cfg80211_sme_disassoc(struct net_device *dev, int idx);
08645126 235
704232c2 236#endif /* __NET_WIRELESS_CORE_H */