forked from freifunk-franken/firmware
fff-layer3-vxmesh: join multple client nets with vxlan
Easily span a layer 2 network over a small group of, not necessarily adjacent, routers. This patch introduces a new `vxmesh` configuration section. It takes care of setting up a shared client network using vxlan among all configured routers. As a result, clients can finally roam between the routers of the mesh. It integrates well with the underlying layer 3 routing to make best use of the infrastructure available. This way the network is not depending on a contiguous layer 2 spanning tree topology and can make use of all fallback mechanisms of the layer 3 underlay. This example config ... ``` config gateway option peer_ip6 '2001:0db8::1' # required ... config vxmesh option proto 'vxlan|vxlan6' # required option vid '42' # required # ... # any vxlan options can be included # ... # list of peers for headend replication list peer '2001:0db8::1' # list can include the ip of the router list peer '2001:0db8::2' # this way the complete config section list peer '2001:0db8::3' # can be copied to all routers in the list peer '2001:0db8::4' # group ... ``` ... will generate ... ``` config interface client ... # append and remove the vxmesh0 entry # depending on whether a vxmesh is configured ifname '... vxmesh0' ... ... config interface 'vxmesh0' option proto 'vxlan6' option vid '42' config vxlan_peer option vxlan 'vxmesh0' option dst '2001:0db8::2' config vxlan_peer option vxlan 'vxmesh0' option dst '2001:0db8::3' config vxlan_peer option vxlan 'vxmesh0' option dst '2001:0db8::4' ``` It will also take care and configure the `dhcp.@dnsmasq[0].authoritative` setting depending on whether a vxmesh is enabled or not. Signed-off-by: Johannes Kimmel <fff@bareminimum.eu>
This commit is contained in:
parent
fcb19bd233
commit
dd69724837
|
@ -0,0 +1,29 @@
|
||||||
|
include $(TOPDIR)/rules.mk
|
||||||
|
|
||||||
|
PKG_NAME:=fff-layer3-vxmesh
|
||||||
|
PKG_RELEASE:=1
|
||||||
|
|
||||||
|
include $(INCLUDE_DIR)/package.mk
|
||||||
|
|
||||||
|
define Package/fff-layer3-vxmesh
|
||||||
|
SECTION:=base
|
||||||
|
CATEGORY:=Freifunk
|
||||||
|
TITLE:=Freifunk-Franken layer3 configuration for mesh via vxlan
|
||||||
|
URL:=http://www.freifunk-franken.de
|
||||||
|
DEPENDS:=+vxlan
|
||||||
|
endef
|
||||||
|
|
||||||
|
define Package/fff-layer3-vxmesh/description
|
||||||
|
Adds a simple configuration to connect multple routers into one layer 2
|
||||||
|
network via vxlan.
|
||||||
|
endef
|
||||||
|
|
||||||
|
define Build/Compile
|
||||||
|
# nothing
|
||||||
|
endef
|
||||||
|
|
||||||
|
define Package/fff-layer3-vxmesh/install
|
||||||
|
$(CP) ./files/* $(1)/
|
||||||
|
endef
|
||||||
|
|
||||||
|
$(eval $(call BuildPackage,fff-layer3-vxmesh))
|
|
@ -0,0 +1,111 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
configure() {
|
||||||
|
local proto
|
||||||
|
local peerip
|
||||||
|
local otherpeers
|
||||||
|
local fields="
|
||||||
|
proto
|
||||||
|
port
|
||||||
|
vid
|
||||||
|
ttl
|
||||||
|
tos
|
||||||
|
mtu
|
||||||
|
macaddr
|
||||||
|
zone
|
||||||
|
rxcsum
|
||||||
|
txcsum
|
||||||
|
srcportmin
|
||||||
|
srcportmax
|
||||||
|
ageing
|
||||||
|
maxaddress
|
||||||
|
learning
|
||||||
|
rsc
|
||||||
|
proxy
|
||||||
|
l2miss
|
||||||
|
l3miss
|
||||||
|
gbp
|
||||||
|
tunlink
|
||||||
|
ipaddr
|
||||||
|
ip6addr
|
||||||
|
"
|
||||||
|
|
||||||
|
# cleanup old vxmesh and peer entries
|
||||||
|
uci -q delete network.vxmesh0
|
||||||
|
while uci -q delete network.@vxlan_peer[-1]; do :; done
|
||||||
|
|
||||||
|
# remove vxmesh0 entry from the client bridge and remove extra whitespaces
|
||||||
|
uci set network.client.ifname="$(uci -q get network.client.ifname | sed s/vxmesh0// | xargs)"
|
||||||
|
|
||||||
|
# reset dns to authorative
|
||||||
|
uci set dhcp.@dnsmasq[0].authoritative="1"
|
||||||
|
|
||||||
|
# check if a vxmesh config is available, otherwise quit
|
||||||
|
uci -q get gateway.@vxmesh[0] > /dev/null || return 0
|
||||||
|
|
||||||
|
# check if proto is set and probe for the correct peer ip
|
||||||
|
proto="$(uci -q get gateway.@vxmesh[0].proto)"
|
||||||
|
case "$proto" in
|
||||||
|
vxlan6)
|
||||||
|
peerip="$(uci -q get gateway.@gateway[0].peer_ip6)"
|
||||||
|
;;
|
||||||
|
vxlan)
|
||||||
|
peerip="$(uci -q get gateway.@gateway[0].peer_ip)"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "FATAL: vxmesh: option proto 'vxlan|vxlan6' required!"
|
||||||
|
return 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# vxmesh needs a separate peer ip as the ip on the client interface ip
|
||||||
|
# might be shared over multiple devices
|
||||||
|
[ -z "$peerip" ] && {
|
||||||
|
echo "FATAL: vxmesh: peer_ip|peer_ip6 required!"
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
uci -q get gateway.@vxmesh[0].vid > /dev/null || {
|
||||||
|
echo "FATAL: vxmesh: missing vid!"
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
# copy main options over
|
||||||
|
uci set network.vxmesh0="interface"
|
||||||
|
for option in $fields; do
|
||||||
|
uci set network.vxmesh0."$option"="$(uci -q get gateway.@vxmesh[0]."$option")"
|
||||||
|
done
|
||||||
|
|
||||||
|
# exclude peerip from the local router, so packets aren't sent to itself
|
||||||
|
otherpeers=$(uci -q get gateway.@vxmesh[0].peer | xargs -n1 | grep -v -e "$peerip")
|
||||||
|
|
||||||
|
for peer in $otherpeers; do
|
||||||
|
# create peer sections
|
||||||
|
if ! uci -q batch > /dev/null; then
|
||||||
|
echo "FATAL: vxmesh: error setting up peer!"
|
||||||
|
echo " peer: \"$peer\""
|
||||||
|
return 1
|
||||||
|
fi <<- EOF
|
||||||
|
add network vxlan_peer
|
||||||
|
set network.@vxlan_peer[-1].vxlan="vxmesh0"
|
||||||
|
set network.@vxlan_peer[-1].dst="$peer"
|
||||||
|
EOF
|
||||||
|
done
|
||||||
|
|
||||||
|
# with multiple routers in the network, there shouldn't be an authoritative
|
||||||
|
# dhcp server
|
||||||
|
uci set dhcp.@dnsmasq[0].authoritative="0"
|
||||||
|
|
||||||
|
# add the vxlan interface to the client bridge
|
||||||
|
uci set network.client.ifname="$(uci -q get network.client.ifname) vxmesh0"
|
||||||
|
}
|
||||||
|
|
||||||
|
apply() {
|
||||||
|
uci commit network
|
||||||
|
uci commit dhcp
|
||||||
|
}
|
||||||
|
|
||||||
|
revert() {
|
||||||
|
uci revert network
|
||||||
|
uci revert dhcp
|
||||||
|
}
|
|
@ -1,7 +1,7 @@
|
||||||
include $(TOPDIR)/rules.mk
|
include $(TOPDIR)/rules.mk
|
||||||
|
|
||||||
PKG_NAME:=fff-layer3
|
PKG_NAME:=fff-layer3
|
||||||
PKG_RELEASE:=8
|
PKG_RELEASE:=9
|
||||||
|
|
||||||
include $(INCLUDE_DIR)/package.mk
|
include $(INCLUDE_DIR)/package.mk
|
||||||
|
|
||||||
|
@ -36,7 +36,7 @@ define Package/fff-layer3
|
||||||
+mtr \
|
+mtr \
|
||||||
+tc \
|
+tc \
|
||||||
+tcpdump \
|
+tcpdump \
|
||||||
+vxlan
|
+fff-layer3-vxmesh
|
||||||
endef
|
endef
|
||||||
|
|
||||||
define Package/fff-layer3/description
|
define Package/fff-layer3/description
|
||||||
|
|
Loading…
Reference in New Issue