at v3.13-rc8 132 lines 3.7 kB view raw
1#!/usr/bin/awk -f 2# 3# genregdb.awk -- generate regdb.c from db.txt 4# 5# Actually, it reads from stdin (presumed to be db.txt) and writes 6# to stdout (presumed to be regdb.c), but close enough... 7# 8# Copyright 2009 John W. Linville <linville@tuxdriver.com> 9# 10# Permission to use, copy, modify, and/or distribute this software for any 11# purpose with or without fee is hereby granted, provided that the above 12# copyright notice and this permission notice appear in all copies. 13# 14# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 15# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 16# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 17# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 18# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 19# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 20# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 21 22BEGIN { 23 active = 0 24 rules = 0; 25 print "/*" 26 print " * DO NOT EDIT -- file generated from data in db.txt" 27 print " */" 28 print "" 29 print "#include <linux/nl80211.h>" 30 print "#include <net/cfg80211.h>" 31 print "#include \"regdb.h\"" 32 print "" 33 regdb = "const struct ieee80211_regdomain *reg_regdb[] = {\n" 34} 35 36/^[ \t]*#/ { 37 # Ignore 38} 39 40!active && /^[ \t]*$/ { 41 # Ignore 42} 43 44!active && /country/ { 45 country=$2 46 sub(/:/, "", country) 47 printf "static const struct ieee80211_regdomain regdom_%s = {\n", country 48 printf "\t.alpha2 = \"%s\",\n", country 49 if ($NF ~ /DFS-ETSI/) 50 printf "\t.dfs_region = NL80211_DFS_ETSI,\n" 51 else if ($NF ~ /DFS-FCC/) 52 printf "\t.dfs_region = NL80211_DFS_FCC,\n" 53 else if ($NF ~ /DFS-JP/) 54 printf "\t.dfs_region = NL80211_DFS_JP,\n" 55 printf "\t.reg_rules = {\n" 56 active = 1 57 regdb = regdb "\t&regdom_" country ",\n" 58} 59 60active && /^[ \t]*\(/ { 61 start = $1 62 sub(/\(/, "", start) 63 end = $3 64 bw = $5 65 sub(/\),/, "", bw) 66 gain = $6 67 sub(/\(/, "", gain) 68 sub(/,/, "", gain) 69 power = $7 70 sub(/\)/, "", power) 71 sub(/,/, "", power) 72 # power might be in mW... 73 units = $8 74 sub(/\)/, "", units) 75 sub(/,/, "", units) 76 if (units == "mW") { 77 if (power == 100) { 78 power = 20 79 } else if (power == 200) { 80 power = 23 81 } else if (power == 500) { 82 power = 27 83 } else if (power == 1000) { 84 power = 30 85 } else { 86 print "Unknown power value in database!" 87 } 88 } 89 flagstr = "" 90 for (i=8; i<=NF; i++) 91 flagstr = flagstr $i 92 split(flagstr, flagarray, ",") 93 flags = "" 94 for (arg in flagarray) { 95 if (flagarray[arg] == "NO-OFDM") { 96 flags = flags "\n\t\t\tNL80211_RRF_NO_OFDM | " 97 } else if (flagarray[arg] == "NO-CCK") { 98 flags = flags "\n\t\t\tNL80211_RRF_NO_CCK | " 99 } else if (flagarray[arg] == "NO-INDOOR") { 100 flags = flags "\n\t\t\tNL80211_RRF_NO_INDOOR | " 101 } else if (flagarray[arg] == "NO-OUTDOOR") { 102 flags = flags "\n\t\t\tNL80211_RRF_NO_OUTDOOR | " 103 } else if (flagarray[arg] == "DFS") { 104 flags = flags "\n\t\t\tNL80211_RRF_DFS | " 105 } else if (flagarray[arg] == "PTP-ONLY") { 106 flags = flags "\n\t\t\tNL80211_RRF_PTP_ONLY | " 107 } else if (flagarray[arg] == "PTMP-ONLY") { 108 flags = flags "\n\t\t\tNL80211_RRF_PTMP_ONLY | " 109 } else if (flagarray[arg] == "PASSIVE-SCAN") { 110 flags = flags "\n\t\t\tNL80211_RRF_PASSIVE_SCAN | " 111 } else if (flagarray[arg] == "NO-IBSS") { 112 flags = flags "\n\t\t\tNL80211_RRF_NO_IBSS | " 113 } 114 } 115 flags = flags "0" 116 printf "\t\tREG_RULE(%d, %d, %d, %d, %d, %s),\n", start, end, bw, gain, power, flags 117 rules++ 118} 119 120active && /^[ \t]*$/ { 121 active = 0 122 printf "\t},\n" 123 printf "\t.n_reg_rules = %d\n", rules 124 printf "};\n\n" 125 rules = 0; 126} 127 128END { 129 print regdb "};" 130 print "" 131 print "int reg_regdb_size = ARRAY_SIZE(reg_regdb);" 132}