2009-04-20 16:31:42 +04:00
# ifndef __NET_REGULATORY_H
# define __NET_REGULATORY_H
/*
* regulatory support structures
*
* Copyright 2008 - 2009 Luis R . Rodriguez < lrodriguez @ atheros . com >
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation .
*/
/**
* enum environment_cap - Environment parsed from country IE
* @ ENVIRON_ANY : indicates country IE applies to both indoor and
* outdoor operation .
* @ ENVIRON_INDOOR : indicates country IE applies only to indoor operation
* @ ENVIRON_OUTDOOR : indicates country IE applies only to outdoor operation
*/
enum environment_cap {
ENVIRON_ANY ,
ENVIRON_INDOOR ,
ENVIRON_OUTDOOR ,
} ;
/**
* struct regulatory_request - used to keep track of regulatory requests
*
* @ wiphy_idx : this is set if this request ' s initiator is
* % REGDOM_SET_BY_COUNTRY_IE or % REGDOM_SET_BY_DRIVER . This
* can be used by the wireless core to deal with conflicts
* and potentially inform users of which devices specifically
* cased the conflicts .
* @ initiator : indicates who sent this request , could be any of
* of those set in nl80211_reg_initiator ( % NL80211_REGDOM_SET_BY_ * )
* @ alpha2 : the ISO / IEC 3166 alpha2 country code of the requested
* regulatory domain . We have a few special codes :
* 00 - World regulatory domain
* 99 - built by driver but a specific alpha2 cannot be determined
* 98 - result of an intersection between two regulatory domains
2010-01-30 03:58:57 +03:00
* 97 - regulatory domain has not yet been configured
2009-04-20 16:31:42 +04:00
* @ intersect : indicates whether the wireless core should intersect
* the requested regulatory domain with the presently set regulatory
* domain .
2010-11-18 08:46:09 +03:00
* @ processed : indicates whether or not this requests has already been
* processed . When the last request is processed it means that the
* currently regulatory domain set on cfg80211 is updated from
* CRDA and can be used by other regulatory requests . When a
* the last request is not yet processed we must yield until it
* is processed before processing any new requests .
2009-04-20 16:31:42 +04:00
* @ country_ie_checksum : checksum of the last processed and accepted
* country IE
* @ country_ie_env : lets us know if the AP is telling us we are outdoor ,
* indoor , or if it doesn ' t matter
* @ list : used to insert into the reg_requests_list linked list
*/
struct regulatory_request {
int wiphy_idx ;
enum nl80211_reg_initiator initiator ;
char alpha2 [ 2 ] ;
bool intersect ;
2010-11-18 08:46:09 +03:00
bool processed ;
2009-04-20 16:31:42 +04:00
enum environment_cap country_ie_env ;
struct list_head list ;
} ;
struct ieee80211_freq_range {
u32 start_freq_khz ;
u32 end_freq_khz ;
u32 max_bandwidth_khz ;
} ;
struct ieee80211_power_rule {
u32 max_antenna_gain ;
u32 max_eirp ;
} ;
struct ieee80211_reg_rule {
struct ieee80211_freq_range freq_range ;
struct ieee80211_power_rule power_rule ;
u32 flags ;
} ;
struct ieee80211_regdomain {
u32 n_reg_rules ;
char alpha2 [ 2 ] ;
struct ieee80211_reg_rule reg_rules [ ] ;
} ;
# define MHZ_TO_KHZ(freq) ((freq) * 1000)
# define KHZ_TO_MHZ(freq) ((freq) / 1000)
# define DBI_TO_MBI(gain) ((gain) * 100)
# define MBI_TO_DBI(gain) ((gain) / 100)
# define DBM_TO_MBM(gain) ((gain) * 100)
# define MBM_TO_DBM(gain) ((gain) / 100)
# define REG_RULE(start, end, bw, gain, eirp, reg_flags) \
{ \
. freq_range . start_freq_khz = MHZ_TO_KHZ ( start ) , \
. freq_range . end_freq_khz = MHZ_TO_KHZ ( end ) , \
. freq_range . max_bandwidth_khz = MHZ_TO_KHZ ( bw ) , \
. power_rule . max_antenna_gain = DBI_TO_MBI ( gain ) , \
. power_rule . max_eirp = DBM_TO_MBM ( eirp ) , \
. flags = reg_flags , \
}
# endif