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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  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 configure_radio(radio, index, config)
  6. uci:delete('wireless', radio, 'disabled')
  7. uci:set('wireless', radio, 'channel', config.channel)
  8. uci:set('wireless', radio, 'htmode', config.htmode)
  9. uci:set('wireless', radio, 'country', site.regdom)
  10. local client = 'client_' .. radio
  11. local mesh = 'mesh_' .. radio
  12. local disable_state_client = false
  13. local disable_state_mesh = false
  14. if uci:get('wireless', client) then
  15. disable_state_client = uci:get_bool('wireless', client, "disabled")
  16. elseif config.client_disabled then
  17. disable_state_client = true
  18. end
  19. if uci:get('wireless', mesh) then
  20. disable_state_mesh = uci:get_bool('wireless', mesh, "disabled")
  21. elseif config.mesh_disabled then
  22. disable_state_mesh = true
  23. end
  24. local client_ifname
  25. local mesh_ifname
  26. local radio_suffix = radio:match('^radio(%d+)$')
  27. if radio_suffix then
  28. client_ifname = 'client' .. radio_suffix
  29. mesh_ifname = 'mesh' .. radio_suffix
  30. end
  31. uci:delete('wireless', client)
  32. uci:section('wireless', 'wifi-iface', client,
  33. {
  34. device = radio,
  35. network = 'client',
  36. mode = 'ap',
  37. ssid = config.ssid,
  38. macaddr = util.generate_mac(2, index),
  39. ifname = client_ifname,
  40. disabled = disable_state_client and 1 or 0,
  41. }
  42. )
  43. uci:delete('network', mesh)
  44. uci:delete('network', mesh .. '_vlan')
  45. if config.mesh_vlan then
  46. uci:section('network', 'interface', mesh,
  47. {
  48. proto = 'none',
  49. }
  50. )
  51. uci:section('network', 'interface', mesh .. '_vlan',
  52. {
  53. ifname = '@' .. mesh .. '.' .. config.mesh_vlan,
  54. proto = 'batadv',
  55. mesh = 'bat0',
  56. }
  57. )
  58. else
  59. uci:section('network', 'interface', mesh,
  60. {
  61. proto = 'batadv',
  62. mesh = 'bat0',
  63. }
  64. )
  65. end
  66. uci:delete('wireless', mesh)
  67. uci:section('wireless', 'wifi-iface', mesh,
  68. {
  69. device = radio,
  70. network = mesh,
  71. mode = 'adhoc',
  72. ssid = config.mesh_ssid,
  73. bssid = config.mesh_bssid,
  74. macaddr = util.generate_mac(3, index),
  75. mcast_rate = config.mesh_mcast_rate,
  76. ifname = mesh_ifname,
  77. disabled = disable_state_mesh and 1 or 0,
  78. }
  79. )
  80. end
  81. local radios = {}
  82. uci:foreach('wireless', 'wifi-device',
  83. function(s)
  84. table.insert(radios, s['.name'])
  85. end
  86. )
  87. for index, radio in ipairs(radios) do
  88. local hwmode = uci:get('wireless', radio, 'hwmode')
  89. if hwmode == '11g' or hwmode == '11ng' then
  90. configure_radio(radio, index, site.wifi24)
  91. elseif hwmode == '11a' or hwmode == '11na' then
  92. configure_radio(radio, index, site.wifi5)
  93. end
  94. end
  95. uci:save('wireless')
  96. uci:save('network')
  97. uci:commit('wireless')
  98. uci:commit('network')