Blame view

include/net/regulatory.h 4.28 KB
d32365537   Johannes Berg   cfg80211: clean u...
1
2
3
4
5
  #ifndef __NET_REGULATORY_H
  #define __NET_REGULATORY_H
  /*
   * regulatory support structures
   *
dde88b736   Luis R. Rodriguez   wireless: relicen...
6
   * Copyright 2008-2009	Luis R. Rodriguez <mcgrof@qca.qualcomm.com>
d32365537   Johannes Berg   cfg80211: clean u...
7
   *
dde88b736   Luis R. Rodriguez   wireless: relicen...
8
9
10
11
12
13
14
15
16
17
18
   * Permission to use, copy, modify, and/or distribute this software for any
   * purpose with or without fee is hereby granted, provided that the above
   * copyright notice and this permission notice appear in all copies.
   *
   * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
   * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
   * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
   * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
   * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
   * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
   * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
d32365537   Johannes Berg   cfg80211: clean u...
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
   */
  
  
  /**
   * 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
09d989d17   Luis R. Rodriguez   cfg80211: add reg...
50
   *	97 - regulatory domain has not yet been configured
b68e6b3b3   Luis R. Rodriguez   cfg80211: pass DF...
51
52
53
54
   * @dfs_region: If CRDA responded with a regulatory domain that requires
   *	DFS master operation on a known DFS region (NL80211_DFS_*),
   *	dfs_region represents that region. Drivers can use this and the
   *	@alpha2 to adjust their device's DFS parameters as required.
d32365537   Johannes Berg   cfg80211: clean u...
55
56
57
   * @intersect: indicates whether the wireless core should intersect
   * 	the requested regulatory domain with the presently set regulatory
   * 	domain.
b2e253cf3   Luis R. Rodriguez   cfg80211: Fix reg...
58
59
60
61
62
63
   * @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.
d32365537   Johannes Berg   cfg80211: clean u...
64
65
66
67
68
69
70
71
72
73
   * @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];
b68e6b3b3   Luis R. Rodriguez   cfg80211: pass DF...
74
  	u8 dfs_region;
d32365537   Johannes Berg   cfg80211: clean u...
75
  	bool intersect;
b2e253cf3   Luis R. Rodriguez   cfg80211: Fix reg...
76
  	bool processed;
d32365537   Johannes Berg   cfg80211: clean u...
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
  	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];
8b60b0780   Luis R. Rodriguez   cfg80211: process...
101
  	u8 dfs_region;
d32365537   Johannes Berg   cfg80211: clean u...
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
  	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