1 /* 2 * Wireless configuration interface internals. 3 * 4 * Copyright 2006-2010 Johannes Berg <johannes@sipsolutions.net> 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> 11 #include <linux/kref.h> 12 #include <linux/rbtree.h> 13 #include <linux/debugfs.h> 14 #include <linux/rfkill.h> 15 #include <linux/workqueue.h> 16 #include <net/genetlink.h> 17 #include <net/cfg80211.h> 18 #include "reg.h" 19 20 struct cfg80211_registered_device { 21 const struct cfg80211_ops *ops; 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 29 /* rfkill support */ 30 struct rfkill_ops rfkill_ops; 31 struct rfkill *rfkill; 32 struct work_struct rfkill_sync; 33 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 46 /* wiphy index, internal only */ 47 int wiphy_idx; 48 49 /* associate netdev list */ 50 struct mutex devlist_mtx; 51 /* protected by devlist_mtx or RCU */ 52 struct list_head netdev_list; 53 int devlist_generation; 54 int opencount; /* also protected by devlist_mtx */ 55 wait_queue_head_t dev_wait; 56 57 /* BSSes/scanning */ 58 spinlock_t bss_lock; 59 struct list_head bss_list; 60 struct rb_root bss_tree; 61 u32 bss_generation; 62 struct cfg80211_scan_request *scan_req; /* protected by RTNL */ 63 struct cfg80211_sched_scan_request *sched_scan_req; 64 unsigned long suspend_at; 65 struct work_struct scan_done_wk; 66 struct work_struct sched_scan_results_wk; 67 68 struct mutex sched_scan_mtx; 69 70 #ifdef CONFIG_NL80211_TESTMODE 71 struct genl_info *testmode_info; 72 #endif 73 74 struct work_struct conn_work; 75 struct work_struct event_work; 76 77 struct cfg80211_wowlan *wowlan; 78 79 /* must be last because of the way we do wiphy_priv(), 80 * and it should at least be aligned to NETDEV_ALIGN */ 81 struct wiphy wiphy __attribute__((__aligned__(NETDEV_ALIGN))); 82 }; 83 84 static inline 85 struct cfg80211_registered_device *wiphy_to_dev(struct wiphy *wiphy) 86 { 87 BUG_ON(!wiphy); 88 return container_of(wiphy, struct cfg80211_registered_device, wiphy); 89 } 90 91 /* Note 0 is valid, hence phy0 */ 92 static inline 93 bool wiphy_idx_valid(int wiphy_idx) 94 { 95 return wiphy_idx >= 0; 96 } 97 98 static inline void 99 cfg80211_rdev_free_wowlan(struct cfg80211_registered_device *rdev) 100 { 101 int i; 102 103 if (!rdev->wowlan) 104 return; 105 for (i = 0; i < rdev->wowlan->n_patterns; i++) 106 kfree(rdev->wowlan->patterns[i].mask); 107 kfree(rdev->wowlan->patterns); 108 kfree(rdev->wowlan); 109 } 110 111 extern struct workqueue_struct *cfg80211_wq; 112 extern struct mutex cfg80211_mutex; 113 extern struct list_head cfg80211_rdev_list; 114 extern int cfg80211_rdev_list_generation; 115 116 static inline void assert_cfg80211_lock(void) 117 { 118 lockdep_assert_held(&cfg80211_mutex); 119 } 120 121 /* 122 * You can use this to mark a wiphy_idx as not having an associated wiphy. 123 * It guarantees cfg80211_rdev_by_wiphy_idx(wiphy_idx) will return NULL 124 */ 125 #define WIPHY_IDX_STALE -1 126 127 struct cfg80211_internal_bss { 128 struct list_head list; 129 struct rb_node rbn; 130 unsigned long ts; 131 struct kref ref; 132 atomic_t hold; 133 bool beacon_ies_allocated; 134 bool proberesp_ies_allocated; 135 136 /* must be last because of priv member */ 137 struct cfg80211_bss pub; 138 }; 139 140 static inline struct cfg80211_internal_bss *bss_from_pub(struct cfg80211_bss *pub) 141 { 142 return container_of(pub, struct cfg80211_internal_bss, pub); 143 } 144 145 static inline void cfg80211_ref_bss(struct cfg80211_internal_bss *bss) 146 { 147 kref_get(&bss->ref); 148 } 149 150 static inline void cfg80211_hold_bss(struct cfg80211_internal_bss *bss) 151 { 152 atomic_inc(&bss->hold); 153 } 154 155 static inline void cfg80211_unhold_bss(struct cfg80211_internal_bss *bss) 156 { 157 int r = atomic_dec_return(&bss->hold); 158 WARN_ON(r < 0); 159 } 160 161 162 struct cfg80211_registered_device *cfg80211_rdev_by_wiphy_idx(int wiphy_idx); 163 int get_wiphy_idx(struct wiphy *wiphy); 164 165 struct cfg80211_registered_device * 166 __cfg80211_rdev_from_info(struct genl_info *info); 167 168 /* 169 * This function returns a pointer to the driver 170 * that the genl_info item that is passed refers to. 171 * If successful, it returns non-NULL and also locks 172 * the driver's mutex! 173 * 174 * This means that you need to call cfg80211_unlock_rdev() 175 * before being allowed to acquire &cfg80211_mutex! 176 * 177 * This is necessary because we need to lock the global 178 * mutex to get an item off the list safely, and then 179 * we lock the rdev mutex so it doesn't go away under us. 180 * 181 * We don't want to keep cfg80211_mutex locked 182 * for all the time in order to allow requests on 183 * other interfaces to go through at the same time. 184 * 185 * The result of this can be a PTR_ERR and hence must 186 * be checked with IS_ERR() for errors. 187 */ 188 extern struct cfg80211_registered_device * 189 cfg80211_get_dev_from_info(struct genl_info *info); 190 191 /* requires cfg80211_rdev_mutex to be held! */ 192 struct wiphy *wiphy_idx_to_wiphy(int wiphy_idx); 193 194 /* identical to cfg80211_get_dev_from_info but only operate on ifindex */ 195 extern struct cfg80211_registered_device * 196 cfg80211_get_dev_from_ifindex(struct net *net, int ifindex); 197 198 int cfg80211_switch_netns(struct cfg80211_registered_device *rdev, 199 struct net *net); 200 201 static inline void cfg80211_lock_rdev(struct cfg80211_registered_device *rdev) 202 { 203 mutex_lock(&rdev->mtx); 204 } 205 206 static inline void cfg80211_unlock_rdev(struct cfg80211_registered_device *rdev) 207 { 208 BUG_ON(IS_ERR(rdev) || !rdev); 209 mutex_unlock(&rdev->mtx); 210 } 211 212 static inline void wdev_lock(struct wireless_dev *wdev) 213 __acquires(wdev) 214 { 215 mutex_lock(&wdev->mtx); 216 __acquire(wdev->mtx); 217 } 218 219 static inline void wdev_unlock(struct wireless_dev *wdev) 220 __releases(wdev) 221 { 222 __release(wdev->mtx); 223 mutex_unlock(&wdev->mtx); 224 } 225 226 #define ASSERT_RDEV_LOCK(rdev) lockdep_assert_held(&(rdev)->mtx) 227 #define ASSERT_WDEV_LOCK(wdev) lockdep_assert_held(&(wdev)->mtx) 228 229 enum cfg80211_event_type { 230 EVENT_CONNECT_RESULT, 231 EVENT_ROAMED, 232 EVENT_DISCONNECTED, 233 EVENT_IBSS_JOINED, 234 }; 235 236 struct cfg80211_event { 237 struct list_head list; 238 enum cfg80211_event_type type; 239 240 union { 241 struct { 242 u8 bssid[ETH_ALEN]; 243 const u8 *req_ie; 244 const u8 *resp_ie; 245 size_t req_ie_len; 246 size_t resp_ie_len; 247 u16 status; 248 } cr; 249 struct { 250 struct ieee80211_channel *channel; 251 u8 bssid[ETH_ALEN]; 252 const u8 *req_ie; 253 const u8 *resp_ie; 254 size_t req_ie_len; 255 size_t resp_ie_len; 256 } rm; 257 struct { 258 const u8 *ie; 259 size_t ie_len; 260 u16 reason; 261 } dc; 262 struct { 263 u8 bssid[ETH_ALEN]; 264 } ij; 265 }; 266 }; 267 268 struct cfg80211_cached_keys { 269 struct key_params params[6]; 270 u8 data[6][WLAN_MAX_KEY_LEN]; 271 int def, defmgmt; 272 }; 273 274 275 /* free object */ 276 extern void cfg80211_dev_free(struct cfg80211_registered_device *rdev); 277 278 extern int cfg80211_dev_rename(struct cfg80211_registered_device *rdev, 279 char *newname); 280 281 void ieee80211_set_bitrate_flags(struct wiphy *wiphy); 282 void wiphy_update_regulatory(struct wiphy *wiphy, 283 enum nl80211_reg_initiator setby); 284 285 void cfg80211_bss_expire(struct cfg80211_registered_device *dev); 286 void cfg80211_bss_age(struct cfg80211_registered_device *dev, 287 unsigned long age_secs); 288 289 /* IBSS */ 290 int __cfg80211_join_ibss(struct cfg80211_registered_device *rdev, 291 struct net_device *dev, 292 struct cfg80211_ibss_params *params, 293 struct cfg80211_cached_keys *connkeys); 294 int cfg80211_join_ibss(struct cfg80211_registered_device *rdev, 295 struct net_device *dev, 296 struct cfg80211_ibss_params *params, 297 struct cfg80211_cached_keys *connkeys); 298 void cfg80211_clear_ibss(struct net_device *dev, bool nowext); 299 int __cfg80211_leave_ibss(struct cfg80211_registered_device *rdev, 300 struct net_device *dev, bool nowext); 301 int cfg80211_leave_ibss(struct cfg80211_registered_device *rdev, 302 struct net_device *dev, bool nowext); 303 void __cfg80211_ibss_joined(struct net_device *dev, const u8 *bssid); 304 int cfg80211_ibss_wext_join(struct cfg80211_registered_device *rdev, 305 struct wireless_dev *wdev); 306 307 /* mesh */ 308 extern const struct mesh_config default_mesh_config; 309 extern const struct mesh_setup default_mesh_setup; 310 int __cfg80211_join_mesh(struct cfg80211_registered_device *rdev, 311 struct net_device *dev, 312 const struct mesh_setup *setup, 313 const struct mesh_config *conf); 314 int cfg80211_join_mesh(struct cfg80211_registered_device *rdev, 315 struct net_device *dev, 316 const struct mesh_setup *setup, 317 const struct mesh_config *conf); 318 int cfg80211_leave_mesh(struct cfg80211_registered_device *rdev, 319 struct net_device *dev); 320 321 /* MLME */ 322 int __cfg80211_mlme_auth(struct cfg80211_registered_device *rdev, 323 struct net_device *dev, 324 struct ieee80211_channel *chan, 325 enum nl80211_auth_type auth_type, 326 const u8 *bssid, 327 const u8 *ssid, int ssid_len, 328 const u8 *ie, int ie_len, 329 const u8 *key, int key_len, int key_idx, 330 bool local_state_change); 331 int cfg80211_mlme_auth(struct cfg80211_registered_device *rdev, 332 struct net_device *dev, struct ieee80211_channel *chan, 333 enum nl80211_auth_type auth_type, const u8 *bssid, 334 const u8 *ssid, int ssid_len, 335 const u8 *ie, int ie_len, 336 const u8 *key, int key_len, int key_idx, 337 bool local_state_change); 338 int __cfg80211_mlme_assoc(struct cfg80211_registered_device *rdev, 339 struct net_device *dev, 340 struct ieee80211_channel *chan, 341 const u8 *bssid, const u8 *prev_bssid, 342 const u8 *ssid, int ssid_len, 343 const u8 *ie, int ie_len, bool use_mfp, 344 struct cfg80211_crypto_settings *crypt); 345 int cfg80211_mlme_assoc(struct cfg80211_registered_device *rdev, 346 struct net_device *dev, struct ieee80211_channel *chan, 347 const u8 *bssid, const u8 *prev_bssid, 348 const u8 *ssid, int ssid_len, 349 const u8 *ie, int ie_len, bool use_mfp, 350 struct cfg80211_crypto_settings *crypt); 351 int __cfg80211_mlme_deauth(struct cfg80211_registered_device *rdev, 352 struct net_device *dev, const u8 *bssid, 353 const u8 *ie, int ie_len, u16 reason, 354 bool local_state_change); 355 int cfg80211_mlme_deauth(struct cfg80211_registered_device *rdev, 356 struct net_device *dev, const u8 *bssid, 357 const u8 *ie, int ie_len, u16 reason, 358 bool local_state_change); 359 int cfg80211_mlme_disassoc(struct cfg80211_registered_device *rdev, 360 struct net_device *dev, const u8 *bssid, 361 const u8 *ie, int ie_len, u16 reason, 362 bool local_state_change); 363 void cfg80211_mlme_down(struct cfg80211_registered_device *rdev, 364 struct net_device *dev); 365 void __cfg80211_connect_result(struct net_device *dev, const u8 *bssid, 366 const u8 *req_ie, size_t req_ie_len, 367 const u8 *resp_ie, size_t resp_ie_len, 368 u16 status, bool wextev, 369 struct cfg80211_bss *bss); 370 int cfg80211_mlme_register_mgmt(struct wireless_dev *wdev, u32 snd_pid, 371 u16 frame_type, const u8 *match_data, 372 int match_len); 373 void cfg80211_mlme_unregister_socket(struct wireless_dev *wdev, u32 nlpid); 374 void cfg80211_mlme_purge_registrations(struct wireless_dev *wdev); 375 int cfg80211_mlme_mgmt_tx(struct cfg80211_registered_device *rdev, 376 struct net_device *dev, 377 struct ieee80211_channel *chan, bool offchan, 378 enum nl80211_channel_type channel_type, 379 bool channel_type_valid, unsigned int wait, 380 const u8 *buf, size_t len, u64 *cookie); 381 382 /* SME */ 383 int __cfg80211_connect(struct cfg80211_registered_device *rdev, 384 struct net_device *dev, 385 struct cfg80211_connect_params *connect, 386 struct cfg80211_cached_keys *connkeys, 387 const u8 *prev_bssid); 388 int cfg80211_connect(struct cfg80211_registered_device *rdev, 389 struct net_device *dev, 390 struct cfg80211_connect_params *connect, 391 struct cfg80211_cached_keys *connkeys); 392 int __cfg80211_disconnect(struct cfg80211_registered_device *rdev, 393 struct net_device *dev, u16 reason, 394 bool wextev); 395 int cfg80211_disconnect(struct cfg80211_registered_device *rdev, 396 struct net_device *dev, u16 reason, 397 bool wextev); 398 void __cfg80211_roamed(struct wireless_dev *wdev, 399 struct ieee80211_channel *channel, 400 const u8 *bssid, 401 const u8 *req_ie, size_t req_ie_len, 402 const u8 *resp_ie, size_t resp_ie_len); 403 int cfg80211_mgd_wext_connect(struct cfg80211_registered_device *rdev, 404 struct wireless_dev *wdev); 405 406 void cfg80211_conn_work(struct work_struct *work); 407 void cfg80211_sme_failed_assoc(struct wireless_dev *wdev); 408 bool cfg80211_sme_failed_reassoc(struct wireless_dev *wdev); 409 410 /* internal helpers */ 411 int cfg80211_validate_key_settings(struct cfg80211_registered_device *rdev, 412 struct key_params *params, int key_idx, 413 bool pairwise, const u8 *mac_addr); 414 void __cfg80211_disconnected(struct net_device *dev, const u8 *ie, 415 size_t ie_len, u16 reason, bool from_ap); 416 void cfg80211_sme_scan_done(struct net_device *dev); 417 void cfg80211_sme_rx_auth(struct net_device *dev, const u8 *buf, size_t len); 418 void cfg80211_sme_disassoc(struct net_device *dev, int idx); 419 void __cfg80211_scan_done(struct work_struct *wk); 420 void ___cfg80211_scan_done(struct cfg80211_registered_device *rdev, bool leak); 421 void __cfg80211_sched_scan_results(struct work_struct *wk); 422 int __cfg80211_stop_sched_scan(struct cfg80211_registered_device *rdev, 423 bool driver_initiated); 424 void cfg80211_upload_connect_keys(struct wireless_dev *wdev); 425 int cfg80211_change_iface(struct cfg80211_registered_device *rdev, 426 struct net_device *dev, enum nl80211_iftype ntype, 427 u32 *flags, struct vif_params *params); 428 void cfg80211_process_rdev_events(struct cfg80211_registered_device *rdev); 429 430 int cfg80211_can_change_interface(struct cfg80211_registered_device *rdev, 431 struct wireless_dev *wdev, 432 enum nl80211_iftype iftype); 433 434 static inline int 435 cfg80211_can_add_interface(struct cfg80211_registered_device *rdev, 436 enum nl80211_iftype iftype) 437 { 438 return cfg80211_can_change_interface(rdev, NULL, iftype); 439 } 440 441 struct ieee80211_channel * 442 rdev_freq_to_chan(struct cfg80211_registered_device *rdev, 443 int freq, enum nl80211_channel_type channel_type); 444 int cfg80211_set_freq(struct cfg80211_registered_device *rdev, 445 struct wireless_dev *wdev, int freq, 446 enum nl80211_channel_type channel_type); 447 448 u16 cfg80211_calculate_bitrate(struct rate_info *rate); 449 450 int ieee80211_get_ratemask(struct ieee80211_supported_band *sband, 451 const u8 *rates, unsigned int n_rates, 452 u32 *mask); 453 454 int cfg80211_validate_beacon_int(struct cfg80211_registered_device *rdev, 455 u32 beacon_int); 456 457 #ifdef CONFIG_CFG80211_DEVELOPER_WARNINGS 458 #define CFG80211_DEV_WARN_ON(cond) WARN_ON(cond) 459 #else 460 /* 461 * Trick to enable using it as a condition, 462 * and also not give a warning when it's 463 * not used that way. 464 */ 465 #define CFG80211_DEV_WARN_ON(cond) ({bool __r = (cond); __r; }) 466 #endif 467 468 #endif /* __NET_WIRELESS_CORE_H */ 469