Änderungen

3.147 Bytes hinzugefügt ,  17:18, 29. Mär. 2022
IPv6 Client Multidomain
Zeile 369: Zeile 369:  
option ifname 'eth0.15'
 
option ifname 'eth0.15'
 
option proto 'gluon_wired'
 
option proto 'gluon_wired'
 +
option disabled '0'
 
option transitive '1'
 
option transitive '1'
option disabled '0'
   
option macaddr '02:fb:e4:51:9a:15'
 
option macaddr '02:fb:e4:51:9a:15'
    
config interface 'mesh_vlan16'
 
config interface 'mesh_vlan16'
 
option ifname 'eth0.16'
 
option ifname 'eth0.16'
option proto 'batif'
+
option proto 'agravis_wired'
option mesh 'ol2'
+
option domain 'oldenburg2'
 +
option domainif 'ol2'
 +
option disabled '0'
 +
option transitive '1'
 
option macaddr '02:fb:e4:51:9a:16'
 
option macaddr '02:fb:e4:51:9a:16'
   Zeile 382: Zeile 385:  
option ifname 'eth0.17'
 
option ifname 'eth0.17'
 
option proto 'gluon_wired'
 
option proto 'gluon_wired'
 +
option disabled '0'
 
option transitive '1'
 
option transitive '1'
option disabled '0'
   
option macaddr '02:fb:e4:51:9a:17'
 
option macaddr '02:fb:e4:51:9a:17'
    
config interface 'mesh_vlan18'
 
config interface 'mesh_vlan18'
 
option ifname 'eth0.18'
 
option ifname 'eth0.18'
option index '0'
+
option proto 'gluon_wired'
 +
option disabled '0'
 
option transitive '1'
 
option transitive '1'
option disabled '0'
  −
option proto 'gluon_wired'
   
option macaddr '02:fb:e4:51:9a:18'
 
option macaddr '02:fb:e4:51:9a:18'
   Zeile 473: Zeile 475:  
config interface 'mesh_vlan30'
 
config interface 'mesh_vlan30'
 
option ifname 'eth0.30'
 
option ifname 'eth0.30'
option proto 'batif'
+
option proto 'agravis_wired'
option mesh 'rastede'
+
option domain 'rastede'
 +
option domainif 'rastede'
 +
option disabled '0'
 +
option transitive '1'
 
option macaddr '02:fb:e4:51:9a:30'
 
option macaddr '02:fb:e4:51:9a:30'
    
config interface 'mesh_vlan31'
 
config interface 'mesh_vlan31'
 
option ifname 'eth0.31'
 
option ifname 'eth0.31'
option proto 'batif'
+
option proto 'agravis_wired'
option mesh 'ol2'
+
option domain 'oldenburg2'
 +
option domainif 'ol2'
 +
option disabled '0'
 +
option transitive '1'
 
option macaddr '02:fb:e4:51:9a:31'
 
option macaddr '02:fb:e4:51:9a:31'
   Zeile 611: Zeile 619:  
config interface 'mesh_vlan50'
 
config interface 'mesh_vlan50'
 
option ifname 'eth0.50'
 
option ifname 'eth0.50'
option proto 'batif'
+
option proto 'agravis_wired'
option mesh 'ol2'
+
option domain 'oldenburg2'
 +
option domainif 'ol2'
 +
option disabled '0'
 +
option transitive '1'
 
option macaddr '02:fb:e4:51:9a:50'
 
option macaddr '02:fb:e4:51:9a:50'
   Zeile 747: Zeile 758:  
option transitive '1'
 
option transitive '1'
 
option macaddr '02:fb:e4:51:9a:69'
 
option macaddr '02:fb:e4:51:9a:69'
  −
config interface 'bat_ol2'
  −
option ifname 'bat-ol2'
  −
option gw_mode 'client'
  −
option proto 'bat'
  −
  −
config interface 'bat_rastede'
  −
option ifname 'bat-rastede'
  −
        option gw_mode 'client'               
  −
        option proto 'bat'
      
config interface 'mgmt'
 
config interface 'mgmt'
Zeile 765: Zeile 766:  
option ip4table '120'
 
option ip4table '120'
 
option ip6addr 'fe80::1'
 
option ip6addr 'fe80::1'
 +
 +
config rule
 +
option in 'mgmt'
 +
option goto '100000'
    
config interface 'client4'
 
config interface 'client4'
Zeile 770: Zeile 775:  
option auto '1'
 
option auto '1'
 
option proto 'dhcp'
 
option proto 'dhcp'
option ip4table '120'
+
option ip4table '100'
 +
 
 +
config rule 'routing_bat0'
 +
option priority '100000'
 +
option lookup '100'
 +
 
 +
config interface 'agravis_bat_ol2'
 +
option gw_mode 'client'
 +
option proto 'agravis_bat'
 +
