mirror of
https://github.com/torvalds/linux.git
synced 2024-11-11 22:51:42 +00:00
3b377ea9d4
This patch provides infrastructure for machine translation of the regulatory rules database used by CRDA into a C data structure. It includes code for searching that database as an alternative to dynamic regulatory rules updates via CRDA. Most people should use CRDA instead of this infrastructure, but it provides a better alternative than the WIRELESS_OLD_REGULATORY infrastructure (which can now be removed). Signed-off-by: John W. Linville <linville@tuxdriver.com>
119 lines
2.8 KiB
Awk
119 lines
2.8 KiB
Awk
#!/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>
|
|
#
|
|
# This program is free software; you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License version 2 as
|
|
# published by the Free Software Foundation.
|
|
#
|
|
|
|
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 ""
|
|
regdb = "const struct ieee80211_regdomain *reg_regdb[] = {\n"
|
|
}
|
|
|
|
/^[ \t]*#/ {
|
|
/* Ignore */
|
|
}
|
|
|
|
!active && /^[ \t]*$/ {
|
|
/* Ignore */
|
|
}
|
|
|
|
!active && /country/ {
|
|
country=$2
|
|
sub(/:/, "", country)
|
|
printf "static const struct ieee80211_regdomain regdom_%s = {\n", country
|
|
printf "\t.alpha2 = \"%s\",\n", country
|
|
printf "\t.reg_rules = {\n"
|
|
active = 1
|
|
regdb = regdb "\t®dom_" country ",\n"
|
|
}
|
|
|
|
active && /^[ \t]*\(/ {
|
|
start = $1
|
|
sub(/\(/, "", start)
|
|
end = $3
|
|
bw = $5
|
|
sub(/\),/, "", bw)
|
|
gain = $6
|
|
sub(/\(/, "", gain)
|
|
sub(/,/, "", gain)
|
|
power = $7
|
|
sub(/\)/, "", power)
|
|
sub(/,/, "", power)
|
|
# power might be in mW...
|
|
units = $8
|
|
sub(/\)/, "", units)
|
|
sub(/,/, "", units)
|
|
if (units == "mW") {
|
|
if (power == 100) {
|
|
power = 20
|
|
} else if (power == 200) {
|
|
power = 23
|
|
} else if (power == 500) {
|
|
power = 27
|
|
} else if (power == 1000) {
|
|
power = 30
|
|
} else {
|
|
print "Unknown power value in database!"
|
|
}
|
|
}
|
|
flagstr = ""
|
|
for (i=8; 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_PASSIVE_SCAN | "
|
|
} else if (flagarray[arg] == "NO-IBSS") {
|
|
flags = flags "\n\t\t\tNL80211_RRF_NO_IBSS | "
|
|
}
|
|
}
|
|
flags = flags "0"
|
|
printf "\t\tREG_RULE(%d, %d, %d, %d, %d, %s),\n", start, end, bw, gain, power, flags
|
|
rules++
|
|
}
|
|
|
|
active && /^[ \t]*$/ {
|
|
active = 0
|
|
printf "\t},\n"
|
|
printf "\t.n_reg_rules = %d\n", rules
|
|
printf "};\n\n"
|
|
rules = 0;
|
|
}
|
|
|
|
END {
|
|
print regdb "};"
|
|
print ""
|
|
print "int reg_regdb_size = ARRAY_SIZE(reg_regdb);"
|
|
}
|