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

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