option domain 'oldenburg2'
 +
option domainif 'ol2'
 +
 
 +
config interface 'bat_ol2'
 +
option multicast_router '2'
 +
option ifname 'bat-ol2'
 +
option auto '1'
 +
option macaddr 'b4:fb:e4:51:9a:46'
 +
option learning '1'
 +
option proto 'none'
 +
 
 +
config interface 'client_ol2'
 +
option ifname 'bat-ol2'
 +
option auto '1'
 +
option proto 'dhcp'
 +
option ipv6 '1'
 +
option ip4table '101'
 +
option ip6table '101'
 +
 
 +
config rule 'routing_ol2'
 +
option priority '100001'
 +
option lookup '101'
 +
 
 +
config rule6 'routing6_ol2'
 +
option priority '100001'
 +
option lookup '101'
 +
 
 +
config interface 'agravis_bat_rastede'
 +
option gw_mode 'client'
 +
option proto 'agravis_bat'
 +
option domain 'rastede'
 +
option domainif 'rastede'
 +
 
 +
config interface 'bat_rastede'
 +
option multicast_router '2'
 +
option ifname 'bat-rastede'
 +
option auto '1'
 +
option macaddr 'b4:fb:e4:51:9a:46'
 +
option learning '1'
 +
option proto 'none'
 +
 
 +
config interface 'client_rastede'
 +
option ifname 'bat-rastede'
 +
option auto '1'
 +
option proto 'dhcp'
 +
option ipv6 '1'
 +
option ip4table '102'
 +
option ip6table '102'
 +
 
 +
config rule 'routing_rastede'
 +
option priority '100002'
 +
option lookup '102'
   −
config rule
+
config rule6 'routing6_rastede'
option in 'mgmt'
+
option priority '100002'
option lookup '120'
+
option lookup '102'
    
</pre>
 
</pre>
Zeile 800: Zeile 865:     
== Multihood ==
 
== Multihood ==
 
+
/lib/gluon/upgrade/742-agravis
=== /lib/netifd/proto/bat.sh ===
  −
Make executable
   
  #!/bin/sh
 
  #!/bin/sh
   
