Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
Data Structures | Macros | Functions | Variables
reg.c File Reference
#include <linux/kernel.h>
#include <linux/export.h>
#include <linux/slab.h>
#include <linux/list.h>
#include <linux/random.h>
#include <linux/ctype.h>
#include <linux/nl80211.h>
#include <linux/platform_device.h>
#include <linux/moduleparam.h>
#include <net/cfg80211.h>
#include "core.h"
#include "reg.h"
#include "regdb.h"
#include "nl80211.h"

Go to the source code of this file.

Data Structures

struct  reg_beacon
 

Macros

#define pr_fmt(fmt)   KBUILD_MODNAME ": " fmt
 
#define REG_DBG_PRINT(args...)
 
#define ONE_GHZ_IN_KHZ   1000000
 
#define REG_INTERSECT   1
 

Functions

 module_param (ieee80211_regdom, charp, 0444)
 
 MODULE_PARM_DESC (ieee80211_regdom,"IEEE 802.11 regulatory domain code")
 
bool is_world_regdom (const char *alpha2)
 
bool reg_is_valid_request (const char *alpha2)
 
int freq_reg_info (struct wiphy *wiphy, u32 center_freq, u32 desired_bw_khz, const struct ieee80211_reg_rule **reg_rule)
 
 EXPORT_SYMBOL (freq_reg_info)
 
bool reg_last_request_cell_base (void)
 
void wiphy_apply_custom_regulatory (struct wiphy *wiphy, const struct ieee80211_regdomain *regd)
 
 EXPORT_SYMBOL (wiphy_apply_custom_regulatory)
 
int regulatory_hint_user (const char *alpha2, enum nl80211_user_reg_hint_type user_reg_hint_type)
 
int regulatory_hint (struct wiphy *wiphy, const char *alpha2)
 
 EXPORT_SYMBOL (regulatory_hint)
 
void regulatory_hint_11d (struct wiphy *wiphy, enum ieee80211_band band, u8 *country_ie, u8 country_ie_len)
 
void regulatory_hint_disconnect (void)
 
int regulatory_hint_found_beacon (struct wiphy *wiphy, struct ieee80211_channel *beacon_chan, gfp_t gfp)
 
bool reg_supported_dfs_region (u8 dfs_region)
 
int set_regdom (const struct ieee80211_regdomain *rd)
 
int reg_device_uevent (struct device *dev, struct kobj_uevent_env *env)
 
void wiphy_regulatory_register (struct wiphy *wiphy)
 
void wiphy_regulatory_deregister (struct wiphy *wiphy)
 
int __init regulatory_init (void)
 
void regulatory_exit (void)
 

Variables

struct ieee80211_regdomaincfg80211_regdomain
 

Macro Definition Documentation

#define ONE_GHZ_IN_KHZ   1000000
#define pr_fmt (   fmt)    KBUILD_MODNAME ": " fmt

DOC: Wireless regulatory infrastructure

The usual implementation is for a driver to read a device EEPROM to determine which regulatory domain it should be operating under, then looking up the allowable channels in a driver-local table and finally registering those channels in the wiphy structure.

Another set of compliance enforcement is for drivers to use their own compliance limits which can be stored on the EEPROM. The host driver or firmware may ensure these are used.

In addition to all this we provide an extra layer of regulatory conformance. For drivers which do not have any regulatory information CRDA provides the complete regulatory solution. For others it provides a community effort on further restrictions to enhance compliance.

Note: When number of rules –> infinity we will not be able to index on alpha2 any more, instead we'll probably have to rely on some SHA1 checksum of the regdomain for example.

Definition at line 45 of file reg.c.

#define REG_DBG_PRINT (   args...)

Definition at line 66 of file reg.c.

#define REG_INTERSECT   1

Definition at line 1378 of file reg.c.

Function Documentation

EXPORT_SYMBOL ( freq_reg_info  )
EXPORT_SYMBOL ( wiphy_apply_custom_regulatory  )
EXPORT_SYMBOL ( regulatory_hint  )
int freq_reg_info ( struct wiphy wiphy,
u32  center_freq,
u32  desired_bw_khz,
const struct ieee80211_reg_rule **  reg_rule 
)

freq_reg_info - get regulatory information for the given frequency : the wiphy for which we want to process this rule for : Frequency in KHz for which we want regulatory information for : the desired max bandwidth you want to use per channel. Note that this is still 20 MHz if you want to use HT40 as HT40 makes use of two channels for its 40 MHz width bandwidth. If set to 0 we'll assume you want the standard 20 MHz. : the regulatory rule which we have for this frequency

Use this function to get the regulatory rule for a specific frequency on a given wireless device. If the device has a specific regulatory domain it wants to follow we respect that unless a country IE has been received and processed already.

Returns 0 if it was able to find a valid regulatory rule which does apply to the given center_freq otherwise it returns non-zero. It will also return -ERANGE if we determine the given center_freq does not even have a regulatory rule for a frequency range in the center_freq's band. See freq_in_rule_band() for our current definition of a band – this is purely subjective and right now its 802.11 specific.

Definition at line 762 of file reg.c.

bool is_world_regdom ( const char alpha2)

Definition at line 218 of file reg.c.

