Skip to content

Commit

Permalink
gluon-mesh-batman-adv: refactor interface management
Browse files Browse the repository at this point in the history
We now create bat0 and primary0 independently of the lower mesh interfaces,
making the whole setup a lot more robust. In particular:

- we can't accidentially destroy primary0 because of concurrent setup and
  teardown runs of different interfaces
- bat0 will always exist, even when no mesh interfaces are up (e.g. no link
  on wired mesh)
- interfaces going down and up again will never tear down the whole of
  batman-adv
- we can enable and disable bat0 independently of the lower interface
  states
  • Loading branch information
neocturne committed Apr 12, 2017
1 parent 4ca67dc commit e45c303
Show file tree
Hide file tree
Showing 6 changed files with 82 additions and 68 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
#!/bin/sh

ubus call network.interface.gluon_bat0 renew
Original file line number Diff line number Diff line change
@@ -1,3 +1,13 @@
#!/bin/sh

exec /lib/gluon/mesh-batman-adv/config_mesh_interface setup
if [ "$FIXED_MTU" -eq 0 ]; then
# In case on VLAN on IBSS, first set MTU of the underlying interface
for lower in /sys/class/net/"$IFNAME"/lower_*/wireless; do
lower="${lower%%\/wireless}"
lower="${lower##*\/lower_}"
ip link set dev "$lower" mtu 1536
break
done

ip link set dev "$IFNAME" mtu 1532
fi
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
#!/bin/sh

exec /lib/gluon/mesh-batman-adv/config_mesh_interface teardown
lock /var/lock/gluon_bat0.lock
(echo 'none' > "/sys/class/net/$IFNAME/batman_adv/mesh_iface") 2>/dev/null
lock -u /var/lock/gluon_bat0.lock
59 changes: 59 additions & 0 deletions package/gluon-mesh-batman-adv/files/lib/netifd/proto/gluon_bat0.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
#!/bin/sh

. /lib/functions.sh
. ../netifd-proto.sh
init_proto "$@"

proto_gluon_bat0_init_config() {
no_device=1
available=1
renew_handler=1
}

proto_gluon_bat0_renew() {
local config="$1"

lock /var/lock/gluon_bat0.lock

local ifdump="$(ubus call network.interface dump)"

echo "$ifdump" | jsonfilter \
-e "@.interface[@.proto='gluon_mesh' && @.up=true]['device','data']" \
| while read dev; do
read data

echo bat0 > "/sys/class/net/$dev/batman_adv/mesh_iface"

! [ "$(echo "$data" | jsonfilter -e "@.transitive")" = 'true' ]
transitive=$?

(echo "$transitive" > "/sys/class/net/$dev/batman_adv/no_rebroadcast") 2>/dev/null
done

lock -u /var/lock/gluon_bat0.lock
}

proto_gluon_bat0_setup() {
local config="$1"

local primary0_mac="$(lua -lgluon.util -e 'print(gluon.util.generate_mac(3))')"

ip link add primary0 type dummy
echo 1 > /proc/sys/net/ipv6/conf/primary0/disable_ipv6
ip link set primary0 address "$primary0_mac" mtu 1532 up
echo bat0 > /sys/class/net/primary0/batman_adv/mesh_iface

proto_init_update primary0 1
proto_send_update "$config"

proto_gluon_bat0_renew "$1"
}

proto_gluon_bat0_teardown() {
local config="$1"

ip link del bat0
ip link del primary0
}

add_protocol gluon_bat0

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,16 @@ uci:section('batman-adv', 'mesh', 'bat0', {
})
uci:save('batman-adv')

uci:delete('network', 'gluon_bat0')
uci:section('network', 'interface', 'gluon_bat0', {
proto = 'gluon_bat0',
})

uci:delete('network', 'bat0')
uci:section('network', 'interface', 'bat0', {
ifname = 'bat0',
proto = 'none',
auto = true,
macaddr = sysconfig.primary_mac,
multicast_router = 2,
learning = false,
Expand Down

0 comments on commit e45c303

Please sign in to comment.