Zeile 794: |
Zeile 794: |
| uci commit firewall | | uci commit firewall |
| </pre> | | </pre> |
| + | |
| + | == Multihood == |
| + | |
| + | === /lib/netifd/proto/bat.sh === |
| + | Make executable |
| + | #!/bin/sh |
| + | |
| + | . /lib/functions.sh |
| + | . ../netifd-proto.sh |
| + | init_proto "$@" |
| + | |
| + | proto_bat_init_config() { |
| + | no_device=1 |
| + | available=1 |
| + | renew_handler=1 |
| + | |
| + | 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() { |
| + | local CONFIG="$1" |
| + | |
| + | 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" |
| + | batctl -m "$IFNAME" interface create |
| + | |
| + | batctl -m "$IFNAME" orig_interval 5000 |
| + | batctl -m "$IFNAME" hop_penalty "$(lookup_uci 'gluon.mesh_batman_adv.hop_penalty' 15)" |
| + | batctl -m "$IFNAME" multicast_mode 0 |
| + | |
| + | case "$gw_mode" in |
| + | server) |
| + | batctl -m "$IFNAME" gw_mode "server" |
| + | ;; |
| + | client) |
| + | local gw_sel_class="$(lookup_site 'mesh.batman_adv.gw_sel_class')" |
| + | if [ -n "$gw_sel_class" ]; then |
| + | batctl -m "$IFNAME" gw_mode "client" "$gw_sel_class" |
| + | else |
| + | batctl -m "$IFNAME" gw_mode "client" |
| + | fi |
| + | ;; |
| + | *) |
| + | batctl -m "$IFNAME" gw_mode "off" |
| + | ;; |
| + | esac |
| + | |
| + | |
| + | local primary0_mac="$(lua -e 'print(require("gluon.util").generate_mac(3))')" |
| + | |
| + | ip link add "pri-${IFNAME:4}" type dummy |
| + | echo 1 > /proc/sys/net/ipv6/conf/"pri-${IFNAME:4}"/disable_ipv6 |
| + | ip link set "pri-${IFNAME:4}" address "$primary0_mac" mtu 1532 up |
| + | |
| + | ip link set "$IFNAME" address "$(lua -e 'print(require("gluon.sysconfig").primary_mac)')" |
| + | |
| + | batctl -m "$IFNAME" interface add "pri-${IFNAME:4}" |
| + | |
| + | proto_init_update "pri-${IFNAME:4}" 1 |
| + | proto_init_update "$IFNAME" 1 |
| + | proto_send_update "$CONFIG" |
| + | |
| + | proto_bat_renew "$1" |
| + | } |
| + | |
| + | proto_bat_teardown() { |
| + | 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' |