Skip to content
Snippets Groups Projects
Unverified Commit 8343278b authored by Matthias Schiffer's avatar Matthias Schiffer
Browse files

Merge branch 'mesh-proto'

parents fb587e9b d05cee5b
No related branches found
No related tags found
No related merge requests found
Showing
with 83 additions and 242 deletions
#!/usr/bin/lua
local site = require 'gluon.site_config'
local uci = require('luci.model.uci').cursor()
local function configure_mtu(radio, config, mtu)
if config.ibss then
local network = 'ibss_' .. radio
if config.ibss.vlan then
uci:set('network', network, 'mtu', mtu + 4)
uci:set('network', network .. '_vlan', 'mtu', mtu)
else
uci:set('network', network, 'mtu', mtu)
end
end
if config.mesh then
uci:set('network', 'mesh_' .. radio, 'mtu', mtu)
end
end
local radios = {}
uci:foreach('wireless', 'wifi-device',
function(s)
table.insert(radios, s['.name'])
end
)
local mtu = 1532
for _, radio in ipairs(radios) do
local hwmode = uci:get('wireless', radio, 'hwmode')
if hwmode == '11g' or hwmode == '11ng' then
configure_mtu(radio, site.wifi24, mtu)
elseif hwmode == '11a' or hwmode == '11na' then
configure_mtu(radio, site.wifi5, mtu)
end
end
uci:save('network')
......@@ -13,7 +13,7 @@ define Package/gluon-mesh-batman-adv-core
SECTION:=gluon
CATEGORY:=Gluon
TITLE:=Support for batman-adv meshing (core)
DEPENDS:=+gluon-core +libgluonutil +gluon-client-bridge +firewall +libiwinfo
DEPENDS:=+gluon-core +libgluonutil +gluon-client-bridge +firewall +libiwinfo +kmod-dummy
endef
define Build/Prepare
......
#!/usr/bin/lua
local util = require 'gluon.util'
local fs = require 'nixio.fs'
local ifname = os.getenv('IFNAME')
local cmd = arg[1]
if cmd == 'setup' then
local fixed_mtu = tonumber(os.getenv('FIXED_MTU')) or 0
local transitive = tonumber(os.getenv('TRANSITIVE')) or 0
local mtu = tonumber(arg[2])
if os.execute('ip link show primary0 >/dev/null 2>&1') ~= 0 then
os.execute([[
ip link add primary0 type dummy
echo 1 > /proc/sys/net/ipv6/conf/primary0/disable_ipv6
ip link set primary0 address ]] .. util.generate_mac(3) .. [[ mtu ]] .. mtu .. [[ up
echo 'bat0' > /sys/class/net/primary0/batman_adv/mesh_iface
]])
end
if fixed_mtu == 0 then
local lower = fs.glob('/sys/class/net/' .. ifname .. '/lower_*/wireless')()
if lower then
lower = lower:match('/lower_([^/]+)/wireless$')
util.exec('ip', 'link', 'set', 'dev', lower, 'mtu', tostring(mtu+4))
end
util.exec('ip', 'link', 'set', 'dev', ifname, 'mtu', tostring(mtu))
end
local file = assert(io.open('/sys/class/net/' .. ifname .. '/batman_adv/mesh_iface', 'w'))
file:write('bat0')
file:close()
file = assert(io.open('/sys/class/net/' .. ifname .. '/batman_adv/no_rebroadcast', 'w'))
file:write(tostring(transitive))
file:close()
elseif cmd == 'teardown' then
local file = io.open('/sys/class/net/' .. ifname .. '/batman_adv/mesh_iface', 'w')
if file then
file:write('none')
file:close()
end
local other = false
for lower in fs.glob('/sys/class/net/bat0/lower_*') do
if lower ~= '/sys/class/net/bat0/lower_primary0' then
other = true
break
end
end
if not other then
os.execute('ip link del primary0')
end
end
......@@ -5,7 +5,6 @@ local sysctl = require 'gluon.sysctl'
local site = require 'gluon.site_config'
local uci = require('luci.model.uci').cursor()
local lutil = require 'luci.util'
local gw_sel_class
......@@ -25,15 +24,8 @@ uci:section('batman-adv', 'mesh', 'bat0',
)
uci:save('batman-adv')
if not uci:get('network', 'client', 'ifname') then
uci:add_to_set('network', 'client', 'ifname', 'bat0')
if sysconfig.lan_ifname and not site.mesh_on_lan then
for _, lanif in ipairs(lutil.split(sysconfig.lan_ifname, ' ')) do
uci:add_to_set('network', 'client', 'ifname', lanif)
end
end
end
uci:add_to_set('network', 'client', 'ifname', 'bat0')
uci:set('network', 'client', 'proto', 'dhcpv6')
uci:set('network', 'client', 'reqprefix', 'no')
......
......@@ -4,6 +4,7 @@ local util = require 'gluon.util'
local uci = require('luci.model.uci').cursor()
-- fix up duplicate mac addresses (for mesh-on-WAN)
uci:set('network', 'wan', 'macaddr', util.get_mac(1))
-- fix up potentially duplicate MAC addresses (for meshing)
uci:set('network', 'wan', 'macaddr', util.generate_mac(0))
uci:set('network', 'mesh_lan', 'macaddr', util.generate_mac(4))
uci:save('network')
#!/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)
if not config then
return
end
local macaddr = util.get_wlan_mac(radio, index, 3)
if not macaddr then
return
end
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
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)
if not config then
return
end
local macaddr = util.get_wlan_mac(radio, index, 2)
if not macaddr then
return
end
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
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')
#!/usr/bin/lua
local site = require 'gluon.site_config'
local uci = require 'luci.model.uci'
local c = uci.cursor()
if not c:get('network', 'mesh_wan') then
c:section('network', 'interface', 'mesh_wan',
{ ifname = 'br-wan'
, proto = 'batadv'
, mesh = 'bat0'
, mesh_no_rebroadcast = '1'
, auto = site.mesh_on_wan and 1 or 0
})
end
c:save('network')
#!/usr/bin/lua
local uci = require('luci.model.uci').cursor()
if uci:get('system', 'rssid_wlan0') then
if uci:get('wireless', 'mesh_radio0') then
uci:set('system', 'rssid_wlan0', 'dev', 'mesh0')
else
uci:set('system', 'rssid_wlan0', 'dev', 'ibss0')
end
uci:save('system')
end
......@@ -122,13 +122,13 @@ uci:save('fastd')
uci:section('network', 'interface', 'mesh_vpn',
{
ifname = 'mesh-vpn',
proto = 'batadv',
mesh = 'bat0',
mesh_no_rebroadcast = 1,
macaddr = util.get_mac(3),
}
{
ifname = 'mesh-vpn',
proto = 'gluon_mesh',
transitive = 1,
fixed_mtu = 1,
macaddr = util.generate_mac(7),
}
)
uci:save('network')
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment