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

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