genregdb.awk 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  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. # This program is free software; you can redistribute it and/or modify
  11. # it under the terms of the GNU General Public License version 2 as
  12. # published by the Free Software Foundation.
  13. #
  14. BEGIN {
  15. active = 0
  16. rules = 0;
  17. print "/*"
  18. print " * DO NOT EDIT -- file generated from data in db.txt"
  19. print " */"
  20. print ""
  21. print "#include <linux/nl80211.h>"
  22. print "#include <net/cfg80211.h>"
  23. print "#include \"regdb.h\""
  24. print ""
  25. regdb = "const struct ieee80211_regdomain *reg_regdb[] = {\n"
  26. }
  27. /^[ \t]*#/ {
  28. # Ignore
  29. }
  30. !active && /^[ \t]*$/ {
  31. # Ignore
  32. }
  33. !active && /country/ {
  34. country=$2
  35. sub(/:/, "", country)
  36. printf "static const struct ieee80211_regdomain regdom_%s = {\n", country
  37. printf "\t.alpha2 = \"%s\",\n", country
  38. printf "\t.reg_rules = {\n"
  39. active = 1
  40. regdb = regdb "\t&regdom_" country ",\n"
  41. }
  42. active && /^[ \t]*\(/ {
  43. start = $1
  44. sub(/\(/, "", start)
  45. end = $3
  46. bw = $5
  47. sub(/\),/, "", bw)
  48. gain = $6
  49. sub(/\(/, "", gain)
  50. sub(/,/, "", gain)
  51. power = $7
  52. sub(/\)/, "", power)
  53. sub(/,/, "", power)
  54. # power might be in mW...
  55. units = $8
  56. sub(/\)/, "", units)
  57. sub(/,/, "", units)
  58. if (units == "mW") {
  59. if (power == 100) {
  60. power = 20
  61. } else if (power == 200) {
  62. power = 23
  63. } else if (power == 500) {
  64. power = 27
  65. } else if (power == 1000) {
  66. power = 30
  67. } else {
  68. print "Unknown power value in database!"
  69. }
  70. }
  71. flagstr = ""
  72. for (i=8; i<=NF; i++)
  73. flagstr = flagstr $i
  74. split(flagstr, flagarray, ",")
  75. flags = ""
  76. for (arg in flagarray) {
  77. if (flagarray[arg] == "NO-OFDM") {
  78. flags = flags "\n\t\t\tNL80211_RRF_NO_OFDM | "
  79. } else if (flagarray[arg] == "NO-CCK") {
  80. flags = flags "\n\t\t\tNL80211_RRF_NO_CCK | "
  81. } else if (flagarray[arg] == "NO-INDOOR") {
  82. flags = flags "\n\t\t\tNL80211_RRF_NO_INDOOR | "
  83. } else if (flagarray[arg] == "NO-OUTDOOR") {
  84. flags = flags "\n\t\t\tNL80211_RRF_NO_OUTDOOR | "
  85. } else if (flagarray[arg] == "DFS") {
  86. flags = flags "\n\t\t\tNL80211_RRF_DFS | "
  87. } else if (flagarray[arg] == "PTP-ONLY") {
  88. flags = flags "\n\t\t\tNL80211_RRF_PTP_ONLY | "
  89. } else if (flagarray[arg] == "PTMP-ONLY") {
  90. flags = flags "\n\t\t\tNL80211_RRF_PTMP_ONLY | "
  91. } else if (flagarray[arg] == "PASSIVE-SCAN") {
  92. flags = flags "\n\t\t\tNL80211_RRF_PASSIVE_SCAN | "
  93. } else if (flagarray[arg] == "NO-IBSS") {
  94. flags = flags "\n\t\t\tNL80211_RRF_NO_IBSS | "
  95. }
  96. }
  97. flags = flags "0"
  98. printf "\t\tREG_RULE(%d, %d, %d, %d, %d, %s),\n", start, end, bw, gain, power, flags
  99. rules++
  100. }
  101. active && /^[ \t]*$/ {
  102. active = 0
  103. printf "\t},\n"
  104. printf "\t.n_reg_rules = %d\n", rules
  105. printf "};\n\n"
  106. rules = 0;
  107. }
  108. END {
  109. print regdb "};"
  110. print ""
  111. print "int reg_regdb_size = ARRAY_SIZE(reg_regdb);"
  112. }