genregdb.awk 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  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. BEGIN {
  22. active = 0
  23. rules = 0;
  24. print "/*"
  25. print " * DO NOT EDIT -- file generated from data in db.txt"
  26. print " */"
  27. print ""
  28. print "#include <linux/nl80211.h>"
  29. print "#include <net/cfg80211.h>"
  30. print "#include \"regdb.h\""
  31. print ""
  32. regdb = "const struct ieee80211_regdomain *reg_regdb[] = {\n"
  33. }
  34. function parse_country_head() {
  35. country=$2
  36. sub(/:/, "", country)
  37. printf "static const struct ieee80211_regdomain regdom_%s = {\n", country
  38. printf "\t.alpha2 = \"%s\",\n", country
  39. if ($NF ~ /DFS-ETSI/)
  40. printf "\t.dfs_region = NL80211_DFS_ETSI,\n"
  41. else if ($NF ~ /DFS-FCC/)
  42. printf "\t.dfs_region = NL80211_DFS_FCC,\n"
  43. else if ($NF ~ /DFS-JP/)
  44. printf "\t.dfs_region = NL80211_DFS_JP,\n"
  45. printf "\t.reg_rules = {\n"
  46. active = 1
  47. regdb = regdb "\t&regdom_" country ",\n"
  48. }
  49. function parse_reg_rule()
  50. {
  51. start = $1
  52. sub(/\(/, "", start)
  53. end = $3
  54. bw = $5
  55. sub(/\),/, "", bw)
  56. gain = $6
  57. sub(/\(/, "", gain)
  58. sub(/,/, "", gain)
  59. power = $7
  60. sub(/\)/, "", power)
  61. sub(/,/, "", power)
  62. # power might be in mW...
  63. units = $8
  64. sub(/\)/, "", units)
  65. sub(/,/, "", units)
  66. dfs_cac = $9
  67. if (units == "mW") {
  68. if (power == 100) {
  69. power = 20
  70. } else if (power == 200) {
  71. power = 23
  72. } else if (power == 500) {
  73. power = 27
  74. } else if (power == 1000) {
  75. power = 30
  76. } else {
  77. print "Unknown power value in database!"
  78. }
  79. } else {
  80. dfs_cac = $8
  81. }
  82. sub(/,/, "", dfs_cac)
  83. sub(/\(/, "", dfs_cac)
  84. sub(/\)/, "", dfs_cac)
  85. flagstr = ""
  86. for (i=8; i<=NF; i++)
  87. flagstr = flagstr $i
  88. split(flagstr, flagarray, ",")
  89. flags = ""
  90. for (arg in flagarray) {
  91. if (flagarray[arg] == "NO-OFDM") {
  92. flags = flags "\n\t\t\tNL80211_RRF_NO_OFDM | "
  93. } else if (flagarray[arg] == "NO-CCK") {
  94. flags = flags "\n\t\t\tNL80211_RRF_NO_CCK | "
  95. } else if (flagarray[arg] == "NO-INDOOR") {
  96. flags = flags "\n\t\t\tNL80211_RRF_NO_INDOOR | "
  97. } else if (flagarray[arg] == "NO-OUTDOOR") {
  98. flags = flags "\n\t\t\tNL80211_RRF_NO_OUTDOOR | "
  99. } else if (flagarray[arg] == "DFS") {
  100. flags = flags "\n\t\t\tNL80211_RRF_DFS | "
  101. } else if (flagarray[arg] == "PTP-ONLY") {
  102. flags = flags "\n\t\t\tNL80211_RRF_PTP_ONLY | "
  103. } else if (flagarray[arg] == "PTMP-ONLY") {
  104. flags = flags "\n\t\t\tNL80211_RRF_PTMP_ONLY | "
  105. } else if (flagarray[arg] == "PASSIVE-SCAN") {
  106. flags = flags "\n\t\t\tNL80211_RRF_NO_IR | "
  107. } else if (flagarray[arg] == "NO-IBSS") {
  108. flags = flags "\n\t\t\tNL80211_RRF_NO_IR | "
  109. } else if (flagarray[arg] == "NO-IR") {
  110. flags = flags "\n\t\t\tNL80211_RRF_NO_IR | "
  111. } else if (flagarray[arg] == "AUTO-BW") {
  112. flags = flags "\n\t\t\tNL80211_RRF_AUTO_BW | "
  113. }
  114. }
  115. flags = flags "0"
  116. printf "\t\tREG_RULE_EXT(%d, %d, %d, %d, %d, %d, %s),\n", start, end, bw, gain, power, dfs_cac, flags
  117. rules++
  118. }
  119. function print_tail_country()
  120. {
  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. /^[ \t]*#/ {
  128. # Ignore
  129. }
  130. !active && /^[ \t]*$/ {
  131. # Ignore
  132. }
  133. !active && /country/ {
  134. parse_country_head()
  135. }
  136. active && /^[ \t]*\(/ {
  137. parse_reg_rule()
  138. }
  139. active && /^[ \t]*$/ {
  140. print_tail_country()
  141. }
  142. END {
  143. if (active)
  144. print_tail_country()
  145. print regdb "};"
  146. print ""
  147. print "int reg_regdb_size = ARRAY_SIZE(reg_regdb);"
  148. }