+
  function mkifsetupteardown() {
. /lib/functions.sh
+
  mkdir "$2"
. ../netifd-proto.sh
+
  find "$1" -type d -print | sed -n "s|^$1/||p" | while IFS= read -r dir; do
init_proto "$@"
+
mkdir "$2/$dir"
+
  done
proto_bat_init_config() {
+
find "$1" -type f -print | sed -n "s|^$1/||p" | while IFS= read -r file; do
  no_device=1
+
sed 's/gluon_bat0/agravis_bat_$DOMAINIF/' "$1/$file" > "$2/$file"
available=1
+
  <nowiki> </nowiki>      chmod +x "$2/$file"
renew_handler=1
+
done
  −
proto_config_add_string 'gw_mode'
  −
}
  −
  −
lookup_site() {
  −
local path="$1" default="$2"
  −
  lua -e "print(require('gluon.site').$path('$default'))"
  −
}
  −
  −
lookup_uci() {
  −
local path="$1" default="$2"
  −
  uci -q get "$path" || echo "$default"
  −
}
  −
  −
proto_bat_renew() {
  −
local CONFIG="$1"
  −
  −
local ifname
  −
json_get_vars ifname
  −
  −
local IFNAME="${ifname:-$CONFIG}"
  −
  −
lock /var/lock/"$IFNAME".bat.lock
  −
  −
ubus call network.interface dump | jsonfilter \
  −
-e "@.interface[@.proto='batif' && @.data.mesh='${IFNAME:4}' && @.up=true].device" \
  −
| xargs -r -n 1 batctl -m "$IFNAME" interface add
  −
   
  −
lock -u /var/lock/"$IFNAME".bat.lock
   
  }
 
  }
 
   
 
   
  proto_bat_setup() {
+
  mkifsetupteardown "/lib/gluon/core/mesh/setup.d" "/lib/gluon/core/mesh/agravis-setup.d"
local CONFIG="$1"
+
  mkifsetupteardown "/lib/gluon/core/mesh/post-setup.d" "/lib/gluon/core/mesh/agravis-post-setup.d"
   
+
  mkifsetupteardown "/lib/gluon/core/mesh/teardown.d" "/lib/gluon/core/mesh/agravis-teardown.d"
local routing_algo=$(lookup_site 'mesh.batman_adv.routing_algo' 'BATMAN_IV')
  −
   
  −
local gw_mode ifname
  −
json_get_vars gw_mode ifname
  −
  −
local IFNAME="${ifname:-$CONFIG}"
   
   
 
   
batctl -m "$IFNAME" routing_algo "$routing_algo"
+
<nowiki>#</nowiki> TODO lua -e "print(require('gluon.site').$path('$default'))" returning correct site?
batctl -m "$IFNAME" interface create
+
sed -e 's/gluon_bat0.lock/agravis_bat_$domainif.lock/' \
 +
<nowiki> </nowiki>  -e 's/gluon_bat0/agravis_bat/' \
 +
<nowiki> </nowiki>  -e 's/local gw_mode/local gw_mode domain domainif/' \
 +
<nowiki> </nowiki>  -e 's/json_get_vars gw_mode/json_get_vars gw_mode domain domainif/' \
 +
<nowiki> </nowiki>  -e 's/primary0_/pri_/' \
 +
<nowiki> </nowiki>  -e 's/primary0/pri-$domainif/' \
 +
<nowiki> </nowiki>  -e 's/batctl/batctl -m "bat-$domainif"/' \
 +
<nowiki> </nowiki>  -e '/^proto_agravis_bat_renew() {$/{N;s/proto_agravis_bat_renew() {\n\tlocal config="$1"/proto_agravis_bat_renew() {\n\tlocal config="$1"\n\n\tlocal domain domainif\n\tjson_get_vars domain domainif/}' \
 +
<nowiki> </nowiki>  -e '/^proto_agravis_bat_teardown() {$/{N;s/proto_agravis_bat_teardown() {\n\tlocal config="$1"/proto_agravis_bat_teardown() {\n\tlocal config="$1"\n\n\tlocal domain domainif\n\tjson_get_vars domain domainif/}' \
 +
<nowiki> </nowiki>  -e "s/@.proto='gluon_mesh'/@.proto='agravis_mesh' \&\& @.data.domainif='\$domainif'/" \
 +
<nowiki> </nowiki>  -e "s/proto_config_add_string 'gw_mode'/proto_config_add_string 'gw_mode'\n\tproto_config_add_string 'domain'\n\tproto_config_add_string 'domainif'/" \
 +
<nowiki> </nowiki>  /lib/netifd/proto/gluon_bat0.sh >/lib/netifd/proto/agravis_bat.sh
 +
chmod +x /lib/netifd/proto/agravis_bat.sh
 
   
 
   
batctl -m "$IFNAME" orig_interval 5000
+
sed -e 's/gluon_mesh/agravis_mesh/' \
batctl -m "$IFNAME" hop_penalty "$(lookup_uci 'gluon.mesh_batman_adv.hop_penalty' 15)"
+
<nowiki> </nowiki>  -e 's!/lib/gluon/core/mesh/!/lib/gluon/core/mesh/agravis-!' \
batctl -m "$IFNAME" multicast_mode 0
+
<nowiki> </nowiki>  -e 's/local fixed_mtu transitive/local fixed_mtu transitive domain domainif/' \
 +
<nowiki> </nowiki>  -e 's/json_get_vars fixed_mtu transitive/json_get_vars fixed_mtu transitive domain domainif/' \
 +
<nowiki> </nowiki>  -e 's/export TRANSITIVE="${transitive:-0}"/export TRANSITIVE="${transitive:-0}"\n\texport DOMAIN="$domain"\n\texport DOMAINIF="$domainif"/' \
 +
<nowiki> </nowiki>  -e 's/json_add_boolean transitive "$TRANSITIVE"/json_add_boolean transitive "$TRANSITIVE"\n\tjson_add_string domain "$DOMAIN"\n\tjson_add_string domainif "$DOMAINIF"/' \
 +
<nowiki> </nowiki>  -e 's/proto_config_add_boolean transitive/proto_config_add_boolean transitive\n\tproto_config_add_string domain\n\tproto_config_add_string domainif/' \
 +
<nowiki> </nowiki>  -e 's!for script in /lib/gluon/core/mesh/agravis-teardown.d/!local domain domainif\n\tjson_get_vars domain domainif\n\texport DOMAIN="$domain"\n\texport DOMAINIF="$domainif"\n\n\tfor script in /lib/gluon/core/mesh/agravis-teardown.d/!' \
 +
<nowiki> </nowiki>  /lib/netifd/proto/gluon_mesh.sh >/lib/netifd/proto/agravis_mesh.sh
 +
chmod +x /lib/netifd/proto/agravis_mesh.sh
 
   
 
   
case "$gw_mode" in
+
sed -e 's/gluon_wired/agravis_wired/' \
server)
+
<nowiki> </nowiki>  -e 's/proto_config_add_string vxpeer6addr/proto_config_add_string vxpeer6addr\n\tproto_config_add_string domain\n\tproto_config_add_string domainif/' \
batctl -m "$IFNAME" gw_mode "server"
+
<nowiki> </nowiki>  -e 's/local transitive index vxlan vxpeer6addr/local transitive index vxlan vxpeer6addr domain domainif/' \
;;
+
<nowiki> </nowiki>  -e 's/json_get_vars transitive index vxlan vxpeer6addr/json_get_vars transitive index vxlan vxpeer6addr domain domainif/' \
client)
+
<nowiki> </nowiki>  -e "s/json_add_string proto 'gluon_mesh'/json_add_string proto 'agravis_mesh'\n\tjson_add_string domain \"\$domain\"\n\tjson_add_string domainif \"\$domainif\"/" \
local gw_sel_class="$(lookup_site 'mesh.batman_adv.gw_sel_class')"
+
<nowiki> </nowiki>  -e "s#require(\"gluon.util\").domain_seed_bytes(#require(\"gluon.agravis\").domain_seed_bytes(\"'\"\$(cat /lib/gluon/domains/\"\$domain\".json | jsonfilter -e \"@.domain_seed\")\"'\", #" \
if [ -n "$gw_sel_class" ]; then
+
<nowiki> </nowiki>  /lib/netifd/proto/gluon_wired.sh >/lib/netifd/proto/agravis_wired.sh
batctl -m "$IFNAME" gw_mode "client" "$gw_sel_class"
+
chmod +x /lib/netifd/proto/agravis_wired.sh
else
  −
