cfg80211: reg: remove support for built-in regdb
Parsing and building C structures from a regdb is no longer needed since the "firmware" file (regulatory.db) can be linked into the kernel image to achieve the same effect. Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
Родитель
1ea4ff3e9f
Коммит
c8c240e284
|
@ -200,23 +200,5 @@ Then in some part of your code after your wiphy has been registered:
|
|||
Statically compiled regulatory database
|
||||
---------------------------------------
|
||||
|
||||
In most situations the userland solution using CRDA as described
|
||||
above is the preferred solution. However in some cases a set of
|
||||
rules built into the kernel itself may be desirable. To account
|
||||
for this situation, a configuration option has been provided
|
||||
(i.e. CONFIG_CFG80211_INTERNAL_REGDB). With this option enabled,
|
||||
the wireless database information contained in net/wireless/db.txt is
|
||||
used to generate a data structure encoded in net/wireless/regdb.c.
|
||||
That option also enables code in net/wireless/reg.c which queries
|
||||
the data in regdb.c as an alternative to using CRDA.
|
||||
|
||||
The file net/wireless/db.txt should be kept up-to-date with the db.txt
|
||||
file available in the git repository here:
|
||||
|
||||
git://git.kernel.org/pub/scm/linux/kernel/git/sforshee/wireless-regdb.git
|
||||
|
||||
Again, most users in most situations should be using the CRDA package
|
||||
provided with their distribution, and in most other situations users
|
||||
should be building and using CRDA on their own rather than using
|
||||
this option. If you are not absolutely sure that you should be using
|
||||
CONFIG_CFG80211_INTERNAL_REGDB then _DO_NOT_USE_IT_.
|
||||
When a database should be fixed into the kernel, it can be provided as a
|
||||
firmware file at build time that is then linked into the kernel.
|
||||
|
|
|
@ -1 +0,0 @@
|
|||
regdb.c
|
|
@ -140,30 +140,8 @@ config CFG80211_DEBUGFS
|
|||
|
||||
If unsure, say N.
|
||||
|
||||
config CFG80211_INTERNAL_REGDB
|
||||
bool "use statically compiled regulatory rules database" if EXPERT
|
||||
default n
|
||||
depends on CFG80211
|
||||
---help---
|
||||
This option generates an internal data structure representing
|
||||
the wireless regulatory rules described in net/wireless/db.txt
|
||||
and includes code to query that database. This is an alternative
|
||||
to using CRDA for defining regulatory rules for the kernel.
|
||||
|
||||
Using this option requires some parsing of the db.txt at build time,
|
||||
the parser will be upkept with the latest wireless-regdb updates but
|
||||
older wireless-regdb formats will be ignored. The parser may later
|
||||
be replaced to avoid issues with conflicts on versions of
|
||||
wireless-regdb.
|
||||
|
||||
For details see:
|
||||
|
||||
http://wireless.kernel.org/en/developers/Regulatory
|
||||
|
||||
Most distributions have a CRDA package. So if unsure, say N.
|
||||
|
||||
config CFG80211_CRDA_SUPPORT
|
||||
bool "support CRDA" if CFG80211_INTERNAL_REGDB
|
||||
bool "support CRDA" if EXPERT
|
||||
default y
|
||||
depends on CFG80211
|
||||
help
|
||||
|
|
|
@ -14,11 +14,5 @@ cfg80211-y += mlme.o ibss.o sme.o chan.o ethtool.o mesh.o ap.o trace.o ocb.o
|
|||
cfg80211-$(CONFIG_OF) += of.o
|
||||
cfg80211-$(CONFIG_CFG80211_DEBUGFS) += debugfs.o
|
||||
cfg80211-$(CONFIG_CFG80211_WEXT) += wext-compat.o wext-sme.o
|
||||
cfg80211-$(CONFIG_CFG80211_INTERNAL_REGDB) += regdb.o
|
||||
|
||||
CFLAGS_trace.o := -I$(src)
|
||||
|
||||
$(obj)/regdb.c: $(src)/db.txt $(src)/genregdb.awk
|
||||
@$(AWK) -f $(srctree)/$(src)/genregdb.awk < $< > $@
|
||||
|
||||
clean-files := regdb.c
|
||||
|
|
|
@ -1,17 +0,0 @@
|
|||
#
|
||||
# This file is a placeholder to prevent accidental build breakage if someone
|
||||
# enables CONFIG_CFG80211_INTERNAL_REGDB. Almost no one actually needs to
|
||||
# enable that build option.
|
||||
#
|
||||
# You should be using CRDA instead. It is even better if you use the CRDA
|
||||
# package provided by your distribution, since they will probably keep it
|
||||
# up-to-date on your behalf.
|
||||
#
|
||||
# If you _really_ intend to use CONFIG_CFG80211_INTERNAL_REGDB then you will
|
||||
# need to replace this file with one containing appropriately formatted
|
||||
# regulatory rules that cover the regulatory domains you will be using. Your
|
||||
# best option is to extract the db.txt file from the wireless-regdb git
|
||||
# repository:
|
||||
#
|
||||
# git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-regdb.git
|
||||
#
|
|
@ -1,158 +0,0 @@
|
|||
#!/usr/bin/awk -f
|
||||
#
|
||||
# genregdb.awk -- generate regdb.c from db.txt
|
||||
#
|
||||
# Actually, it reads from stdin (presumed to be db.txt) and writes
|
||||
# to stdout (presumed to be regdb.c), but close enough...
|
||||
#
|
||||
# Copyright 2009 John W. Linville <linville@tuxdriver.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.
|
||||
|
||||
BEGIN {
|
||||
active = 0
|
||||
rules = 0;
|
||||
print "/*"
|
||||
print " * DO NOT EDIT -- file generated from data in db.txt"
|
||||
print " */"
|
||||
print ""
|
||||
print "#include <linux/nl80211.h>"
|
||||
print "#include <net/cfg80211.h>"
|
||||
print "#include \"regdb.h\""
|
||||
print ""
|
||||
regdb = "const struct ieee80211_regdomain *reg_regdb[] = {\n"
|
||||
}
|
||||
|
||||
function parse_country_head() {
|
||||
country=$2
|
||||
sub(/:/, "", country)
|
||||
printf "static const struct ieee80211_regdomain regdom_%s = {\n", country
|
||||
printf "\t.alpha2 = \"%s\",\n", country
|
||||
if ($NF ~ /DFS-ETSI/)
|
||||
printf "\t.dfs_region = NL80211_DFS_ETSI,\n"
|
||||
else if ($NF ~ /DFS-FCC/)
|
||||
printf "\t.dfs_region = NL80211_DFS_FCC,\n"
|
||||
else if ($NF ~ /DFS-JP/)
|
||||
printf "\t.dfs_region = NL80211_DFS_JP,\n"
|
||||
printf "\t.reg_rules = {\n"
|
||||
active = 1
|
||||
regdb = regdb "\t®dom_" country ",\n"
|
||||
}
|
||||
|
||||
function parse_reg_rule()
|
||||
{
|
||||
flag_starts_at = 7
|
||||
|
||||
start = $1
|
||||
sub(/\(/, "", start)
|
||||
end = $3
|
||||
bw = $5
|
||||
sub(/\),/, "", bw)
|
||||
gain = 0
|
||||
power = $6
|
||||
# power might be in mW...
|
||||
units = $7
|
||||
dfs_cac = 0
|
||||
|
||||
sub(/\(/, "", power)
|
||||
sub(/\),/, "", power)
|
||||
sub(/\),/, "", units)
|
||||
sub(/\)/, "", units)
|
||||
|
||||
if (units == "mW") {
|
||||
flag_starts_at = 8
|
||||
power = 10 * log(power)/log(10)
|
||||
if ($8 ~ /[[:digit:]]/) {
|
||||
flag_starts_at = 9
|
||||
dfs_cac = $8
|
||||
}
|
||||
} else {
|
||||
if ($7 ~ /[[:digit:]]/) {
|
||||
flag_starts_at = 8
|
||||
dfs_cac = $7
|
||||
}
|
||||
}
|
||||
sub(/\(/, "", dfs_cac)
|
||||
sub(/\),/, "", dfs_cac)
|
||||
flagstr = ""
|
||||
for (i=flag_starts_at; i<=NF; i++)
|
||||
flagstr = flagstr $i
|
||||
split(flagstr, flagarray, ",")
|
||||
flags = ""
|
||||
for (arg in flagarray) {
|
||||
if (flagarray[arg] == "NO-OFDM") {
|
||||
flags = flags "\n\t\t\tNL80211_RRF_NO_OFDM | "
|
||||
} else if (flagarray[arg] == "NO-CCK") {
|
||||
flags = flags "\n\t\t\tNL80211_RRF_NO_CCK | "
|
||||
} else if (flagarray[arg] == "NO-INDOOR") {
|
||||
flags = flags "\n\t\t\tNL80211_RRF_NO_INDOOR | "
|
||||
} else if (flagarray[arg] == "NO-OUTDOOR") {
|
||||
flags = flags "\n\t\t\tNL80211_RRF_NO_OUTDOOR | "
|
||||
} else if (flagarray[arg] == "DFS") {
|
||||
flags = flags "\n\t\t\tNL80211_RRF_DFS | "
|
||||
} else if (flagarray[arg] == "PTP-ONLY") {
|
||||
flags = flags "\n\t\t\tNL80211_RRF_PTP_ONLY | "
|
||||
} else if (flagarray[arg] == "PTMP-ONLY") {
|
||||
flags = flags "\n\t\t\tNL80211_RRF_PTMP_ONLY | "
|
||||
} else if (flagarray[arg] == "PASSIVE-SCAN") {
|
||||
flags = flags "\n\t\t\tNL80211_RRF_NO_IR | "
|
||||
} else if (flagarray[arg] == "NO-IBSS") {
|
||||
flags = flags "\n\t\t\tNL80211_RRF_NO_IR | "
|
||||
} else if (flagarray[arg] == "NO-IR") {
|
||||
flags = flags "\n\t\t\tNL80211_RRF_NO_IR | "
|
||||
} else if (flagarray[arg] == "AUTO-BW") {
|
||||
flags = flags "\n\t\t\tNL80211_RRF_AUTO_BW | "
|
||||
}
|
||||
|
||||
}
|
||||
flags = flags "0"
|
||||
printf "\t\tREG_RULE_EXT(%d, %d, %d, %d, %.0f, %d, %s),\n", start, end, bw, gain, power, dfs_cac, flags
|
||||
rules++
|
||||
}
|
||||
|
||||
function print_tail_country()
|
||||
{
|
||||
active = 0
|
||||
printf "\t},\n"
|
||||
printf "\t.n_reg_rules = %d\n", rules
|
||||
printf "};\n\n"
|
||||
rules = 0;
|
||||
}
|
||||
|
||||
/^[ \t]*#/ {
|
||||
# Ignore
|
||||
}
|
||||
|
||||
!active && /^[ \t]*$/ {
|
||||
# Ignore
|
||||
}
|
||||
|
||||
!active && /country/ {
|
||||
parse_country_head()
|
||||
}
|
||||
|
||||
active && /^[ \t]*\(/ {
|
||||
parse_reg_rule()
|
||||
}
|
||||
|
||||
active && /^[ \t]*$/ {
|
||||
print_tail_country()
|
||||
}
|
||||
|
||||
END {
|
||||
if (active)
|
||||
print_tail_country()
|
||||
print regdb "};"
|
||||
print ""
|
||||
print "int reg_regdb_size = ARRAY_SIZE(reg_regdb);"
|
||||
}
|
|
@ -59,7 +59,6 @@
|
|||
#include "core.h"
|
||||
#include "reg.h"
|
||||
#include "rdev-ops.h"
|
||||
#include "regdb.h"
|
||||
#include "nl80211.h"
|
||||
|
||||
/*
|
||||
|
@ -495,38 +494,6 @@ static int reg_schedule_apply(const struct ieee80211_regdomain *regdom)
|
|||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_CFG80211_INTERNAL_REGDB
|
||||
static int reg_query_builtin(const char *alpha2)
|
||||
{
|
||||
const struct ieee80211_regdomain *regdom = NULL;
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; i < reg_regdb_size; i++) {
|
||||
if (alpha2_equal(alpha2, reg_regdb[i]->alpha2)) {
|
||||
regdom = reg_copy_regd(reg_regdb[i]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!regdom)
|
||||
return -ENODATA;
|
||||
|
||||
return reg_schedule_apply(regdom);
|
||||
}
|
||||
|
||||
/* Feel free to add any other sanity checks here */
|
||||
static void reg_regdb_size_check(void)
|
||||
{
|
||||
/* We should ideally BUILD_BUG_ON() but then random builds would fail */
|
||||
WARN_ONCE(!reg_regdb_size, "db.txt is empty, you should update it...");
|
||||
}
|
||||
#else
|
||||
static inline void reg_regdb_size_check(void) {}
|
||||
static inline int reg_query_builtin(const char *alpha2)
|
||||
{
|
||||
return -ENODATA;
|
||||
}
|
||||
#endif /* CONFIG_CFG80211_INTERNAL_REGDB */
|
||||
|
||||
#ifdef CONFIG_CFG80211_CRDA_SUPPORT
|
||||
/* Max number of consecutive attempts to communicate with CRDA */
|
||||
#define REG_MAX_CRDA_TIMEOUTS 10
|
||||
|
@ -885,10 +852,6 @@ int reg_reload_regdb(void)
|
|||
|
||||
static bool reg_query_database(struct regulatory_request *request)
|
||||
{
|
||||
/* query internal regulatory database (if it exists) */
|
||||
if (reg_query_builtin(request->alpha2) == 0)
|
||||
return true;
|
||||
|
||||
if (query_regdb_file(request->alpha2) == 0)
|
||||
return true;
|
||||
|
||||
|
@ -3580,8 +3543,6 @@ int __init regulatory_init(void)
|
|||
spin_lock_init(®_pending_beacons_lock);
|
||||
spin_lock_init(®_indoor_lock);
|
||||
|
||||
reg_regdb_size_check();
|
||||
|
||||
rcu_assign_pointer(cfg80211_regdomain, cfg80211_world_regdom);
|
||||
|
||||
user_alpha2[0] = '9';
|
||||
|
|
|
@ -1,23 +0,0 @@
|
|||
#ifndef __REGDB_H__
|
||||
#define __REGDB_H__
|
||||
|
||||
/*
|
||||
* Copyright 2009 John W. Linville <linville@tuxdriver.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.
|
||||
*/
|
||||
|
||||
extern const struct ieee80211_regdomain *reg_regdb[];
|
||||
extern int reg_regdb_size;
|
||||
|
||||
#endif /* __REGDB_H__ */
|
Загрузка…
Ссылка в новой задаче