2007-04-23 23:20:05 +04:00
/*
* Wireless configuration interface internals .
*
* Copyright 2006 , 2007 Johannes Berg < johannes @ sipsolutions . net >
*/
# 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>
2007-04-23 23:20:05 +04:00
# include <net/genetlink.h>
# include <net/wireless.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 {
struct cfg80211_ops * ops ;
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 ;
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
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-02-21 08:04:25 +03:00
static inline void assert_cfg80211_lock ( void )
{
2009-02-24 17:49:58 +03:00
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-04-16 17:00:58 +04:00
bool hold , 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-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
2007-04-23 23:20:05 +04:00
# endif /* __NET_WIRELESS_CORE_H */