diff --git a/package/gluon-client-bridge/luasrc/lib/gluon/upgrade/320-gluon-client-bridge-wireless b/package/gluon-client-bridge/luasrc/lib/gluon/upgrade/320-gluon-client-bridge-wireless index d9ac83f3..0ed0f4cb 100755 --- a/package/gluon-client-bridge/luasrc/lib/gluon/upgrade/320-gluon-client-bridge-wireless +++ b/package/gluon-client-bridge/luasrc/lib/gluon/upgrade/320-gluon-client-bridge-wireless @@ -3,6 +3,8 @@ local util = require 'gluon.util' local uci = require('simple-uci').cursor() +local sysconfig = require 'gluon.sysconfig' +local iwinfo = require 'iwinfo' local function is_disabled(config, name) @@ -13,6 +15,8 @@ local function is_disabled(config, name) return config.disabled(false) end +local has_client_radio = false + util.foreach_radio(uci, function(radio, index, config) local radio_name = radio['.name'] @@ -22,6 +26,10 @@ util.foreach_radio(uci, function(radio, index, config) local ap = config.ap local disabled = is_disabled(ap, name) + if not util.supports_channel(radio, config.channel()) then + has_client_radio = true + end + uci:delete('wireless', name) if not ap() then @@ -44,4 +52,16 @@ util.foreach_radio(uci, function(radio, index, config) }) end) +if not sysconfig.gluon_version and has_client_radio then + util.foreach_radio(uci, function(radio, index, config) + local radio_name = radio['.name'] + + local name = 'client_' .. radio_name + + if util.supports_channel(radio, config.channel()) and (radio.hwmode == '11a' or radio.hwmode == '11na') then + uci:set('wireless', name, 'disabled', true) + end + end) +end + uci:save('wireless') diff --git a/package/gluon-core/luasrc/lib/gluon/upgrade/200-wireless b/package/gluon-core/luasrc/lib/gluon/upgrade/200-wireless index eb120404..62fa9172 100755 --- a/package/gluon-core/luasrc/lib/gluon/upgrade/200-wireless +++ b/package/gluon-core/luasrc/lib/gluon/upgrade/200-wireless @@ -56,7 +56,8 @@ local function get_channel(radio, config) if uci:get_first('gluon-core', 'wireless', 'preserve_channels') then -- preserved channel always wins channel = radio.channel - elseif (radio.hwmode == '11a' or radio.hwmode == '11na') and is_outdoor() then + + elseif (radio.hwmode == '11a' or radio.hwmode == '11na') and (is_outdoor() or not util.supports_channel(radio, config.channel())) then -- actual channel will be picked and probed from chanlist channel = 'auto' end @@ -251,7 +252,7 @@ util.foreach_radio(uci, function(radio, index, config) uci:set('wireless', radio_name, 'legacy_rates', false) configure_mesh_wireless(radio, index, config) elseif (hwmode == '11a' or hwmode == '11na') then - if is_outdoor() then + if is_outdoor() or not util.supports_channel(radio, config.channel()) then uci:set('wireless', radio_name, 'channels', config.outdoor_chanlist()) -- enforce outdoor channels by filtering the regdom for outdoor channels @@ -275,7 +276,6 @@ util.foreach_radio(uci, function(radio, index, config) fixup_wan(radio, index) end) - if uci:get('system', 'rssid_wlan0') then if uci:get('wireless', 'mesh_radio0') then uci:set('system', 'rssid_wlan0', 'dev', 'mesh0') diff --git a/package/gluon-core/luasrc/usr/lib/lua/gluon/util.lua b/package/gluon-core/luasrc/usr/lib/lua/gluon/util.lua index 4e7e11ee..de64acc7 100644 --- a/package/gluon-core/luasrc/usr/lib/lua/gluon/util.lua +++ b/package/gluon-core/luasrc/usr/lib/lua/gluon/util.lua @@ -157,6 +157,16 @@ function M.find_phy(config) end end +local function supports_channel(radio, channel) + local phy = M.find_phy(radio) + for i, chan in ipairs(iwinfo.nl80211.freqlist(phy)) do + if channel == chan.channel then + return true + end + end + return false +end + local function get_addresses(radio) local phy = M.find_phy(radio) if not phy then