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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  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(name)
  6. if uci:get('wireless', name) then
  7. return uci:get_bool('wireless', name, 'disabled')
  8. end
  9. end
  10. -- Returns the first argument that is not nil; don't call without any non-nil arguments!
  11. local function first_non_nil(first, ...)
  12. if first ~= nil then
  13. return first
  14. else
  15. return first_non_nil(...)
  16. end
  17. end
  18. local function configure_ibss(config, radio, index, suffix, disabled)
  19. local name = 'ibss_' .. radio
  20. uci:delete('network', name)
  21. uci:delete('network', name .. '_vlan')
  22. uci:delete('wireless', name)
  23. if config then
  24. if config.vlan then
  25. uci:section('network', 'interface', name,
  26. {
  27. proto = 'none',
  28. }
  29. )
  30. uci:section('network', 'interface', name .. '_vlan',
  31. {
  32. ifname = '@' .. name .. '.' .. config.vlan,
  33. proto = 'batadv',
  34. mesh = 'bat0',
  35. }
  36. )
  37. else
  38. uci:section('network', 'interface', name,
  39. {
  40. proto = 'batadv',
  41. mesh = 'bat0',
  42. }
  43. )
  44. end
  45. uci:section('wireless', 'wifi-iface', name,
  46. {
  47. device = radio,
  48. network = name,
  49. mode = 'adhoc',
  50. ssid = config.ssid,
  51. bssid = config.bssid,
  52. macaddr = util.generate_mac(3, index),
  53. mcast_rate = config.mcast_rate,
  54. ifname = suffix and 'ibss' .. suffix,
  55. disabled = disabled and 1 or 0,
  56. }
  57. )
  58. end
  59. end
  60. local function configure_mesh(config, radio, index, suffix, disabled)
  61. local name = 'mesh_' .. radio
  62. local macfilter = uci:get('wireless', name, 'macfilter')
  63. local maclist = uci:get('wireless', name, 'maclist')
  64. uci:delete('network', name)
  65. uci:delete('wireless', name)
  66. if config then
  67. uci:section('network', 'interface', name,
  68. {
  69. proto = 'batadv',
  70. mesh = 'bat0',
  71. }
  72. )
  73. uci:section('wireless', 'wifi-iface', name,
  74. {
  75. device = radio,
  76. network = name,
  77. mode = 'mesh',
  78. mesh_id = config.id,
  79. mesh_fwding = 0,
  80. macaddr = util.generate_mac(5, index),
  81. mcast_rate = config.mcast_rate,
  82. ifname = suffix and 'mesh' .. suffix,
  83. disabled = disabled and 1 or 0,
  84. macfilter = macfilter,
  85. maclist = maclist,
  86. }
  87. )
  88. end
  89. end
  90. local function configure_radio(radio, index, config)
  91. local suffix = radio:match('^radio(%d+)$')
  92. local ibss_disabled = is_disabled('ibss_' .. radio)
  93. local mesh_disabled = is_disabled('mesh_' .. radio)
  94. configure_ibss(config.ibss, radio, index, suffix,
  95. first_non_nil(
  96. ibss_disabled,
  97. mesh_disabled,
  98. (config.ibss or {}).disabled, -- will be nil if config.ibss or config.ibss.disabled is unset
  99. false
  100. )
  101. )
  102. configure_mesh(config.mesh, radio, index, suffix,
  103. first_non_nil(
  104. mesh_disabled,
  105. ibss_disabled,
  106. (config.mesh or {}).disabled, -- will be nil if config.mesh or config.mesh.disabled is unset
  107. false
  108. )
  109. )
  110. end
  111. util.iterate_radios(configure_radio)
  112. uci:save('wireless')
  113. uci:save('network')