1 #ifndef __NET_REGULATORY_H 2 #define __NET_REGULATORY_H 3 /* 4 * regulatory support structures 5 * 6 * Copyright 2008-2009 Luis R. Rodriguez <lrodriguez@atheros.com> 7 * 8 * This program is free software; you can redistribute it and/or modify 9 * it under the terms of the GNU General Public License version 2 as 10 * published by the Free Software Foundation. 11 */ 12 13 14 /** 15 * enum environment_cap - Environment parsed from country IE 16 * @ENVIRON_ANY: indicates country IE applies to both indoor and 17 * outdoor operation. 18 * @ENVIRON_INDOOR: indicates country IE applies only to indoor operation 19 * @ENVIRON_OUTDOOR: indicates country IE applies only to outdoor operation 20 */ 21 enum environment_cap { 22 ENVIRON_ANY, 23 ENVIRON_INDOOR, 24 ENVIRON_OUTDOOR, 25 }; 26 27 /** 28 * struct regulatory_request - used to keep track of regulatory requests 29 * 30 * @wiphy_idx: this is set if this request's initiator is 31 * %REGDOM_SET_BY_COUNTRY_IE or %REGDOM_SET_BY_DRIVER. This 32 * can be used by the wireless core to deal with conflicts 33 * and potentially inform users of which devices specifically 34 * cased the conflicts. 35 * @initiator: indicates who sent this request, could be any of 36 * of those set in nl80211_reg_initiator (%NL80211_REGDOM_SET_BY_*) 37 * @alpha2: the ISO / IEC 3166 alpha2 country code of the requested 38 * regulatory domain. We have a few special codes: 39 * 00 - World regulatory domain 40 * 99 - built by driver but a specific alpha2 cannot be determined 41 * 98 - result of an intersection between two regulatory domains 42 * 97 - regulatory domain has not yet been configured 43 * @intersect: indicates whether the wireless core should intersect 44 * the requested regulatory domain with the presently set regulatory 45 * domain. 46 * @processed: indicates whether or not this requests has already been 47 * processed. When the last request is processed it means that the 48 * currently regulatory domain set on cfg80211 is updated from 49 * CRDA and can be used by other regulatory requests. When a 50 * the last request is not yet processed we must yield until it 51 * is processed before processing any new requests. 52 * @country_ie_checksum: checksum of the last processed and accepted 53 * country IE 54 * @country_ie_env: lets us know if the AP is telling us we are outdoor, 55 * indoor, or if it doesn't matter 56 * @list: used to insert into the reg_requests_list linked list 57 */ 58 struct regulatory_request { 59 int wiphy_idx; 60 enum nl80211_reg_initiator initiator; 61 char alpha2[2]; 62 bool intersect; 63 bool processed; 64 enum environment_cap country_ie_env; 65 struct list_head list; 66 }; 67 68 struct ieee80211_freq_range { 69 u32 start_freq_khz; 70 u32 end_freq_khz; 71 u32 max_bandwidth_khz; 72 }; 73 74 struct ieee80211_power_rule { 75 u32 max_antenna_gain; 76 u32 max_eirp; 77 }; 78 79 struct ieee80211_reg_rule { 80 struct ieee80211_freq_range freq_range; 81 struct ieee80211_power_rule power_rule; 82 u32 flags; 83 }; 84 85 struct ieee80211_regdomain { 86 u32 n_reg_rules; 87 char alpha2[2]; 88 struct ieee80211_reg_rule reg_rules[]; 89 }; 90 91 #define MHZ_TO_KHZ(freq) ((freq) * 1000) 92 #define KHZ_TO_MHZ(freq) ((freq) / 1000) 93 #define DBI_TO_MBI(gain) ((gain) * 100) 94 #define MBI_TO_DBI(gain) ((gain) / 100) 95 #define DBM_TO_MBM(gain) ((gain) * 100) 96 #define MBM_TO_DBM(gain) ((gain) / 100) 97 98 #define REG_RULE(start, end, bw, gain, eirp, reg_flags) \ 99 { \ 100 .freq_range.start_freq_khz = MHZ_TO_KHZ(start), \ 101 .freq_range.end_freq_khz = MHZ_TO_KHZ(end), \ 102 .freq_range.max_bandwidth_khz = MHZ_TO_KHZ(bw), \ 103 .power_rule.max_antenna_gain = DBI_TO_MBI(gain),\ 104 .power_rule.max_eirp = DBM_TO_MBM(eirp), \ 105 .flags = reg_flags, \ 106 } 107 108 #endif 109