diff --git a/package/gluon-core/luasrc/lib/gluon/upgrade/200-wireless b/package/gluon-core/luasrc/lib/gluon/upgrade/200-wireless index da644f5b..b9d0ff80 100755 --- a/package/gluon-core/luasrc/lib/gluon/upgrade/200-wireless +++ b/package/gluon-core/luasrc/lib/gluon/upgrade/200-wireless @@ -202,6 +202,62 @@ local function configure_mesh(config, radio, index, suffix, disabled) }) end +local function configure_p2p(config, radio, index, suffix, disabled) + local radio_name = radio['.name'] + local name = 'p2p_' .. radio_name + + local macfilter = uci:get('wireless', name, 'macfilter') + local maclist = uci:get('wireless', name, 'maclist') + + uci:delete('wireless', name) + + if not config then + return + end + + local macaddr = wireless.get_wlan_mac(uci, radio, index, 2) + if not macaddr then + return + end + + local master = uci:get('wireless', radio_name, '_p2pid') or string.sub(string.gsub(sysconfig.primary_mac, ':', ''), 8) + local mode = uci:get('wireless', radio_name, '_p2pmode') or 'master' + + local p2pmode = nil + + if mode == 'master' then + p2pmode = 'p2p-go' + end + + if mode == 'slave' then + p2pmode = 'p2p-client' + end + + if p2pmode == nil then + return + end + + -- FIXME: id + -- FIXME: static ip stuffs + + uci:section('network', 'interface', name, { + proto = 'gluon_mesh', + ifname = suffix and 'p2p' .. suffix, + }) + + uci:section('wireless', 'wifi-iface', name, { + device = radio_name, + network = name, + mode = p2pmode, + macaddr = macaddr, + mcast_rate = config.mcast_rate, + ifname = suffix and 'p2p' .. suffix, + disabled = disabled, + macfilter = macfilter, + maclist = maclist, + }) +end + local function fixup_wan(radio, index) local radio_name = radio['.name'] local name = 'wan_' .. radio_name @@ -223,9 +279,18 @@ local function configure_mesh_wireless(radio, index, config, disabled) local suffix = radio_name:match('^radio(%d+)$') local ibss_disabled = is_disabled('ibss_' .. radio_name) + local mesh_disabled = is_disabled('p2p_' .. radio_name) local mesh_disabled = is_disabled('mesh_' .. radio_name) - if radio.band ~= '60g' then + if radio.band == '60g' then + configure_p2p(config.mesh(), radio, index, suffix, + first_non_nil( + p2p_disabled, + mesh_disabled, + config.mesh.disabled(false) + ) + ) + else configure_ibss(config.ibss(), radio, index, suffix, first_non_nil( ibss_disabled, @@ -233,14 +298,14 @@ local function configure_mesh_wireless(radio, index, config, disabled) config.ibss.disabled(false) ) ) - end - configure_mesh(config.mesh(), radio, index, suffix, - first_non_nil( - mesh_disabled, - ibss_disabled, - config.mesh.disabled(false) + configure_mesh(config.mesh(), radio, index, suffix, + first_non_nil( + mesh_disabled, + ibss_disabled, + config.mesh.disabled(false) + ) ) - ) + end end wireless.foreach_radio(uci, function(radio, index, config) diff --git a/package/gluon-web-wifi-config/luasrc/lib/gluon/config-mode/model/admin/wifi-config.lua b/package/gluon-web-wifi-config/luasrc/lib/gluon/config-mode/model/admin/wifi-config.lua index 87b8972e..9bcda0fe 100644 --- a/package/gluon-web-wifi-config/luasrc/lib/gluon/config-mode/model/admin/wifi-config.lua +++ b/package/gluon-web-wifi-config/luasrc/lib/gluon/config-mode/model/admin/wifi-config.lua @@ -2,6 +2,7 @@ local iwinfo = require 'iwinfo' local uci = require("simple-uci").cursor() local site = require 'gluon.site' local wireless = require 'gluon.wireless' +local sysconfig = require 'gluon.sysconfig' local function txpower_list(phy) @@ -100,11 +101,37 @@ uci:foreach('wireless', 'wifi-device', function(config) if not is_60ghz then vif_option('client', {'client', 'owe'}, translate('Enable client network (access point)')) vif_option('ibss', {'ibss'}, translate("Enable mesh network (IBSS, outdated)")) + + local mesh_vif = vif_option('mesh', {'mesh'}, translate("Enable mesh network (802.11s)")) + if is_5ghz then + table.insert(mesh_vifs_5ghz, mesh_vif) + end end - local mesh_vif = vif_option('mesh', {'mesh'}, translate("Enable mesh network (802.11s)")) - if is_5ghz then - table.insert(mesh_vifs_5ghz, mesh_vif) + if is_60ghz then + -- leftover todos for 60ghz + -- - since client AP on 60ghz makes no sense (and additional APs can't be created due to limit of 1 device) + -- a function would be needed to say "device.supports_access_points()" or "device.client_facing()" or similar + -- that would return a bool whether to setup & show private AP, client AP, etc options + -- - 802.11s on 60ghz may or may not become a thing + -- could be handeled dynamically. a toggle to switch between p2p and mesh if driver supports it. + local vif = vif_option('p2p', {'p2p'}, translate('Enable point-to-point mesh')) + local id = p:option(Value, radio .. '_p2pid', translate('Master ID')) + id.datatype = "maxlength(32)" + id.default = uci:get('wireless', radio, '_p2pid') or 'g-' .. string.sub(string.gsub(sysconfig.primary_mac, ':', ''), 8) + id:depends(vif, true) + function id:write(data) + uci:set('wireless', radio, '_p2pid', data) + end + + local mode = p:option(ListValue, radio .. '_p2pmode', translate("P2P Mode (master/GO - slave/client)")) + mode.default = uci:get('wireless', radio, '_p2pmode') or 'master' + mode:value('master', translate('Master')) + mode:value('slave', translate('Slave')) + mode:depends(vif, true) + function mode:write(data) + uci:set('wireless', radio, '_p2pmode', data) + end end local phy = wireless.find_phy(config)