gluon-mesh-babel: some initial work

This commit is contained in:
Nils Schneider 2015-08-16 01:04:35 +02:00 committed by root
parent 2a521f712d
commit 6f1fa9d8a1
19 changed files with 487 additions and 28 deletions

View File

@ -0,0 +1,31 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=gluon-l3roamd
PKG_VERSION:=1
PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
include $(INCLUDE_DIR)/package.mk
define Package/gluon-l3roamd
SECTION:=gluon
CATEGORY:=Gluon
TITLE:=Configure l3roamd for babel
DEPENDS:=+gluon-core +gluon-mesh-babel +l3roamd
endef
define Build/Prepare
mkdir -p $(PKG_BUILD_DIR)
endef
define Build/Configure
endef
define Build/Compile
endef
define Package/gluon-l3roamd/install
$(CP) ./files/* $(1)/
endef
$(eval $(call BuildPackage,gluon-l3roamd))

View File

@ -0,0 +1,16 @@
#!/bin/sh /etc/rc.common
START=50
USE_PROCD=1
PROG=/usr/bin/l3roamd
start_service () {
procd_open_instance
procd_set_param stdout 1
procd_set_param stderr 1
procd_set_param command "$PROG" -p $(lua -e 'print(require("gluon.site_config").prefix6)') -i br-client -m mesh0 -m br-wan -t 11
procd_close_instance
}

View File

@ -0,0 +1,26 @@
#!/usr/bin/lua
local uci = require('luci.model.uci').cursor()
local site = require 'gluon.site_config'
uci:delete('network', 'l3roam')
uci:section('network', 'interface', 'l3roam',
{
ifname = 'l3roam0',
proto = 'none',
}
)
uci:delete('network', 'l3roamd_client')
uci:section('network', 'route6', 'l3roamd_client',
{
interface = 'l3roam',
target = site.prefix6,
gateway = '::',
table = '10',
}
)
uci:save('network')
uci:commit('network')

View File

@ -0,0 +1,36 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=gluon-mesh-babel
PKG_VERSION:=1
PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
include $(GLUONDIR)/include/package.mk
define Package/gluon-mesh-babel
SECTION:=gluon
CATEGORY:=Gluon
TITLE:=Babel mesh
DEPENDS:=+gluon-core +gluon-radio-config +babeld
endef
define Build/Prepare
mkdir -p $(PKG_BUILD_DIR)
endef
define Build/Configure
endef
define Build/Compile
endef
define Package/gluon-mesh-babel/install
$(CP) ./files/* $(1)/
endef
define Package/gluon-mesh-babel/postinst
#!/bin/sh
$(call GluonCheckSite,check_site.lua)
endef
$(eval $(call BuildPackage,gluon-mesh-babel))

View File

@ -0,0 +1,2 @@
need_string_match('babel_mesh.prefix', '^[%x:]+/64$')
need_boolean('mesh_on_wan', false)

View File

@ -0,0 +1,27 @@
#!/usr/bin/lua
local uci = require('luci.model.uci').cursor()
uci:section('firewall', 'rule', 'wan_babel',
{
name = 'wan_babel',
src = 'wan',
src_ip = 'fe80::/64',
dest_port = '6696',
proto = 'udp',
target = 'ACCEPT',
}
)
uci:section('firewall', 'zone', 'mesh_babel',
{
name = 'mesh_babel',
input = 'ACCEPT',
output = 'ACCEPT',
forward = 'ACCEPT',
}
)
uci:save('firewall')
uci:commit('firewall')

View File

@ -0,0 +1,104 @@
#!/usr/bin/lua
local nixio = require 'nixio'
local sysconfig = require 'gluon.sysconfig'
local uci = require('luci.model.uci').cursor()
local site = require 'gluon.site_config'
function IPv6(address)
--[[
(c) 2008 Jo-Philipp Wich <xm@leipzig.freifunk.net>
(c) 2008 Steven Barth <steven@midlink.org>
Licensed under the Apache License, Version 2.0 (the "License").
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
]]--
local data = {}
local borderl = address:sub(1, 1) == ":" and 2 or 1
local borderh, zeroh, chunk, block
if #address > 45 then return nil end
repeat
borderh = address:find(":", borderl, true)
if not borderh then break end
block = tonumber(address:sub(borderl, borderh - 1), 16)
if block and block <= 0xFFFF then
data[#data+1] = block
else
if zeroh or borderh - borderl > 1 then return nil end
zeroh = #data + 1
end
borderl = borderh + 1
until #data == 7
chunk = address:sub(borderl)
if #chunk > 0 and #chunk <= 4 then
block = tonumber(chunk, 16)
if not block or block > 0xFFFF then return nil end
data[#data+1] = block
elseif #chunk > 4 then
if #data == 7 or #chunk > 15 then return nil end
borderl = 1
for i=1, 4 do
borderh = chunk:find(".", borderl, true)
if not borderh and i < 4 then return nil end
borderh = borderh and borderh - 1
block = tonumber(chunk:sub(borderl, borderh))
if not block or block > 255 then return nil end
if i == 1 or i == 3 then
data[#data+1] = block * 256
else
data[#data] = data[#data] + block
end
borderl = borderh and borderh + 2
end
end
if zeroh then
if #data == 8 then return nil end
while #data < 8 do
table.insert(data, zeroh, 0)
end
end
if #data == 8 then
return data[1], data[2], data[3], data[4], data[5], data[6], data[7], data[8]
end
end
function mac_to_ip(prefix, mac)
local m1, m2, m3, m6, m7, m8 = string.match(mac, '(%x%x):(%x%x):(%x%x):(%x%x):(%x%x):(%x%x)')
local m4 = 0xff
local m5 = 0xfe
m1 = nixio.bit.bxor(tonumber(m1, 16), 0x02)
local h1 = 0x100 * m1 + tonumber(m2, 16)
local h2 = 0x100 * tonumber(m3, 16) + m4
local h3 = 0x100 * m5 + tonumber(m6, 16)
local h4 = 0x100 * tonumber(m7, 16) + tonumber(m8, 16)
local prefix, plen = string.match(prefix, '(.*)/(%d+)')
plen = tonumber(plen, 10)
local p1, p2, p3, p4, p5, p6, p7, p8 = IPv6(prefix)
return string.format("%x:%x:%x:%x:%x:%x:%x:%x/%d", p1, p2, p3, p4, h1, h2, h3, h4, 128)
end
local ip = mac_to_ip(site.babel_mesh.prefix, sysconfig.primary_mac)
uci:set('network', 'loopback', 'ip6addr', ip)
uci:save('network')
uci:commit('network')

View File

@ -0,0 +1,34 @@
#!/usr/bin/lua
local uci = require('luci.model.uci').cursor()
local site = require 'gluon.site_config'
uci:section('babeld', 'general', 'gluon',
{
export_table = 10,
import_table = {
255,
11,
},
}
)
uci:section('network', 'rule6', 'babel_import_lookup',
{
lookup = 11,
priority = 64000,
}
)
uci:section('network', 'rule6', 'babel_export_lookup',
{
lookup = 10,
priority = 64100,
}
)
uci:save('babeld')
uci:save('network')
uci:commit('babeld')
uci:commit('network')

View File

@ -0,0 +1,52 @@
#!/usr/bin/lua
local uci = require('luci.model.uci').cursor()
local site = require 'gluon.site_config'
uci:section('babeld', 'filter', 'mesh_prefix',
{
type = 'redistribute',
ip = site.babel_mesh.prefix,
eq = 128,
action = 'allow',
}
)
uci:section('babeld', 'filter', 'client_prefix',
{
type = 'redistribute',
ip = site.prefix6,
eq = 128,
action = 'allow',
}
)
uci:section('babeld', 'filter', 'client_prefix',
{
type = 'redistribute',
ip = site.prefix6,
eq = 128,
action = 'allow',
}
)
uci:section('babeld', 'filter', 'local_deny',
{
type = 'redistribute',
['local'] = 1, -- local is a keyword
action = 'deny',
}
)
uci:section('babeld', 'filter', 'defaultroute',
{
type = 'redistribute',
ip = '::/0',
eq = 0,
action = 'allow',
}
)
uci:save('babeld')
uci:commit('babeld')

View File

@ -0,0 +1,79 @@
#!/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(config, name)
local disabled = config and config.disabled
if uci:get('wireless', name) then
disabled = uci:get_bool('wireless', name, 'disabled')
end
return disabled and 1 or 0
end
local function configure_mesh(config, radio, index, suffix)
local name = 'mesh_' .. radio
local disabled = is_disabled(config, name)
uci:delete('network', name)
uci:delete('wireless', name)
uci:delete('babeld', name)
if config then
uci:section('network', 'interface', name,
{
proto = 'none',
}
)
local ifname = 'mesh' .. suffix
uci:section('wireless', 'wifi-iface', name,
{
device = radio,
network = name,
mode = 'mesh',
mesh_id = config.id,
mesh_fwding = 0,
mcast_rate = config.mcast_rate,
ifname = ifname,
disabled = disabled,
}
)
uci:section('babeld', 'interface', name,
{
ifname = ifname,
}
)
local networks = uci:get_list('firewall', 'mesh_babel', 'network')
local set = {}
for _, l in ipairs(networks) do set[l] = true end
set[name] = true
networks = {}
for k, _ in pairs(set) do table.insert(networks, k) end
uci:set_list('firewall', 'mesh_babel', 'network', networks)
end
end
local function configure_radio(radio, index, config)
local suffix = radio:match('^radio(%d+)$')
configure_mesh(config.mesh, radio, index, suffix)
end
util.iterate_radios(configure_radio)
uci:save('wireless')
uci:save('network')
uci:save('babeld')
uci:save('firewall')
uci:commit('wireless')
uci:commit('network')
uci:commit('babeld')
uci:commit('firewall')

View File

@ -0,0 +1,23 @@
#!/usr/bin/lua
local uci = require('luci.model.uci').cursor()
local site = require 'gluon.site_config'
if site.mesh_on_wan then
uci:section('babeld', 'interface', 'mesh_wan',
{
ifname = 'br-wan',
}
)
uci:add_to_set('firewall', 'mesh_babel', 'network', 'wan')
end
uci:add_to_set('firewall', 'mesh_babel', 'network', 'client')
uci:add_to_set('firewall', 'mesh_babel', 'network', 'local_node4')
uci:add_to_set('firewall', 'mesh_babel', 'network', 'local_node6')
uci:save('babeld')
uci:save('firewall')
uci:commit('babeld')
uci:commit('firewall')

View File

@ -28,9 +28,4 @@ define Package/gluon-next-node-batman-adv/install
$(CP) ./files/* $(1)/ $(CP) ./files/* $(1)/
endef endef
define Package/gluon-next-node-batman-adv/postinst
#!/bin/sh
$(call GluonCheckSite,check_site.lua)
endef
$(eval $(call BuildPackage,gluon-next-node-batman-adv)) $(eval $(call BuildPackage,gluon-next-node-batman-adv))

View File

@ -1,4 +0,0 @@
need_string_match('next_node.ip4', '^%d+.%d+.%d+.%d+$')
need_string_match('next_node.ip6', '^[%x:]+$')
need_string_match('next_node.mac', '^%x[02468aAcCeE]:%x%x:%x%x:%x%x:%x%x:%x%x$')

View File

@ -11,7 +11,7 @@ define Package/gluon-next-node
SECTION:=gluon SECTION:=gluon
CATEGORY:=Gluon CATEGORY:=Gluon
TITLE:=Next-node anycast address TITLE:=Next-node anycast address
DEPENDS:=+gluon-core +gluon-client-bridge +kmod-macvlan +PACKAGE_gluon-mesh-batman-adv-core:gluon-next-node-batman-adv DEPENDS:=+gluon-core +gluon-client-bridge +kmod-macvlan
endef endef
define Package/gluon-next-node/description define Package/gluon-next-node/description

View File

@ -8,22 +8,32 @@ local c = uci.cursor()
c:delete('network', 'local_node_dev') c:delete('network', 'local_node_dev')
c:section('network', 'device', 'local_node_dev', c:section('network', 'device', 'local_node_dev',
{ {
name = 'local-node', name = 'local-node',
ifname = 'br-client', ifname = 'br-client',
type = 'macvlan', type = 'macvlan',
macaddr = site.next_node.mac, macaddr = site.next_node.mac,
} }
) )
c:delete('network', 'local_node') c:delete('network', 'local_node')
c:section('network', 'interface', 'local_node', c:delete('network', 'local_node4')
{ c:delete('network', 'local_node6')
ifname = 'local-node',
proto = 'static', c:section('network', 'interface', 'local_node4',
ipaddr = site.next_node.ip4 .. '/32', {
ip6addr = site.next_node.ip6 .. '/128', ifname = 'local-node',
} proto = 'static',
ipaddr = site.next_node.ip4 .. '/32',
}
)
c:section('network', 'interface', 'local_node6',
{
ifname = 'local-node',
proto = 'static_deprecated',
ip6addr = site.next_node.ip6,
}
) )
c:save('network') c:save('network')

View File

@ -0,0 +1,30 @@
#!/bin/sh
. /lib/functions.sh
. ../netifd-proto.sh
init_proto "$@"
proto_static_deprecated_init_config() {
renew_handler=1
proto_config_add_string 'ip6addr:ip6addr'
}
proto_static_deprecated_setup() {
local config="$1"
local iface="$2"
local ip6addr
json_get_vars ip6addr
proto_init_update "*" 1
proto_add_ipv6_address "$ip6addr" "" "0"
proto_send_update "$config"
}
proto_static_deprecated_teardown() {
local config="$1"
}
add_protocol static_deprecated

View File

@ -1,7 +1,7 @@
include $(TOPDIR)/rules.mk include $(TOPDIR)/rules.mk
PKG_NAME:=gluon-radvd PKG_NAME:=gluon-radvd
PKG_VERSION:=3 PKG_VERSION:=4
PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME) PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
@ -11,7 +11,7 @@ define Package/gluon-radvd
SECTION:=gluon SECTION:=gluon
CATEGORY:=Gluon CATEGORY:=Gluon
TITLE:=Advertise an IPv6 prefix from the node TITLE:=Advertise an IPv6 prefix from the node
DEPENDS:=+gluon-core +gluon-ebtables +gluon-mesh-batman-adv +uradvd DEPENDS:=+gluon-core +uradvd
endef endef
define Package/gluon-radvd/description define Package/gluon-radvd/description

View File

@ -7,7 +7,7 @@ SERVICE_DAEMONIZE=1
start() { start() {
service_start /usr/sbin/uradvd -i br-client -p $(lua -e 'print(require("gluon.site_config").prefix6)') service_start /usr/sbin/uradvd -i local-node -a $(lua -e 'print(require("gluon.site_config").prefix6)')
} }
stop() { stop() {

View File

@ -1,2 +0,0 @@
rule 'INPUT -p IPv6 --ip6-protocol ipv6-icmp --ip6-icmp-type router-solicitation -i bat0 -j DROP'
rule 'OUTPUT -p IPv6 --ip6-protocol ipv6-icmp --ip6-icmp-type router-advertisement -o bat0 -j DROP'