2007-04-23 23:20:05 +04:00
# ifndef __NET_WIRELESS_H
# define __NET_WIRELESS_H
/*
* 802.11 device management
*
* Copyright 2007 Johannes Berg < johannes @ sipsolutions . net >
*/
# include <linux/netdevice.h>
# include <linux/debugfs.h>
# include <linux/list.h>
# include <net/cfg80211.h>
2008-01-24 21:38:38 +03:00
/**
* enum ieee80211_band - supported frequency bands
*
* The bands are assigned this way because the supported
* bitrates differ in these bands .
*
* @ IEEE80211_BAND_2GHZ : 2.4 GHz ISM band
* @ IEEE80211_BAND_5GHZ : around 5 GHz band ( 4.9 - 5.7 )
*/
enum ieee80211_band {
IEEE80211_BAND_2GHZ ,
IEEE80211_BAND_5GHZ ,
/* keep last */
IEEE80211_NUM_BANDS
} ;
/**
* enum ieee80211_channel_flags - channel flags
*
* Channel flags set by the regulatory control code .
*
* @ IEEE80211_CHAN_DISABLED : This channel is disabled .
* @ IEEE80211_CHAN_PASSIVE_SCAN : Only passive scanning is permitted
* on this channel .
* @ IEEE80211_CHAN_NO_IBSS : IBSS is not allowed on this channel .
* @ IEEE80211_CHAN_RADAR : Radar detection is required on this channel .
2008-05-29 12:35:23 +04:00
* @ IEEE80211_CHAN_NO_FAT_ABOVE : extension channel above this channel
* is not permitted .
* @ IEEE80211_CHAN_NO_FAT_BELOW : extension channel below this channel
* is not permitted .
2008-01-24 21:38:38 +03:00
*/
enum ieee80211_channel_flags {
IEEE80211_CHAN_DISABLED = 1 < < 0 ,
IEEE80211_CHAN_PASSIVE_SCAN = 1 < < 1 ,
IEEE80211_CHAN_NO_IBSS = 1 < < 2 ,
IEEE80211_CHAN_RADAR = 1 < < 3 ,
2008-05-29 12:35:23 +04:00
IEEE80211_CHAN_NO_FAT_ABOVE = 1 < < 4 ,
IEEE80211_CHAN_NO_FAT_BELOW = 1 < < 5 ,
2008-01-24 21:38:38 +03:00
} ;
/**
* struct ieee80211_channel - channel definition
*
* This structure describes a single channel for use
* with cfg80211 .
*
* @ center_freq : center frequency in MHz
2008-09-10 10:19:48 +04:00
* @ max_bandwidth : maximum allowed bandwidth for this channel , in MHz
2008-01-24 21:38:38 +03:00
* @ hw_value : hardware - specific value for the channel
* @ flags : channel flags from & enum ieee80211_channel_flags .
* @ orig_flags : channel flags at registration time , used by regulatory
* code to support devices with additional restrictions
* @ band : band this channel belongs to .
* @ max_antenna_gain : maximum antenna gain in dBi
* @ max_power : maximum transmission power ( in dBm )
* @ orig_mag : internal use
* @ orig_mpwr : internal use
*/
struct ieee80211_channel {
enum ieee80211_band band ;
u16 center_freq ;
2008-09-10 10:19:48 +04:00
u8 max_bandwidth ;
2008-01-24 21:38:38 +03:00
u16 hw_value ;
u32 flags ;
int max_antenna_gain ;
int max_power ;
u32 orig_flags ;
int orig_mag , orig_mpwr ;
} ;
/**
* enum ieee80211_rate_flags - rate flags
*
* Hardware / specification flags for rates . These are structured
* in a way that allows using the same bitrate structure for
* different bands / PHY modes .
*
* @ IEEE80211_RATE_SHORT_PREAMBLE : Hardware can send with short
* preamble on this bitrate ; only relevant in 2.4 GHz band and
* with CCK rates .
* @ IEEE80211_RATE_MANDATORY_A : This bitrate is a mandatory rate
* when used with 802.11 a ( on the 5 GHz band ) ; filled by the
* core code when registering the wiphy .
* @ IEEE80211_RATE_MANDATORY_B : This bitrate is a mandatory rate
* when used with 802.11 b ( on the 2.4 GHz band ) ; filled by the
* core code when registering the wiphy .
* @ IEEE80211_RATE_MANDATORY_G : This bitrate is a mandatory rate
* when used with 802.11 g ( on the 2.4 GHz band ) ; filled by the
* core code when registering the wiphy .
* @ IEEE80211_RATE_ERP_G : This is an ERP rate in 802.11 g mode .
*/
enum ieee80211_rate_flags {
IEEE80211_RATE_SHORT_PREAMBLE = 1 < < 0 ,
IEEE80211_RATE_MANDATORY_A = 1 < < 1 ,
IEEE80211_RATE_MANDATORY_B = 1 < < 2 ,
IEEE80211_RATE_MANDATORY_G = 1 < < 3 ,
IEEE80211_RATE_ERP_G = 1 < < 4 ,
} ;
/**
* struct ieee80211_rate - bitrate definition
*
* This structure describes a bitrate that an 802.11 PHY can
* operate with . The two values @ hw_value and @ hw_value_short
* are only for driver use when pointers to this structure are
* passed around .
*
* @ flags : rate - specific flags
* @ bitrate : bitrate in units of 100 Kbps
* @ hw_value : driver / hardware value for this rate
* @ hw_value_short : driver / hardware value for this rate when
* short preamble is used
*/
struct ieee80211_rate {
u32 flags ;
u16 bitrate ;
u16 hw_value , hw_value_short ;
} ;
/**
* struct ieee80211_ht_info - describing STA ' s HT capabilities
*
* This structure describes most essential parameters needed
* to describe 802.11 n HT capabilities for an STA .
*
* @ ht_supported : is HT supported by STA , 0 : no , 1 : yes
* @ cap : HT capabilities map as described in 802.11 n spec
* @ ampdu_factor : Maximum A - MPDU length factor
* @ ampdu_density : Minimum A - MPDU spacing
* @ supp_mcs_set : Supported MCS set as described in 802.11 n spec
*/
struct ieee80211_ht_info {
u16 cap ; /* use IEEE80211_HT_CAP_ */
u8 ht_supported ;
u8 ampdu_factor ;
u8 ampdu_density ;
u8 supp_mcs_set [ 16 ] ;
} ;
/**
* struct ieee80211_supported_band - frequency band definition
*
* This structure describes a frequency band a wiphy
* is able to operate in .
*
* @ channels : Array of channels the hardware can operate in
* in this band .
* @ band : the band this structure represents
* @ n_channels : Number of channels in @ channels
* @ bitrates : Array of bitrates the hardware can operate with
* in this band . Must be sorted to give a valid " supported
* rates " IE, i.e. CCK rates first, then OFDM.
* @ n_bitrates : Number of bitrates in @ bitrates
*/
struct ieee80211_supported_band {
struct ieee80211_channel * channels ;
struct ieee80211_rate * bitrates ;
enum ieee80211_band band ;
int n_channels ;
int n_bitrates ;
struct ieee80211_ht_info ht_info ;
} ;
2007-04-23 23:20:05 +04:00
/**
* struct wiphy - wireless hardware description
* @ idx : the wiphy index assigned to this item
* @ class_dev : the class device representing / sys / class / ieee80211 / < wiphy - name >
2008-09-10 10:19:48 +04:00
* @ reg_notifier : the driver ' s regulatory notification callback
2007-04-23 23:20:05 +04:00
*/
struct wiphy {
/* assign these fields before you register the wiphy */
/* permanent MAC address */
u8 perm_addr [ ETH_ALEN ] ;
2008-08-30 03:26:43 +04:00
/* Supported interface modes, OR together BIT(NL80211_IFTYPE_...) */
u16 interface_modes ;
2007-04-23 23:20:05 +04:00
/* If multiple wiphys are registered and you're handed e.g.
* a regular netdev with assigned ieee80211_ptr , you won ' t
* know whether it points to a wiphy your driver has registered
* or not . Assign this to something global to your driver to
* help determine whether you own this wiphy or not . */
void * privid ;
2008-01-24 21:38:38 +03:00
struct ieee80211_supported_band * bands [ IEEE80211_NUM_BANDS ] ;
2008-09-10 10:19:48 +04:00
/* Lets us get back the wiphy on the callback */
int ( * reg_notifier ) ( struct wiphy * wiphy , enum reg_set_by setby ) ;
2007-04-23 23:20:05 +04:00
/* fields below are read-only, assigned by cfg80211 */
/* the item in /sys/class/ieee80211/ points to this,
* you need use set_wiphy_dev ( ) ( see below ) */
struct device dev ;
/* dir in debugfs: ieee80211/<wiphyname> */
struct dentry * debugfsdir ;
char priv [ 0 ] __attribute__ ( ( __aligned__ ( NETDEV_ALIGN ) ) ) ;
} ;
/** struct wireless_dev - wireless per-netdev state
*
* This structure must be allocated by the driver / stack
* that uses the ieee80211_ptr field in struct net_device
* ( this is intentional so it can be allocated along with
* the netdev . )
*
* @ wiphy : pointer to hardware description
2008-09-16 16:55:09 +04:00
* @ iftype : interface type
2007-04-23 23:20:05 +04:00
*/
struct wireless_dev {
struct wiphy * wiphy ;
2008-09-16 16:55:09 +04:00
enum nl80211_iftype iftype ;
2007-04-23 23:20:05 +04:00
/* private to the generic wireless code */
struct list_head list ;
struct net_device * netdev ;
} ;
/**
* wiphy_priv - return priv from wiphy
*/
static inline void * wiphy_priv ( struct wiphy * wiphy )
{
BUG_ON ( ! wiphy ) ;
return & wiphy - > priv ;
}
/**
* set_wiphy_dev - set device pointer for wiphy
*/
static inline void set_wiphy_dev ( struct wiphy * wiphy , struct device * dev )
{
wiphy - > dev . parent = dev ;
}
/**
* wiphy_dev - get wiphy dev pointer
*/
static inline struct device * wiphy_dev ( struct wiphy * wiphy )
{
return wiphy - > dev . parent ;
}
/**
* wiphy_name - get wiphy name
*/
static inline char * wiphy_name ( struct wiphy * wiphy )
{
return wiphy - > dev . bus_id ;
}
/**
* wdev_priv - return wiphy priv from wireless_dev
*/
static inline void * wdev_priv ( struct wireless_dev * wdev )
{
BUG_ON ( ! wdev ) ;
return wiphy_priv ( wdev - > wiphy ) ;
}
/**
* wiphy_new - create a new wiphy for use with cfg80211
*
* create a new wiphy and associate the given operations with it .
* @ sizeof_priv bytes are allocated for private use .
*
* the returned pointer must be assigned to each netdev ' s
* ieee80211_ptr for proper operation .
*/
struct wiphy * wiphy_new ( struct cfg80211_ops * ops , int sizeof_priv ) ;
/**
* wiphy_register - register a wiphy with cfg80211
*
* register the given wiphy
*
* Returns a non - negative wiphy index or a negative error code .
*/
extern int wiphy_register ( struct wiphy * wiphy ) ;
/**
* wiphy_unregister - deregister a wiphy from cfg80211
*
* unregister a device with the given priv pointer .
* After this call , no more requests can be made with this priv
* pointer , but the call may sleep to wait for an outstanding
* request that is being handled .
*/
extern void wiphy_unregister ( struct wiphy * wiphy ) ;
/**
* wiphy_free - free wiphy
*/
extern void wiphy_free ( struct wiphy * wiphy ) ;
2008-01-24 21:38:38 +03:00
/**
* ieee80211_channel_to_frequency - convert channel number to frequency
*/
extern int ieee80211_channel_to_frequency ( int chan ) ;
/**
* ieee80211_frequency_to_channel - convert frequency to channel number
*/
extern int ieee80211_frequency_to_channel ( int freq ) ;
2008-03-26 16:14:55 +03:00
/*
* Name indirection necessary because the ieee80211 code also has
* a function named " ieee80211_get_channel " , so if you include
* cfg80211 ' s header file you get cfg80211 ' s version , if you try
* to include both header files you ' ll ( rightfully ! ) get a symbol
* clash .
*/
extern struct ieee80211_channel * __ieee80211_get_channel ( struct wiphy * wiphy ,
int freq ) ;
2008-09-15 15:11:19 +04:00
/**
* ieee80211_get_channel - get channel struct from wiphy for specified frequency
*/
static inline struct ieee80211_channel *
ieee80211_get_channel ( struct wiphy * wiphy , int freq )
{
return __ieee80211_get_channel ( wiphy , freq ) ;
}
2008-09-10 10:19:48 +04:00
/**
* __regulatory_hint - hint to the wireless core a regulatory domain
* @ wiphy : if a driver is providing the hint this is the driver ' s very
* own & struct wiphy
* @ alpha2 : the ISO / IEC 3166 alpha2 being claimed the regulatory domain
* should be in . If @ rd is set this should be NULL
* @ rd : a complete regulatory domain , if passed the caller need not worry
* about freeing it
*
* The Wireless subsystem can use this function to hint to the wireless core
* what it believes should be the current regulatory domain by
* giving it an ISO / IEC 3166 alpha2 country code it knows its regulatory
* domain should be in or by providing a completely build regulatory domain .
*
* Returns - EALREADY if * a regulatory domain * has already been set . Note that
* this could be by another driver . It is safe for drivers to continue if
* - EALREADY is returned , if drivers are not capable of world roaming they
* should not register more channels than they support . Right now we only
* support listening to the first driver hint . If the driver is capable
* of world roaming but wants to respect its own EEPROM mappings for
* specific regulatory domains it should register the @ reg_notifier callback
* on the & struct wiphy . Returns 0 if the hint went through fine or through an
* intersection operation . Otherwise a standard error code is returned .
*
*/
extern int __regulatory_hint ( struct wiphy * wiphy , enum reg_set_by set_by ,
const char * alpha2 , struct ieee80211_regdomain * rd ) ;
/**
* regulatory_hint - driver hint to the wireless core a regulatory domain
* @ wiphy : the driver ' s very own & struct wiphy
* @ alpha2 : the ISO / IEC 3166 alpha2 the driver claims its regulatory domain
* should be in . If @ rd is set this should be NULL . Note that if you
* set this to NULL you should still set rd - > alpha2 to some accepted
* alpha2 .
* @ rd : a complete regulatory domain provided by the driver . If passed
* the driver does not need to worry about freeing it .
*
* Wireless drivers can use this function to hint to the wireless core
* what it believes should be the current regulatory domain by
* giving it an ISO / IEC 3166 alpha2 country code it knows its regulatory
* domain should be in or by providing a completely build regulatory domain .
* If the driver provides an ISO / IEC 3166 alpha2 userspace will be queried
* for a regulatory domain structure for the respective country . If
* a regulatory domain is build and passed you should set the alpha2
* if possible , otherwise set it to the special value of " 99 " which tells
* the wireless core it is unknown . If you pass a built regulatory domain
* and we return non zero you are in charge of kfree ( ) ' ing the structure .
*
* See __regulatory_hint ( ) documentation for possible return values .
*/
extern int regulatory_hint ( struct wiphy * wiphy ,
const char * alpha2 , struct ieee80211_regdomain * rd ) ;
2007-04-23 23:20:05 +04:00
# endif /* __NET_WIRELESS_H */