Skip to content
Closed
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion packages/lime-proto-batadv/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ define Package/$(PKG_NAME)
CATEGORY:=LiMe
MAINTAINER:=Gioacchino Mazzurco <gio@eigenlab.org>
URL:=http://libremesh.org
DEPENDS:=+lime-system +lua +libuci-lua +kmod-batman-adv +kmod-dummy
DEPENDS:=+lime-system +lua +libuci-lua +kmod-batman-adv
PKGARCH:=all
endef

Expand Down
26 changes: 11 additions & 15 deletions packages/lime-proto-batadv/files/usr/lib/lua/lime/proto/batadv.lua
Original file line number Diff line number Diff line change
Expand Up @@ -34,20 +34,6 @@ function batadv.configure(args)
uci:save("batman-adv")
lan.setup_interface("bat0", nil)

--! Avoid dmesg flooding caused by BLA. Create a dummy0 interface with
--! custom MAC, as dummy0 is created very soon on boot it is added as
--! first and then main interface to batman so BLA messages are sent
--! from that MAC avoiding generating warning like:
--! br-lan: received packet on bat0 with own address as source address
local owrtInterfaceName = network.limeIfNamePrefix.."batadv_dummy_if"
local dummyMac = network.primary_mac(); dummyMac[1] = "aa"
uci:set("network", owrtInterfaceName, "interface")
uci:set("network", owrtInterfaceName, "ifname", "dummy0")
uci:set("network", owrtInterfaceName, "macaddr", table.concat(dummyMac, ":"))
uci:set("network", owrtInterfaceName, "proto", "batadv")
uci:set("network", owrtInterfaceName, "mesh", "bat0")
uci:save("network")

-- enable alfred on bat0 if installed
if utils.is_installed("alfred") then
uci:set("alfred", "alfred", "batmanif", "bat0")
Expand All @@ -58,13 +44,13 @@ end
function batadv.setup_interface(ifname, args)
if not args["specific"] then
if ifname:match("^wlan%d+.ap") then return end
if ifname:match("^eth") then return end
end

local vlanId = args[2] or "%N1"
local vlanProto = args[3] or "8021ad"
local nameSuffix = args[4] or "_batadv"
local mtu = 1532
if ifname:match("^eth") then mtu = 1496 end

--! Unless a specific integer is passed, parse network_id (%N1) template
--! and use that number to get a vlanId between 29 and 284 for batadv
Expand All @@ -74,8 +60,18 @@ function batadv.setup_interface(ifname, args)

local owrtInterfaceName, _, owrtDeviceName = network.createVlanIface(ifname, vlanId, nameSuffix, vlanProto)

--! Avoid dmesg flooding caused by BLA with messages like "br-lan:
--! received packet on bat0 with own address as source address".
--! Randomize MAC address for each of the interfaces included in Batman-adv.
local id = utils.get_id(ifname)
local randomMac = network.primary_mac();
randomMac[1] = id[1]
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Some bits of first byte of the mac have special meanings, so it cannot be totally random. Also at first glance I think we can just change the firs two bytes with something fixed making sure multicast bit is 0 and locally administered bit is 1 https://en.wikipedia.org/wiki/MAC_address#/media/File:MAC-48_Address.svg

randomMac[2] = id[2]
randomMac[3] = id[3]

local uci = config.get_uci_cursor()
uci:set("network", owrtDeviceName, "mtu", mtu)
uci:set("network", owrtDeviceName, "macaddr", table.concat(randomMac, ":"))
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This used to break linux 802.1{ad,q} at least when bridges and vlans operates on same hard interface, if the mac of the vlan is different from the one on the hard interface (what you are doing here) the packets get sucked by the bridge and never get to the vlan interface. I haven't tested this recently but this happened at least until last libremesh stable release.

uci:set("network", owrtInterfaceName, "proto", "batadv")
uci:set("network", owrtInterfaceName, "mesh", "bat0")
uci:save("network")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,6 @@ currUptime="$(get_uptime)"

candidateAddresses="$(
for iface in $(ls /sys/class/net/) ; do
echo ${iface} | grep -q '^dummy' && continue
ls /sys/class/net/${iface}/upper_bat? &> /dev/null || continue

ping6 -c 2 ff02::1%${iface} 2> /dev/null | \
Expand Down