batctl -m "$IFNAME" gw_mode "client"
  −
fi
  −
;;
  −
*)
  −
batctl -m "$IFNAME" gw_mode "off"
  −
;;
  −
esac
   
   
 
   
 +
cat <<EOF >/usr/lib/lua/gluon/agravis.lua
 +
local util = require 'gluon.util'
 
   
 
   
local primary0_mac="$(lua -e 'print(require("gluon.util").generate_mac(3))')"
+
local M = {}
 
   
 
   
ip link add "pri-${IFNAME:4}" type dummy
+
function M.domain_seed_bytes(domain_seed, key, length)
  echo 1 > /proc/sys/net/ipv6/conf/"pri-${IFNAME:4}"/disable_ipv6
+
  local ret = <nowiki>''</nowiki>
ip link set "pri-${IFNAME:4}" address "$primary0_mac" mtu 1532 up
+
  local v = <nowiki>''</nowiki>
 
+
  local i = 0
  ip link set "$IFNAME" address "$(lua -e 'print(require("gluon.sysconfig").primary_mac)')"
   
   
 
   
  batctl -m "$IFNAME" interface add "pri-${IFNAME:4}"
+
  -- Inspired by HKDF key expansion, but much simpler, as we don't need
 +
-- cryptographic strength
 +
while ret:len() < 2*length do
 +
i = i + 1
 +
v = hash.md5(v .. key .. domain_seed:lower() .. i)
 +
ret = ret .. v
 +
end
 
   
 
   
  proto_init_update "pri-${IFNAME:4}" 1
+
  return ret:sub(0, 2*length)
proto_init_update "$IFNAME" 1
+
end
proto_send_update "$CONFIG"
   
   
 
   
proto_bat_renew "$1"
+
return M
  }
+
  EOF
 
   
 
   
  proto_bat_teardown() {
+
  sed -i "s/@.proto='gluon_mesh'/(@.proto='gluon_mesh' || @.proto='agravis_mesh')/" /etc/init.d/gluon-respondd
local CONFIG="$1"
  −
local IFNAME="$2"
  −
  −
batctl -m "$IFNAME" interface destroy
  −
ip link del "pri-${IFNAME:4}"
  −
}
  −
  −
add_protocol bat
  −
 
  −
=== /lib/netifd/proto/batif.sh ===
  −
Make executable
  −
#!/bin/sh
  −
  −
. /lib/functions.sh
  −
. ../netifd-proto.sh
  −
init_proto "$@"
  −
  −
proto_batif_init_config() {
  −
proto_config_add_string 'mesh'
  −
}
  −
  −
proto_batif_setup() {
  −
local CONFIG="$1"
  −
local IFNAME="$2"
  −
  −
local mesh
  −
json_get_vars mesh
  −
  −
ubus call network.interface."$CONFIG" set_data "{\"mesh\":\"$mesh\"}"
  −
  −
proto_init_update "$IFNAME" 1
  −
proto_send_update "$CONFIG"
  −
  −
ubus call network.interface."bat_${mesh}" renew
  −
}
  −
  −
proto_batif_teardown() {
  −
local CONFIG="$1"
  −
local IFNAME="$2"
  −
  −
batctl -m "bat-${mesh}" interface -M del "$IFNAME" 2>/dev/null
  −
}
  −
  −
add_protocol batif
  −
 
  −
=== Beispiel Netzwerkkonfiguration ===
  −
config interface 'mesh_vlan123'
  −
option ifname 'eth0.123'
  −
option proto 'batif'
  −
option mesh 'hood2'
  −
   
  −
config interface 'bat_hood2'
  −
option ifname 'bat-hood2'
  −
option gw_mode 'client'
  −
option proto 'bat'