2007-04-23 23:20:05 +04:00
/*
* Wireless configuration interface internals .
*
2009-05-11 15:54:58 +04:00
* Copyright 2006 - 2009 Johannes Berg < johannes @ sipsolutions . net >
2007-04-23 23:20:05 +04:00
*/
# ifndef __NET_WIRELESS_CORE_H
# define __NET_WIRELESS_CORE_H
# include <linux/mutex.h>
# include <linux/list.h>
# include <linux/netdevice.h>
2009-02-10 23:25:55 +03:00
# include <linux/kref.h>
# include <linux/rbtree.h>
2009-05-02 08:37:21 +04:00
# include <linux/debugfs.h>
2009-06-02 15:01:41 +04:00
# include <linux/rfkill.h>
# include <linux/workqueue.h>
2007-04-23 23:20:05 +04:00
# include <net/genetlink.h>
# include <net/cfg80211.h>
2008-11-13 01:22:02 +03:00
# include "reg.h"
2007-04-23 23:20:05 +04:00
struct cfg80211_registered_device {
2009-05-17 02:13:46 +04:00
const struct cfg80211_ops * ops ;
2007-04-23 23:20:05 +04:00
struct list_head list ;
/* we hold this mutex during any call so that
* we cannot do multiple calls at once , and also
* to avoid the deregister call to proceed while
* any call is in progress */
struct mutex mtx ;
2009-06-02 15:01:41 +04:00
/* rfkill support */
struct rfkill_ops rfkill_ops ;
struct rfkill * rfkill ;
struct work_struct rfkill_sync ;
2008-11-13 01:22:02 +03:00
/* 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 ] ;
/* 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 ;
2007-04-23 23:20:05 +04:00
/* wiphy index, internal only */
2009-02-21 08:04:19 +03:00
int wiphy_idx ;
2007-04-23 23:20:05 +04:00
/* associate netdev list */
struct mutex devlist_mtx ;
struct list_head netdev_list ;
2009-02-10 23:25:55 +03:00
/* BSSes/scanning */
spinlock_t bss_lock ;
struct list_head bss_list ;
struct rb_root bss_tree ;
u32 bss_generation ;
struct cfg80211_scan_request * scan_req ; /* protected by RTNL */
2009-02-12 01:14:43 +03:00
unsigned long suspend_at ;
2009-02-10 23:25:55 +03:00
2009-07-01 23:26:51 +04:00
# ifdef CONFIG_NL80211_TESTMODE
struct genl_info * testmode_info ;
# endif
2009-07-02 11:13:27 +04:00
struct work_struct conn_work ;
2009-05-19 05:43:52 +04:00
# ifdef CONFIG_CFG80211_DEBUGFS
2009-05-02 08:37:21 +04:00
/* Debugfs entries */
struct wiphy_debugfsdentries {
struct dentry * rts_threshold ;
struct dentry * fragmentation_threshold ;
struct dentry * short_retry_limit ;
struct dentry * long_retry_limit ;
2009-05-02 08:39:30 +04:00
struct dentry * ht40allow_map ;
2009-05-02 08:37:21 +04:00
} debugfs ;
# endif
2007-04-23 23:20:05 +04:00
/* must be last because of the way we do wiphy_priv(),
* and it should at least be aligned to NETDEV_ALIGN */
struct wiphy wiphy __attribute__ ( ( __aligned__ ( NETDEV_ALIGN ) ) ) ;
} ;
static inline
struct cfg80211_registered_device * wiphy_to_dev ( struct wiphy * wiphy )
{
BUG_ON ( ! wiphy ) ;
return container_of ( wiphy , struct cfg80211_registered_device , wiphy ) ;
}
2009-02-21 08:04:20 +03:00
/* Note 0 is valid, hence phy0 */
static inline
bool wiphy_idx_valid ( int wiphy_idx )
{
return ( wiphy_idx > = 0 ) ;
}
2009-02-21 08:04:21 +03:00
extern struct mutex cfg80211_mutex ;
2007-04-23 23:20:05 +04:00
extern struct list_head cfg80211_drv_list ;
2009-04-11 15:32:46 +04:00
# define assert_cfg80211_lock() WARN_ON(!mutex_is_locked(&cfg80211_mutex))
2009-02-21 08:04:25 +03:00
2009-02-21 08:04:26 +03:00
/*
* You can use this to mark a wiphy_idx as not having an associated wiphy .
* It guarantees cfg80211_drv_by_wiphy_idx ( wiphy_idx ) will return NULL
*/
# define WIPHY_IDX_STALE -1
2009-02-10 23:25:55 +03:00
struct cfg80211_internal_bss {
struct list_head list ;
struct rb_node rbn ;
unsigned long ts ;
struct kref ref ;
2009-07-02 19:20:43 +04:00
atomic_t hold ;
bool ies_allocated ;
2009-03-22 22:57:28 +03:00
2009-02-10 23:25:55 +03:00
/* must be last because of priv member */
struct cfg80211_bss pub ;
} ;
2009-07-02 19:20:43 +04:00
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 ) ;
}
static inline void cfg80211_unhold_bss ( struct cfg80211_internal_bss * bss )
{
int r = atomic_dec_return ( & bss - > hold ) ;
WARN_ON ( r < 0 ) ;
}
2009-02-21 08:04:26 +03:00
struct cfg80211_registered_device * cfg80211_drv_by_wiphy_idx ( int wiphy_idx ) ;
int get_wiphy_idx ( struct wiphy * wiphy ) ;
2009-03-24 11:35:46 +03:00
struct cfg80211_registered_device *
__cfg80211_drv_from_info ( struct genl_info * info ) ;
2007-09-20 21:09:35 +04:00
/*
* This function returns a pointer to the driver
* that the genl_info item that is passed refers to .
* If successful , it returns non - NULL and also locks
* the driver ' s mutex !
*
* This means that you need to call cfg80211_put_dev ( )
2009-02-21 08:04:21 +03:00
* before being allowed to acquire & cfg80211_mutex !
2007-09-20 21:09:35 +04:00
*
* This is necessary because we need to lock the global
* mutex to get an item off the list safely , and then
* we lock the drv mutex so it doesn ' t go away under us .
*
2009-02-21 08:04:21 +03:00
* We don ' t want to keep cfg80211_mutex locked
2007-09-20 21:09:35 +04:00
* for all the time in order to allow requests on
* other interfaces to go through at the same time .
*
* The result of this can be a PTR_ERR and hence must
* be checked with IS_ERR ( ) for errors .
*/
extern struct cfg80211_registered_device *
cfg80211_get_dev_from_info ( struct genl_info * info ) ;
2009-02-21 08:04:26 +03:00
/* requires cfg80211_drv_mutex to be held! */
struct wiphy * wiphy_idx_to_wiphy ( int wiphy_idx ) ;
2007-09-20 21:09:35 +04:00
/* identical to cfg80211_get_dev_from_info but only operate on ifindex */
extern struct cfg80211_registered_device *
cfg80211_get_dev_from_ifindex ( int ifindex ) ;
extern void cfg80211_put_dev ( struct cfg80211_registered_device * drv ) ;
2007-04-23 23:20:05 +04:00
/* free object */
extern void cfg80211_dev_free ( struct cfg80211_registered_device * drv ) ;
2007-09-20 21:09:35 +04:00
extern int cfg80211_dev_rename ( struct cfg80211_registered_device * drv ,
char * newname ) ;
2008-01-24 21:38:38 +03:00
void ieee80211_set_bitrate_flags ( struct wiphy * wiphy ) ;
2009-03-10 05:07:41 +03:00
void wiphy_update_regulatory ( struct wiphy * wiphy ,
enum nl80211_reg_initiator setby ) ;
2008-01-24 21:38:38 +03:00
2009-02-10 23:25:55 +03:00
void cfg80211_bss_expire ( struct cfg80211_registered_device * dev ) ;
2009-02-12 01:14:43 +03:00
void cfg80211_bss_age ( struct cfg80211_registered_device * dev ,
unsigned long age_secs ) ;
2009-02-10 23:25:55 +03:00
2009-04-19 23:24:32 +04:00
/* IBSS */
int cfg80211_join_ibss ( struct cfg80211_registered_device * rdev ,
struct net_device * dev ,
struct cfg80211_ibss_params * params ) ;
2009-04-20 20:43:46 +04:00
void cfg80211_clear_ibss ( struct net_device * dev , bool nowext ) ;
2009-04-19 23:24:32 +04:00
int cfg80211_leave_ibss ( struct cfg80211_registered_device * rdev ,
2009-04-20 20:43:46 +04:00
struct net_device * dev , bool nowext ) ;
2009-04-19 23:24:32 +04:00
2009-07-02 19:20:43 +04:00
/* MLME */
int cfg80211_mlme_auth ( struct cfg80211_registered_device * rdev ,
struct net_device * dev , struct ieee80211_channel * chan ,
enum nl80211_auth_type auth_type , const u8 * bssid ,
const u8 * ssid , int ssid_len ,
const u8 * ie , int ie_len ) ;
int cfg80211_mlme_assoc ( struct cfg80211_registered_device * rdev ,
struct net_device * dev , struct ieee80211_channel * chan ,
2009-07-07 16:37:26 +04:00
const u8 * bssid , const u8 * prev_bssid ,
const u8 * ssid , int ssid_len ,
2009-07-02 19:20:43 +04:00
const u8 * ie , int ie_len , bool use_mfp ,
struct cfg80211_crypto_settings * crypt ) ;
int cfg80211_mlme_deauth ( struct cfg80211_registered_device * rdev ,
struct net_device * dev , const u8 * bssid ,
const u8 * ie , int ie_len , u16 reason ) ;
int cfg80211_mlme_disassoc ( struct cfg80211_registered_device * rdev ,
struct net_device * dev , const u8 * bssid ,
const u8 * ie , int ie_len , u16 reason ) ;
void cfg80211_mlme_down ( struct cfg80211_registered_device * rdev ,
struct net_device * dev ) ;
2009-07-01 23:26:54 +04:00
/* SME */
int cfg80211_connect ( struct cfg80211_registered_device * rdev ,
struct net_device * dev ,
struct cfg80211_connect_params * connect ) ;
int cfg80211_disconnect ( struct cfg80211_registered_device * rdev ,
2009-07-01 23:26:56 +04:00
struct net_device * dev , u16 reason ,
bool wextev ) ;
2009-07-01 23:26:54 +04:00
2009-07-02 11:13:27 +04:00
void cfg80211_conn_work ( struct work_struct * work ) ;
2009-05-11 15:54:58 +04:00
/* internal helpers */
int cfg80211_validate_key_settings ( struct key_params * params , int key_idx ,
const u8 * mac_addr ) ;
2009-07-02 11:13:27 +04:00
void __cfg80211_disconnected ( struct net_device * dev , gfp_t gfp , u8 * ie ,
size_t ie_len , u16 reason , bool from_ap ) ;
void cfg80211_sme_scan_done ( struct net_device * dev ) ;
void cfg80211_sme_rx_auth ( struct net_device * dev , const u8 * buf , size_t len ) ;
2009-07-02 19:20:43 +04:00
void cfg80211_sme_disassoc ( struct net_device * dev , int idx ) ;
2009-05-11 15:54:58 +04:00
2007-04-23 23:20:05 +04:00
# endif /* __NET_WIRELESS_CORE_H */