320-gluon-mesh-batman-adv-core-wireless 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. #!/usr/bin/lua
  2. local site = require 'gluon.site_config'
  3. local util = require 'gluon.util'
  4. local uci = require('luci.model.uci').cursor()
  5. local function is_disabled(config, name)
  6. local disabled = config and config.disabled
  7. if uci:get('wireless', name) then
  8. disabled = uci:get_bool('wireless', name, 'disabled')
  9. end
  10. return disabled and 1 or 0
  11. end
  12. local function configure_client(config, radio, index, suffix)
  13. local name = 'client_' .. radio
  14. local disabled = is_disabled(config, name)
  15. uci:delete('wireless', name)
  16. if config then
  17. uci:section('wireless', 'wifi-iface', name,
  18. {
  19. device = radio,
  20. network = 'client',
  21. mode = 'ap',
  22. ssid = config.ssid,
  23. macaddr = util.generate_mac(2, index),
  24. ifname = suffix and 'client' .. suffix,
  25. disabled = disabled,
  26. }
  27. )
  28. end
  29. end
  30. local function configure_ibss(config, radio, index, suffix)
  31. local name = 'ibss_' .. radio
  32. local disabled = is_disabled(config, name)
  33. uci:delete('network', name)
  34. uci:delete('network', name .. '_vlan')
  35. uci:delete('wireless', name)
  36. if config then
  37. if config.vlan then
  38. uci:section('network', 'interface', name,
  39. {
  40. proto = 'none',
  41. }
  42. )
  43. uci:section('network', 'interface', name .. '_vlan',
  44. {
  45. ifname = '@' .. name .. '.' .. config.vlan,
  46. proto = 'batadv',
  47. mesh = 'bat0',
  48. }
  49. )
  50. else
  51. uci:section('network', 'interface', name,
  52. {
  53. proto = 'batadv',
  54. mesh = 'bat0',
  55. }
  56. )
  57. end
  58. uci:section('wireless', 'wifi-iface', name,
  59. {
  60. device = radio,
  61. network = name,
  62. mode = 'adhoc',
  63. ssid = config.ssid,
  64. bssid = config.bssid,
  65. macaddr = util.generate_mac(3, index),
  66. mcast_rate = config.mcast_rate,
  67. ifname = suffix and 'ibss' .. suffix,
  68. disabled = disabled,
  69. }
  70. )
  71. end
  72. end
  73. local function configure_mesh(config, radio, index, suffix)
  74. local name = 'mesh_' .. radio
  75. local disabled = is_disabled(config, name)
  76. uci:delete('network', name)
  77. uci:delete('wireless', name)
  78. if config then
  79. uci:section('network', 'interface', name,
  80. {
  81. proto = 'batadv',
  82. mesh = 'bat0',
  83. }
  84. )
  85. uci:section('wireless', 'wifi-iface', name,
  86. {
  87. device = radio,
  88. network = name,
  89. mode = 'mesh',
  90. mesh_id = config.id,
  91. mesh_fwding = 0,
  92. macaddr = util.generate_mac(5, index),
  93. mcast_rate = config.mcast_rate,
  94. ifname = suffix and 'mesh' .. suffix,
  95. disabled = disabled,
  96. }
  97. )
  98. end
  99. end
  100. local function configure_radio(radio, index, config)
  101. local suffix = radio:match('^radio(%d+)$')
  102. uci:delete('wireless', radio, 'disabled')
  103. uci:set('wireless', radio, 'channel', config.channel)
  104. uci:set('wireless', radio, 'htmode', config.htmode)
  105. uci:set('wireless', radio, 'country', site.regdom)
  106. configure_client(config.ap, radio, index, suffix)
  107. configure_ibss(config.ibss, radio, index, suffix)
  108. configure_mesh(config.mesh, radio, index, suffix)
  109. end
  110. local radios = {}
  111. uci:foreach('wireless', 'wifi-device',
  112. function(s)
  113. table.insert(radios, s['.name'])
  114. end
  115. )
  116. for index, radio in ipairs(radios) do
  117. local hwmode = uci:get('wireless', radio, 'hwmode')
  118. if hwmode == '11g' or hwmode == '11ng' then
  119. configure_radio(radio, index, site.wifi24)
  120. elseif hwmode == '11a' or hwmode == '11na' then
  121. configure_radio(radio, index, site.wifi5)
  122. end
  123. end
  124. uci:save('wireless')
  125. uci:save('network')
  126. uci:commit('wireless')
  127. uci:commit('network')