200-wireless 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. #!/usr/bin/lua
  2. local util = require 'gluon.util'
  3. local site = require 'gluon.site_config'
  4. local sysconfig = require 'gluon.sysconfig'
  5. local uci = require('luci.model.uci').cursor()
  6. -- Initial
  7. if not sysconfig.gluon_version then
  8. uci:delete_all('wireless', 'wifi-iface')
  9. end
  10. local function get_channel(radio, config)
  11. if uci:get_first('gluon-core', 'wireless', 'preserve_channels') then
  12. return uci:get('wireless', radio, 'channel') or config.channel
  13. else
  14. return config.channel
  15. end
  16. end
  17. local function is_disabled(name)
  18. if uci:get('wireless', name) then
  19. return uci:get_bool('wireless', name, 'disabled')
  20. end
  21. end
  22. -- Returns the first argument that is not nil; don't call without any non-nil arguments!
  23. local function first_non_nil(first, ...)
  24. if first ~= nil then
  25. return first
  26. else
  27. return first_non_nil(...)
  28. end
  29. end
  30. local function configure_ibss(config, radio, index, suffix, disabled)
  31. local name = 'ibss_' .. radio
  32. uci:delete('network', name)
  33. uci:delete('network', name .. '_vlan')
  34. uci:delete('wireless', name)
  35. if not config then
  36. return
  37. end
  38. local macaddr = util.get_wlan_mac(radio, index, 3)
  39. if not macaddr then
  40. return
  41. end
  42. if config.vlan then
  43. uci:section('network', 'interface', name,
  44. {
  45. proto = 'none',
  46. }
  47. )
  48. uci:section('network', 'interface', name .. '_vlan',
  49. {
  50. ifname = '@' .. name .. '.' .. config.vlan,
  51. proto = 'gluon_mesh',
  52. }
  53. )
  54. else
  55. uci:section('network', 'interface', name,
  56. {
  57. proto = 'gluon_mesh',
  58. }
  59. )
  60. end
  61. uci:section('wireless', 'wifi-iface', name,
  62. {
  63. device = radio,
  64. network = name,
  65. mode = 'adhoc',
  66. ssid = config.ssid,
  67. bssid = config.bssid,
  68. macaddr = macaddr,
  69. mcast_rate = config.mcast_rate,
  70. ifname = suffix and 'ibss' .. suffix,
  71. disabled = disabled and 1 or 0,
  72. }
  73. )
  74. end
  75. local function configure_mesh(config, radio, index, suffix, disabled)
  76. local name = 'mesh_' .. radio
  77. local macfilter = uci:get('wireless', name, 'macfilter')
  78. local maclist = uci:get('wireless', name, 'maclist')
  79. uci:delete('network', name)
  80. uci:delete('wireless', name)
  81. if not config then
  82. return
  83. end
  84. local macaddr = util.get_wlan_mac(radio, index, 2)
  85. if not macaddr then
  86. return
  87. end
  88. uci:section('network', 'interface', name,
  89. {
  90. proto = 'gluon_mesh',
  91. }
  92. )
  93. uci:section('wireless', 'wifi-iface', name,
  94. {
  95. device = radio,
  96. network = name,
  97. mode = 'mesh',
  98. mesh_id = config.id,
  99. mesh_fwding = 0,
  100. macaddr = macaddr,
  101. mcast_rate = config.mcast_rate,
  102. ifname = suffix and 'mesh' .. suffix,
  103. disabled = disabled and 1 or 0,
  104. macfilter = macfilter,
  105. maclist = maclist,
  106. }
  107. )
  108. end
  109. local function fixup_wan(radio, index)
  110. local name = 'wan_' .. radio
  111. if not uci:get('wireless', name) then
  112. return
  113. end
  114. local macaddr = util.get_wlan_mac(radio, index, 4)
  115. if not macaddr then
  116. return
  117. end
  118. uci:set('wireless', name, 'macaddr', macaddr)
  119. end
  120. local function configure_radio(radio, index, config)
  121. if not config then
  122. return
  123. end
  124. local suffix = radio:match('^radio(%d+)$')
  125. if not suffix then
  126. return
  127. end
  128. local channel = get_channel(radio, config)
  129. uci:delete('wireless', radio, 'disabled')
  130. uci:set('wireless', radio, 'channel', channel)
  131. uci:set('wireless', radio, 'htmode', 'HT20')
  132. uci:set('wireless', radio, 'country', site.regdom)
  133. if config.supported_rates then
  134. uci:set_list('wireless', radio, 'supported_rates', config.supported_rates)
  135. else
  136. uci:delete('wireless', radio, 'supported_rates')
  137. end
  138. if config.basic_rate then
  139. uci:set_list('wireless', radio, 'basic_rate', config.basic_rate)
  140. else
  141. uci:delete('wireless', radio, 'basic_rate')
  142. end
  143. local ibss_disabled = is_disabled('ibss_' .. radio)
  144. local mesh_disabled = is_disabled('mesh_' .. radio)
  145. configure_ibss(config.ibss, radio, index, suffix,
  146. first_non_nil(
  147. ibss_disabled,
  148. mesh_disabled,
  149. (config.ibss or {}).disabled, -- will be nil if config.ibss or config.ibss.disabled is unset
  150. false
  151. )
  152. )
  153. configure_mesh(config.mesh, radio, index, suffix,
  154. first_non_nil(
  155. mesh_disabled,
  156. ibss_disabled,
  157. (config.mesh or {}).disabled, -- will be nil if config.mesh or config.mesh.disabled is unset
  158. false
  159. )
  160. )
  161. fixup_wan(radio, index)
  162. end
  163. util.iterate_radios(configure_radio)
  164. if uci:get('system', 'rssid_wlan0') then
  165. if uci:get('wireless', 'mesh_radio0') then
  166. uci:set('system', 'rssid_wlan0', 'dev', 'mesh0')
  167. else
  168. uci:set('system', 'rssid_wlan0', 'dev', 'ibss0')
  169. end
  170. uci:save('system')
  171. end
  172. uci:save('wireless')
  173. uci:save('network')