#!/usr/bin/lua local site = require 'gluon.site_config' local util = require 'gluon.util' local uci = require('luci.model.uci').cursor() local function is_disabled(name) if uci:get('wireless', name) then return uci:get_bool('wireless', name, 'disabled') end end -- Returns the first argument that is not nil; don't call without any non-nil arguments! local function first_non_nil(first, ...) if first ~= nil then return first else return first_non_nil(...) end end local function configure_ibss(config, radio, index, suffix, disabled) local name = 'ibss_' .. radio uci:delete('network', name) uci:delete('network', name .. '_vlan') uci:delete('wireless', name) macaddr = util.generate_mac(3*(index-1)+2) if config and macaddr then if config.vlan then uci:section('network', 'interface', name, { proto = 'none', } ) uci:section('network', 'interface', name .. '_vlan', { ifname = '@' .. name .. '.' .. config.vlan, proto = 'batadv', mesh = 'bat0', } ) else uci:section('network', 'interface', name, { proto = 'batadv', mesh = 'bat0', } ) end uci:section('wireless', 'wifi-iface', name, { device = radio, network = name, mode = 'adhoc', ssid = config.ssid, bssid = config.bssid, macaddr = macaddr, mcast_rate = config.mcast_rate, ifname = suffix and 'ibss' .. suffix, disabled = disabled and 1 or 0, } ) end end local function configure_mesh(config, radio, index, suffix, disabled) local name = 'mesh_' .. radio local macfilter = uci:get('wireless', name, 'macfilter') local maclist = uci:get('wireless', name, 'maclist') uci:delete('network', name) uci:delete('wireless', name) macaddr = util.generate_mac(3*(index-1)+1) if config and macaddr then uci:section('network', 'interface', name, { proto = 'batadv', mesh = 'bat0', } ) uci:section('wireless', 'wifi-iface', name, { device = radio, network = name, mode = 'mesh', mesh_id = config.id, mesh_fwding = 0, macaddr = macaddr, mcast_rate = config.mcast_rate, ifname = suffix and 'mesh' .. suffix, disabled = disabled and 1 or 0, macfilter = macfilter, maclist = maclist, } ) end end local function configure_radio(radio, index, config) local suffix = radio:match('^radio(%d+)$') local ibss_disabled = is_disabled('ibss_' .. radio) local mesh_disabled = is_disabled('mesh_' .. radio) configure_ibss(config.ibss, radio, index, suffix, first_non_nil( ibss_disabled, mesh_disabled, (config.ibss or {}).disabled, -- will be nil if config.ibss or config.ibss.disabled is unset false ) ) configure_mesh(config.mesh, radio, index, suffix, first_non_nil( mesh_disabled, ibss_disabled, (config.mesh or {}).disabled, -- will be nil if config.mesh or config.mesh.disabled is unset false ) ) end util.iterate_radios(configure_radio) uci:save('wireless') uci:save('network')