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 */ 21enum 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 */ 58struct 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 68struct ieee80211_freq_range { 69 u32 start_freq_khz; 70 u32 end_freq_khz; 71 u32 max_bandwidth_khz; 72}; 73 74struct ieee80211_power_rule { 75 u32 max_antenna_gain; 76 u32 max_eirp; 77}; 78 79struct ieee80211_reg_rule { 80 struct ieee80211_freq_range freq_range; 81 struct ieee80211_power_rule power_rule; 82 u32 flags; 83}; 84 85struct 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