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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  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. configure_client(config.ap, radio, index, suffix)
  103. configure_ibss(config.ibss, radio, index, suffix)
  104. configure_mesh(config.mesh, radio, index, suffix)
  105. end
  106. util.iterate_radios(configure_radio)
  107. uci:save('wireless')
  108. uci:save('network')
  109. uci:commit('wireless')
  110. uci:commit('network')