module_param ( ieee80211_regdom  ,
charp  ,
0444   
)
MODULE_PARM_DESC ( ieee80211_regdom  ,
"IEEE 802.11 regulatory domain code  
)
int reg_device_uevent ( struct device dev,
struct kobj_uevent_env env 
)

Definition at line 2381 of file reg.c.

bool reg_is_valid_request ( const char alpha2)

Definition at line 438 of file reg.c.

bool reg_last_request_cell_base ( void  )

Definition at line 960 of file reg.c.

bool reg_supported_dfs_region ( u8  dfs_region)

Definition at line 2127 of file reg.c.

void regulatory_exit ( void  )

Definition at line 2484 of file reg.c.

int regulatory_hint ( struct wiphy wiphy,
const char alpha2 
)

DOC: Regulatory enforcement infrastructure

TODO regulatory_hint - driver hint to the wireless core a regulatory domain : the wireless device giving the hint (used only for reporting conflicts) : the ISO/IEC 3166 alpha2 the driver claims its regulatory domain should be in. If is set this should be NULL. Note that if you set this to NULL you should still set rd->alpha2 to some accepted alpha2.

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.

The wiphy must have been registered to cfg80211 prior to this call. For cfg80211 drivers this means you must first use wiphy_register(), for mac80211 drivers you must first use ieee80211_register_hw().

Drivers should check the return value, its possible you can get an -ENOMEM.

Definition at line 1767 of file reg.c.

void regulatory_hint_11d ( struct wiphy wiphy,
enum ieee80211_band  band,
u8 country_ie,
u8  country_ie_len 
)

regulatory_hint_11d - hints a country IE as a regulatory domain : the wireless device giving the hint (used only for reporting conflicts) : the band on which the country IE was received on. This determines the band we'll process the country IE channel triplets for. : pointer to the country IE : length of the country IE

We will intersect the rd with the what CRDA tells us should apply for the alpha2 this country IE belongs to, this prevents APs from sending us incorrect or outdated information against a country.

The AP is expected to provide Country IE channel triplets for the band it is on. It is technically possible for APs to send channel country IE triplets even for channels outside of the band they are in but for that they would have to use the regulatory extension in combination with a triplet but this behaviour is currently not observed. For this reason if a triplet is seen with channel information for a band the BSS is not present in it will be ignored.

Definition at line 1797 of file reg.c.

void regulatory_hint_disconnect ( void  )

regulatory_hint_disconnect - informs all devices have been disconneted

Regulotory rules can be enhanced further upon scanning and upon connection to an AP. These rules become stale if we disconnect and go to another country, whether or not we suspend and resume. If we suspend, go to another country and resume we'll automatically get disconnected shortly after resuming and things will be reset as well. This routine is a helper to restore regulatory settings to how they were prior to our first connect attempt. This includes ignoring country IE and beacon regulatory hints. The ieee80211_regdom module parameter will always be respected but if a user had set the regulatory domain that will take precedence.

Must be called from process context.

Definition at line 2038 of file reg.c.

int regulatory_hint_found_beacon ( struct wiphy wiphy,
struct ieee80211_channel beacon_chan,
gfp_t  gfp 
)

regulatory_hint_found_beacon - hints a beacon was found on a channel : the wireless device where the beacon was found on : the channel on which the beacon was found on : context flags

This informs the wireless core that a beacon from an AP was found on the channel provided. This allows the wireless core to make educated guesses on regulatory to help with world roaming. This is only used for world roaming – when we do not know our current location. This is only useful on channels 12, 13 and 14 on the 2 GHz band as channels 1-11 are already enabled by the world regulatory domain; and on non-radar 5 GHz channels.

Drivers do not need to call this, cfg80211 will do it for after a scan on a newly found BSS. If you cannot make use of this feature you can set the wiphy->disable_beacon_hints to true.

Definition at line 2054 of file reg.c.

int regulatory_hint_user ( const char alpha2,
enum nl80211_user_reg_hint_type  user_reg_hint_type 
)

Definition at line 1744 of file reg.c.

int __init regulatory_init ( void  )

Definition at line 2434 of file reg.c.

int set_regdom ( const struct ieee80211_regdomain rd)

Definition at line 2331 of file reg.c.

void wiphy_apply_custom_regulatory ( struct wiphy wiphy,
const struct ieee80211_regdomain regd 
)

wiphy_apply_custom_regulatory - apply a custom driver regulatory domain : the wireless device we want to process the regulatory domain on : the custom regulatory domain to use for this wiphy

Drivers can sometimes have custom regulatory domains which do not apply to a specific country. Drivers can use this to apply such custom regulatory domains. This routine must be called prior to wiphy registration. The custom regulatory domain will be trusted completely and as such previous default channel settings will be disregarded. If no rule is found for a channel on the regulatory domain the channel will be disabled.

Definition at line 1351 of file reg.c.

void wiphy_regulatory_deregister ( struct wiphy wiphy)

Definition at line 2402 of file reg.c.

void wiphy_regulatory_register ( struct wiphy wiphy)

Definition at line 2387 of file reg.c.

Variable Documentation

struct ieee80211_regdomain* cfg80211_regdomain

Definition at line 93 of file reg.c.