2008-09-10 08:19:48 +02:00
|
|
|
#ifndef __NET_WIRELESS_REG_H
|
|
|
|
#define __NET_WIRELESS_REG_H
|
2017-09-13 22:21:08 +02:00
|
|
|
|
|
|
|
#include <net/cfg80211.h>
|
|
|
|
|
cfg80211: relicense reg.c reg.h and genregdb.awk to ISC
Following the tradition we have had with ath5k, ath9k, CRDA,
wireless-regdb I'd like to license this code under the permissive ISC
license for the code sharing purposes with other OSes, it'd sure be nice
to help the landscape in this area. Although I am %82.89 owner of the
regulatory code I have asked every contributor to the regulatory code
and have receieved positive Acked-bys from everyone except two deceased
entities:
o Frans Pop RIP 2010 [0]
- Frans Pop <elendil@planet.nl>
- Frans Pop <fjp@debian.org>
o Nokia RIP February, 11, 2011 [1], [2]
- ext-yuri.ershov@nokia.com
- kalle.valo@nokia.com
Frans Pop's contribution was a simple patch 55f98938, titled,
"wireless: remove trailing space in messages" which just add a \n
to some printk lines. I'm going to treat these additions as
uncopyrightable.
As for the contributions made by employees on behalf of Nokia
my contact point was Petri Karhula <petri.karhula@nokia.com> but
after one month he noted he had not been able to get traction from the
legal department on this request, as such it I proceeded by replacing
their contributions in previous patches.
The end goal is to help a clean rewrite that starts in userspace
that is shared under ISC license which currently is taking place with
the regulatory simulator [3].
[0] http://lists.debian.org/debian-devel/2011/12/msg00263.html
[1] http://press.nokia.com/2011/02/11/nokia-outlines-new-strategy-introduces-new-leadership-operational-structure/
[2] http://NokiaPlanB.com
[3] git://github.com/mcgrof/regsim.git
Acked-by: Thadeu Lima de Souza Cascardo <cascardo@holoscopio.com>
Acked-by: Dan Carpenter <error27@gmail.com>
Acked-by: Mihai Moldovan <ionic@ionic.de>
Acked-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
Acked-by: Sven Neumann <s.neumann@raumfeld.com>
Acked-by: Johannes Berg <johannes@sipsolutions.net>
Acked-by: Tomas Winkler <tomas.winkler@intel.com>
Acked-by: Tony Vroon <tony@linx.net>
Acked-by: Pavel Roskin <proski@gnu.org>
Acked-by: Bob Copeland <me@bobcopeland.com>
Acked-by: Lucas De Marchi <lucas.demarchi@profusion.mobi>
Acked-by: Pat Erley <pat-lkml@erley.org>
Acked-by: Tejun Heo <tj@kernel.org>
Acked-by: John W. Linville <linville@tuxdriver.com>
Acked-by: Chris Wright <chrisw@sous-sol.org>
Acked-by: Joe Perches <joe@perches.com>
Acked-by: Paul Gortmaker <paul.gortmaker@windriver.com>
Acked-by: John Gordon <john@devicescape.com>
Acked-by: Simon Barber <protocolmagic@gmail.com>
Acked-by: Rajkumar Manoharan <rmanohar@qca.qualcomm.com>
Acked-by: Jiri Benc <jbenc@upir.cz>
Acked-by: Bruno Randolf <br1@einfach.org>
Acked-by: Scott James Remnant <keybuk@google.com>
Acked-by: Roel Kluin <roel.kluin@gmail.com>
Signed-off-by: Luis R. Rodriguez <mcgrof@qca.qualcomm.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
2011-12-20 21:23:38 +01:00
|
|
|
/*
|
|
|
|
* Copyright 2008-2011 Luis R. Rodriguez <mcgrof@qca.qualcomm.com>
|
|
|
|
*
|
|
|
|
* 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.
|
|
|
|
*/
|
2008-09-10 08:19:48 +02:00
|
|
|
|
2015-03-30 14:15:49 +02:00
|
|
|
enum ieee80211_regd_source {
|
|
|
|
REGD_SOURCE_INTERNAL_DB,
|
|
|
|
REGD_SOURCE_CRDA,
|
|
|
|
};
|
|
|
|
|
2012-12-06 15:47:38 +01:00
|
|
|
extern const struct ieee80211_regdomain __rcu *cfg80211_regdomain;
|
2009-01-30 18:26:42 +01:00
|
|
|
|
2013-11-05 18:18:01 +01:00
|
|
|
bool reg_is_valid_request(const char *alpha2);
|
2008-09-15 11:10:52 +02:00
|
|
|
bool is_world_regdom(const char *alpha2);
|
2013-11-13 18:54:02 +01:00
|
|
|
bool reg_supported_dfs_region(enum nl80211_dfs_regions dfs_region);
|
2013-11-25 20:56:09 +01:00
|
|
|
enum nl80211_dfs_regions reg_get_dfs_region(struct wiphy *wiphy);
|
2008-09-10 08:19:48 +02:00
|
|
|
|
2012-07-12 20:49:18 +02:00
|
|
|
int regulatory_hint_user(const char *alpha2,
|
|
|
|
enum nl80211_user_reg_hint_type user_reg_hint_type);
|
cfg80211: Add API to change the indoor regulatory setting
Previously, the indoor setting configuration assumed that as
long as a station interface is connected, the indoor environment
setting does not change. However, this assumption is problematic
as:
- It is possible that a station interface is connected to a mobile
AP, e.g., softAP or a P2P GO, where it is possible that both the
station and the mobile AP move out of the indoor environment making
the indoor setting invalid. In such a case, user space has no way to
invalidate the setting.
- A station interface disconnection does not necessarily imply that
the device is no longer operating in an indoor environment, e.g.,
it is possible that the station interface is roaming but is still
stays indoor.
To handle the above, extend the indoor configuration API to allow
user space to indicate a change of indoor settings, and allow it to
indicate weather it controls the indoor setting, such that:
1. If the user space process explicitly indicates that it is going
to control the indoor setting, do not clear the indoor setting
internally, unless the socket is released. The user space process
should use the NL80211_ATTR_SOCKET_OWNER attribute in the command
to state that it is going to control the indoor setting.
2. Reset the indoor setting when restoring the regulatory settings in
case it is not owned by a user space process.
Based on the above, a user space tool that continuously monitors the
indoor settings, i.e., tracking power setting, location etc., can
indicate environment changes to the regulatory core.
It should be noted that currently user space is the only provided mechanism
used to hint to the regulatory core over the indoor/outdoor environment --
while the country IEs do have an environment setting this has been completely
ignored by the regulatory core by design for a while now since country IEs
typically can contain bogus data.
Acked-by: Luis R. Rodriguez <mcgrof@suse.com>
Signed-off-by: ArikX Nemtsov <arik@wizery.com>
Signed-off-by: Ilan Peer <ilan.peer@intel.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
2015-03-04 06:32:06 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* regulatory_hint_indoor - hint operation in indoor env. or not
|
|
|
|
* @is_indoor: if true indicates that user space thinks that the
|
|
|
|
* device is operating in an indoor environment.
|
|
|
|
* @portid: the netlink port ID on which the hint was given.
|
|
|
|
*/
|
|
|
|
int regulatory_hint_indoor(bool is_indoor, u32 portid);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* regulatory_netlink_notify - notify on released netlink socket
|
|
|
|
* @portid: the netlink socket port ID
|
|
|
|
*/
|
|
|
|
void regulatory_netlink_notify(u32 portid);
|
2009-02-21 06:04:30 +01:00
|
|
|
|
2012-07-12 20:49:18 +02:00
|
|
|
void wiphy_regulatory_register(struct wiphy *wiphy);
|
2012-07-12 20:49:19 +02:00
|
|
|
void wiphy_regulatory_deregister(struct wiphy *wiphy);
|
2008-11-12 23:22:02 +01:00
|
|
|
|
2010-06-18 09:38:55 +02:00
|
|
|
int __init regulatory_init(void);
|
2008-09-10 08:19:48 +02:00
|
|
|
void regulatory_exit(void);
|
|
|
|
|
2015-03-30 14:15:49 +02:00
|
|
|
int set_regdom(const struct ieee80211_regdomain *rd,
|
|
|
|
enum ieee80211_regd_source regd_src);
|
|
|
|
|
cfg80211: regulatory introduce maximum bandwidth calculation
In case we will get regulatory request with rule
where max_bandwidth_khz is set to 0 handle this
case as a special one.
If max_bandwidth_khz == 0 we should calculate maximum
available bandwidth base on all frequency contiguous rules.
In case we need auto calculation we just have to set:
country PL: DFS-ETSI
(2402 - 2482 @ 40), (N/A, 20)
(5170 - 5250 @ AUTO), (N/A, 20)
(5250 - 5330 @ AUTO), (N/A, 20), DFS
(5490 - 5710 @ 80), (N/A, 27), DFS
This mean we will calculate maximum bw for rules where
AUTO (N/A) were set, 160MHz (5330 - 5170) in example above.
So we will get:
(5170 - 5250 @ 160), (N/A, 20)
(5250 - 5330 @ 160), (N/A, 20), DFS
In other case:
country FR: DFS-ETSI
(2402 - 2482 @ 40), (N/A, 20)
(5170 - 5250 @ AUTO), (N/A, 20)
(5250 - 5330 @ 80), (N/A, 20), DFS
(5490 - 5710 @ 80), (N/A, 27), DFS
We will get 80MHz (5250 - 5170):
(5170 - 5250 @ 80), (N/A, 20)
(5250 - 5330 @ 80), (N/A, 20), DFS
Base on this calculations we will set correct channel
bandwidth flags (eg. IEEE80211_CHAN_NO_80MHZ).
We don't need any changes in CRDA or internal regulatory.
Signed-off-by: Janusz Dziedzic <janusz.dziedzic@tieto.com>
[extend nl80211 description a bit, fix typo]
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
2014-01-30 09:52:20 +01:00
|
|
|
unsigned int reg_get_max_bandwidth(const struct ieee80211_regdomain *rd,
|
|
|
|
const struct ieee80211_reg_rule *rule);
|
2011-08-30 23:38:53 +02:00
|
|
|
|
2012-07-12 20:49:18 +02:00
|
|
|
bool reg_last_request_cell_base(void);
|
2014-12-15 18:25:59 +01:00
|
|
|
const struct ieee80211_regdomain *get_wiphy_regdom(struct wiphy *wiphy);
|
2008-09-10 08:19:48 +02:00
|
|
|
|
2009-02-21 06:20:39 +01:00
|
|
|
/**
|
|
|
|
* regulatory_hint_found_beacon - hints a beacon was found on a channel
|
|
|
|
* @wiphy: the wireless device where the beacon was found on
|
|
|
|
* @beacon_chan: the channel on which the beacon was found on
|
|
|
|
* @gfp: 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
|
2009-07-31 02:43:48 +02:00
|
|
|
* on a newly found BSS. If you cannot make use of this feature you can
|
|
|
|
* set the wiphy->disable_beacon_hints to true.
|
2009-02-21 06:20:39 +01:00
|
|
|
*/
|
|
|
|
int regulatory_hint_found_beacon(struct wiphy *wiphy,
|
2012-12-03 17:21:11 +01:00
|
|
|
struct ieee80211_channel *beacon_chan,
|
|
|
|
gfp_t gfp);
|
2009-02-21 06:20:39 +01:00
|
|
|
|
2009-07-31 02:38:09 +02:00
|
|
|
/**
|
2013-10-05 03:07:24 +02:00
|
|
|
* regulatory_hint_country_ie - hints a country IE as a regulatory domain
|
2009-07-31 02:38:09 +02:00
|
|
|
* @wiphy: the wireless device giving the hint (used only for reporting
|
|
|
|
* conflicts)
|
2010-01-15 02:08:20 +01:00
|
|
|
* @band: the band on which the country IE was received on. This determines
|
|
|
|
* the band we'll process the country IE channel triplets for.
|
2009-07-31 02:38:09 +02:00
|
|
|
* @country_ie: pointer to the country IE
|
|
|
|
* @country_ie_len: 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.
|
2010-01-15 02:08:20 +01:00
|
|
|
*
|
|
|
|
* 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.
|
2009-07-31 02:38:09 +02:00
|
|
|
*/
|
2013-10-05 03:07:24 +02:00
|
|
|
void regulatory_hint_country_ie(struct wiphy *wiphy,
|
2016-04-12 15:56:15 +02:00
|
|
|
enum nl80211_band band,
|
2012-11-29 01:25:20 +01:00
|
|
|
const u8 *country_ie,
|
2009-07-31 02:38:09 +02:00
|
|
|
u8 country_ie_len);
|
|
|
|
|
2010-01-30 01:58:57 +01:00
|
|
|
/**
|
|
|
|
* 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.
|
|
|
|
*/
|
|
|
|
void regulatory_hint_disconnect(void);
|
|
|
|
|
2014-02-23 08:13:01 +01:00
|
|
|
/**
|
|
|
|
* cfg80211_get_unii - get the U-NII band for the frequency
|
|
|
|
* @freq: the frequency for which we want to get the UNII band.
|
|
|
|
|
|
|
|
* Get a value specifying the U-NII band frequency belongs to.
|
|
|
|
* U-NII bands are defined by the FCC in C.F.R 47 part 15.
|
|
|
|
*
|
|
|
|
* Returns -EINVAL if freq is invalid, 0 for UNII-1, 1 for UNII-2A,
|
|
|
|
* 2 for UNII-2B, 3 for UNII-2C and 4 for UNII-3.
|
|
|
|
*/
|
|
|
|
int cfg80211_get_unii(int freq);
|
|
|
|
|
2014-02-23 08:13:03 +01:00
|
|
|
/**
|
|
|
|
* regulatory_indoor_allowed - is indoor operation allowed
|
|
|
|
*/
|
|
|
|
bool regulatory_indoor_allowed(void);
|
|
|
|
|
2017-02-27 12:34:33 +01:00
|
|
|
/*
|
|
|
|
* Grace period to timeout pre-CAC results on the dfs channels. This timeout
|
|
|
|
* value is used for Non-ETSI domain.
|
|
|
|
* TODO: May be make this timeout available through regdb?
|
|
|
|
*/
|
|
|
|
#define REG_PRE_CAC_EXPIRY_GRACE_MS 2000
|
|
|
|
|
|
|
|
/**
|
|
|
|
* regulatory_pre_cac_allowed - if pre-CAC allowed in the current dfs domain
|
|
|
|
* @wiphy: wiphy for which pre-CAC capability is checked.
|
|
|
|
|
|
|
|
* Pre-CAC is allowed only in ETSI domain.
|
|
|
|
*/
|
|
|
|
bool regulatory_pre_cac_allowed(struct wiphy *wiphy);
|
2017-02-27 12:34:35 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* regulatory_propagate_dfs_state - Propagate DFS channel state to other wiphys
|
|
|
|
* @wiphy - wiphy on which radar is detected and the event will be propagated
|
|
|
|
* to other available wiphys having the same DFS domain
|
|
|
|
* @chandef - Channel definition of radar detected channel
|
|
|
|
* @dfs_state - DFS channel state to be set
|
|
|
|
* @event - Type of radar event which triggered this DFS state change
|
|
|
|
*
|
|
|
|
* This function should be called with rtnl lock held.
|
|
|
|
*/
|
|
|
|
void regulatory_propagate_dfs_state(struct wiphy *wiphy,
|
|
|
|
struct cfg80211_chan_def *chandef,
|
|
|
|
enum nl80211_dfs_state dfs_state,
|
|
|
|
enum nl80211_radar_event event);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* reg_dfs_domain_same - Checks if both wiphy have same DFS domain configured
|
|
|
|
* @wiphy1 - wiphy it's dfs_region to be checked against that of wiphy2
|
|
|
|
* @wiphy2 - wiphy it's dfs_region to be checked against that of wiphy1
|
|
|
|
*/
|
|
|
|
bool reg_dfs_domain_same(struct wiphy *wiphy1, struct wiphy *wiphy2);
|
2017-09-13 16:07:22 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* reg_reload_regdb - reload the regulatory.db firmware file
|
|
|
|
*/
|
|
|
|
int reg_reload_regdb(void);
|
|
|
|
|
2017-09-13 22:21:08 +02:00
|
|
|
extern const u8 shipped_regdb_certs[];
|
|
|
|
extern unsigned int shipped_regdb_certs_len;
|
|
|
|
extern const u8 extra_regdb_certs[];
|
|
|
|
extern unsigned int extra_regdb_certs_len;
|
|
|
|
|
2008-09-10 08:19:48 +02:00
|
|
|
#endif /* __NET_WIRELESS_REG_H */
|