200-wireless 4.6 KB

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