-
Notifications
You must be signed in to change notification settings - Fork 325
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
gluon-mesh-batman-adv-brmldproxy: add package #2995
Open
T-X
wants to merge
4
commits into
freifunk-gluon:main
Choose a base branch
from
T-X:pr-gluon-mesh-batman-adv-brmldproxy
base: main
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Changes from all commits
Commits
Show all changes
4 commits
Select commit
Hold shift + click to select a range
ebd3621
gluon-mesh-batman-adv-brmldproxy: add package
T-X 2be84b1
gluon-mesh-batman-adv-brmldproxy: avoid MLD report broadcasts
T-X 453dd8f
gluon-mesh-batman-adv-brmldproxy: don't filter incoming MLD Reports
T-X f770514
gluon-mesh-batman-adv-brmldproxy: enable proxied querier with mc routers
T-X File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
gluon-mesh-batman-adv-brmldproxy | ||
================================ | ||
|
||
The *gluon-mesh-batman-adv-brmldproxy* package adds configuration | ||
to enable `brmldproxy`_ in Gluon with batman-adv. | ||
|
||
If `filter_membership_reports` :ref:`site.conf <user-site-mesh>` is false in the site.conf | ||
then no multicast listener is filtered, but the node will | ||
respond on behalf of any of its local listeners, potentially | ||
reducing duplicate MLD report overhead. | ||
|
||
If `filter_membership_reports` :ref:`site.conf <user-site-mesh>` is true in the site.conf | ||
or absent then brmldproxy is additionally configured to | ||
only send MLD reports for routeable IPv6 multicast addresses | ||
and only to detected IPv6 multicast routers. If no such | ||
router is detected or no local listeners for routeable | ||
IPv6 multicast addresses exists then no MLD report is send | ||
into the mesh. Which greatly reduces MLD overhead while | ||
still allowing the usage of layer 3 IPv6 multicast routers. | ||
This is the recommended setting especially in larger meshes. | ||
|
||
---- | ||
|
||
Notable layer 3 IPv6 multicast router implementations: | ||
|
||
* pim6sd: https://github.com/troglobit/pim6sd | ||
* HowTo at DN42: https://dn42.dev/howto/IPv6-Multicast | ||
|
||
.. _brmldproxy: https://github.com/T-X/brmldproxy |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,36 @@ | ||
include $(TOPDIR)/rules.mk | ||
|
||
PKG_NAME:=gluon-mesh-batman-adv-brmldproxy | ||
|
||
include ../gluon.mk | ||
|
||
define Package/gluon-mesh-batman-adv-brmldproxy | ||
TITLE:=Bridge MLD Proxy for Gluon | ||
DEPENDS:=+tc +kmod-sched +brmldproxy +ip-bridge gluon-mesh-batman-adv | ||
endef | ||
|
||
define Package/gluon-mesh-batman-adv-brmldproxy/description | ||
Gluon community wifi mesh firmware framework: Configuration to | ||
enable brmldproxy in Gluon with batman-adv. | ||
|
||
If filter_membership_reports is false in the site.conf | ||
then no multicast listener is filtered, but the node will | ||
respond on behalf of any of its local listeners, potentially | ||
reducing duplicate MLD report overhead. | ||
|
||
If filter_membership_reports is true in the site.conf | ||
or absent then brmldproxy is additionally configured to | ||
only send MLD reports for routeable IPv6 multicast addresses | ||
and only to detected IPv6 multicast routers. If no such | ||
router is detected or no local listeners for routeable | ||
IPv6 multicast addresses exists then no MLD report is send | ||
into the mesh. Which greatly reduces MLD overhead while | ||
still allowing the usage of layer 3 IPv6 multicast routers. | ||
This is the recommended setting especially in larger meshes. | ||
endef | ||
|
||
define Package/gluon-mesh-batman-adv-brmldproxy/conffiles | ||
/etc/config/brmldproxy | ||
endef | ||
|
||
$(eval $(call BuildPackageGluon,gluon-mesh-batman-adv-brmldproxy)) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
need_boolean({'mesh', 'filter_membership_reports'}, false) |
58 changes: 58 additions & 0 deletions
58
...-mesh-batman-adv-brmldproxy/files/etc/hotplug.d/iface/51-gluon-mesh-batman-adv-brmldproxy
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,58 @@ | ||
#!/bin/sh | ||
set -e | ||
|
||
if [ "$INTERFACE" != "client" ] || [ "$ACTION" != "ifup" ]; then exit 0; fi | ||
|
||
lookup_site() { | ||
local path="$1" default="$2" | ||
lua -e "print(require('gluon.site').$path('$default'))" | ||
} | ||
|
||
get_gluon_all_mc_routers_mac() { | ||
local group_id="$(lua -e 'print(require("gluon.util").domain_seed_bytes("gluon-mesh-batman-adv-brmldproxy.gluon-all-mc-routers-group", 4))')" | ||
group_id="$(echo "${group_id}" | sed 's/\(..\)/\1:/g;s/:$//')" | ||
|
||
echo "33:33:${group_id}" | ||
} | ||
|
||
wait_for_qdisc() { | ||
for i in $(seq 1 15); do | ||
tc qdisc show dev bat0 handle "$1" | grep -q qdisc && break | ||
sleep 1 | ||
done | ||
} | ||
|
||
add_filter() { | ||
local parent="$1" | ||
local prio="$2" | ||
local handle="$3" | ||
local rule="$4" | ||
|
||
# shellcheck disable=SC2086 # Intended splitting of $rule | ||
tc filter add dev bat0 \ | ||
parent "$parent" prio "$prio" handle "$handle" protocol ipv6 \ | ||
u32 $rule | ||
} | ||
|
||
if [ "$(lookup_site 'mesh.filter_membership_reports' 'true')" = "false" ]; then exit 0; fi | ||
|
||
wait_for_qdisc "fffe:" | ||
wait_for_qdisc "ffff:" | ||
|
||
# MLD reports, mesh outgoing: | ||
# 1) DNAT to 33:33:42:4e:f3:14 | ||
# 2) Change ICMPv6 type to 100, keep original type in code field | ||
# => only send report to IPv6 multicast routers | ||
MC_MAC="$(get_gluon_all_mc_routers_mac)" | ||
add_filter fffe: 4221 11: "divisor 1" | ||
add_filter fffe: 4221 11::800 "ht 11: match u8 131 0xff at 48 match u8 0 0xff at 49 action pedit ex munge eth dst set ${MC_MAC} munge offset 0x30 u16 set 0x6483 action pipe classid 1:1" | ||
add_filter fffe: 4221 11::801 "ht 11: match u8 132 0xff at 48 match u8 0 0xff at 49 action pedit ex munge eth dst set ${MC_MAC} munge offset 0x30 u16 set 0x6484 action pipe classid 1:1" | ||
add_filter fffe: 4221 11::802 "ht 11: match u8 143 0xff at 48 match u8 0 0xff at 49 action pedit ex munge eth dst set ${MC_MAC} munge offset 0x30 u16 set 0x648f action pipe classid 1:1" | ||
add_filter fffe: 4221 801::800 "match mark 0x0800000 0x0800000 link 11:" | ||
|
||
# MLD reports, mesh incoming: | ||
# 1) undo DNAT | ||
# 2) Change ICMPv6 type back to MLD report | ||
add_filter ffff: 4223 2::231 "ht 2: match u8 100 0xff at 48 match u8 131 0xff at 49 action pedit ex munge eth dst set 33:33:00:00:00:01 munge offset 0x30 u16 set 0x8300 reclassify" | ||
add_filter ffff: 4223 2::232 "ht 2: match u8 100 0xff at 48 match u8 132 0xff at 49 action pedit ex munge eth dst set 33:33:00:00:00:01 munge offset 0x30 u16 set 0x8400 reclassify" | ||
add_filter ffff: 4223 2::243 "ht 2: match u8 100 0xff at 48 match u8 143 0xff at 49 action pedit ex munge eth dst set 33:33:00:00:00:16 munge offset 0x30 u16 set 0x8f00 reclassify" |
3 changes: 3 additions & 0 deletions
3
.../gluon-mesh-batman-adv-brmldproxy/files/lib/gluon/ebtables/104-mcast-allow-mld-reports-in
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
rule('MULTICAST_IN_ICMPV6 -p IPv6 --ip6-protocol ipv6-icmp --ip6-icmp-type 131 -j RETURN', 'nat') -- MLDv1 Report | ||
rule('MULTICAST_IN_ICMPV6 -p IPv6 --ip6-protocol ipv6-icmp --ip6-icmp-type 132 -j RETURN', 'nat') -- MLDv1 Done | ||
rule('MULTICAST_IN_ICMPV6 -p IPv6 --ip6-protocol ipv6-icmp --ip6-icmp-type 143 -j RETURN', 'nat') -- MLDv2 Report |
1 change: 1 addition & 0 deletions
1
package/gluon-mesh-batman-adv-brmldproxy/files/usr/lib/micron.d/brmldproxy-router-check
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
* * * * * /usr/sbin/gluon-brmldproxy-router-check |
43 changes: 43 additions & 0 deletions
43
package/gluon-mesh-batman-adv-brmldproxy/files/usr/sbin/gluon-brmldproxy-router-check
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,43 @@ | ||
#!/bin/sh | ||
|
||
lookup_site() { | ||
local path="$1" default="$2" | ||
lua -e "print(require('gluon.site').$path('$default'))" | ||
} | ||
|
||
lookup_prefix6() { | ||
local prefix="$(lookup_site 'prefix6')" | ||
echo "${prefix%/*}" | ||
} | ||
|
||
lookup_prefix6_len() { | ||
local prefix="$(lookup_site 'prefix6')" | ||
echo "${prefix#*/}" | ||
} | ||
|
||
# Generates and prints an RFC3306, section 4 style network prefix based | ||
# multicast address from the site prefix6 with a pseudo-random group-id | ||
# from the domain seed. | ||
get_gluon_all_mc_routers_ip6() { | ||
local prefix6="$(lookup_prefix6)" | ||
local prefix6_len="$(lookup_prefix6_len)" | ||
local group_id="$(lua -e 'print(require("gluon.util").domain_seed_bytes("gluon-mesh-batman-adv-brmldproxy.gluon-all-mc-routers-group", 4))')" | ||
group_id="$(echo "${group_id}" | sed 's/\(....\)/\1:/g;s/:$//')" | ||
|
||
echo "ff32:$(printf "%x" "${prefix6_len}"):${prefix6}${group_id}" | ||
} | ||
|
||
update_router_recv() { | ||
local action="$1" | ||
local mc_ip6="$(get_gluon_all_mc_routers_ip6)" | ||
|
||
bridge mdb "$action" dev br-client port local-port grp "${mc_ip6}" permanent 2> /dev/null | ||
} | ||
|
||
if [ "$(batctl mj | jsonfilter -e "@.mcast_flags.want_no_rtr_ipv6")" = "false" ]; then | ||
update_router_recv add | ||
echo 1 > /sys/class/net/brmldpb0/bridge/multicast_querier | ||
else | ||
update_router_recv del | ||
echo 0 > /sys/class/net/brmldpb0/bridge/multicast_querier | ||
fi |
52 changes: 52 additions & 0 deletions
52
package/gluon-mesh-batman-adv-brmldproxy/luasrc/lib/gluon/upgrade/400-brmldproxy
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,52 @@ | ||
#!/usr/bin/lua | ||
|
||
local site = require 'gluon.site' | ||
local uci = require('simple-uci').cursor() | ||
|
||
local excludefilters = { 'ff00::/ff0e::' } | ||
if site.mesh.filter_membership_reports(true) then | ||
table.insert(excludefilters, 'ff02::/ff0f::') | ||
table.insert(excludefilters, 'ff05::2:1001') | ||
end | ||
|
||
uci:delete('brmldproxy', 'client') | ||
uci:section('brmldproxy', 'brmldproxy', 'client', { | ||
disabled = 0, | ||
bridge = 'client', | ||
family = 'ipv6', | ||
proxiedport = { 'bat0' }, | ||
excludedport = { 'local-port' }, | ||
excludefilter = excludefilters, | ||
}) | ||
uci:save('brmldproxy') | ||
|
||
-- Allow incoming MLD on brmldp0/1/... devices | ||
uci:section('firewall', 'rule', 'brmldproxy_mld_in', { | ||
name = 'brmldproxy_mld_in', | ||
device = 'brmldp+', | ||
direction = 'in', | ||
src = '*', | ||
src_ip = 'fe80::/10', | ||
target = 'ACCEPT', | ||
family = 'ipv6', | ||
proto = 'icmp', | ||
icmp_type = { '130/0', '131/0', '132/0', '143/0', }, | ||
}) | ||
|
||
-- Fix default mark of MLDv2 reports (bug in the Linux IPv6 stack) | ||
-- See: https://marc.info/?l=netfilter&m=168959399302909 | ||
-- Subject: skb->mark not cleared for MLDv2 Reports? (skb->mark == 212 / 0xd4) | ||
uci:section('firewall', 'rule', 'brmldproxy_mldv2_mark_fixup', { | ||
name = 'brmldproxy_mldv2_mark_fixup', | ||
device = 'brmldp+', | ||
direction = 'out', | ||
dest = '*', | ||
src_ip = 'fe80::/10', | ||
target = 'MARK', | ||
set_mark = '0x0', | ||
family = 'ipv6', | ||
proto = 'icmp', | ||
icmp_type = { '143/0', }, | ||
}) | ||
|
||
uci:save('firewall') |
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.