[v4,2/2] gateway.d: Add scripts for network configuration

Submitted by Adrian Schmutzler on April 24, 2019, 12:05 p.m.

Details

Message ID 20190424120545.1736-2-freifunk@adrianschmutzler.de
State Rejected
Headers show

Commit Message

Adrian Schmutzler April 24, 2019, 12:05 p.m.
From: Fabian Blaese <fabian@blaese.de>

This adds scripts to configure vlan and client network.
This also adds sysctl settings to enable forwarding.

Note:
Devices specific properties are sourced from fff-network package.
This creates a dependency on fff-boardname and fff-network.
These properties should be located elsewhere in the future.

Signed-off-by: Fabian Bläse <fabian@blaese.de>
[Adjust to new network init, clarify IPv4/IPv6 warnings,
improve IPv6 grep, separate treatment for dhcp_limit]
Signed-off-by: Adrian Schmutzler <freifunk@adrianschmutzler.de>

---

Wenn man die cpuport Datei gleich in fff-gateway wirft, hat man
keine Abhängigkeit mehr zu fff-network, sondern nur noch zu
fff-boardname

Changes in v3:
- Rename 10-vlan to 20-vlan
- Rename 20-network-client to 30-network-client
- Source necessary uci functions and board properties
- Add dependency on fff-boardname and fff-network

Changes in v4:
- Adjust to new network init
- clarify IPv4/IPv6 warnings
- improve IPv6 grep
- separate treatment for dhcp_limit
- New "patchset" only with CPUPORT patch
---
 src/packages/fff/fff-gateway/Makefile              |  1 +
 .../fff/fff-gateway/files/etc/gateway.d/20-vlan    | 44 ++++++++++++++
 .../files/etc/gateway.d/30-network-client          | 71 ++++++++++++++++++++++
 .../files/etc/sysctl.d/60-fff-gateway.conf         |  5 ++
 4 files changed, 121 insertions(+)
 create mode 100644 src/packages/fff/fff-gateway/files/etc/gateway.d/20-vlan
 create mode 100644 src/packages/fff/fff-gateway/files/etc/gateway.d/30-network-client
 create mode 100644 src/packages/fff/fff-gateway/files/etc/sysctl.d/60-fff-gateway.conf

Patch hide | download patch | download mbox

diff --git a/src/packages/fff/fff-gateway/Makefile b/src/packages/fff/fff-gateway/Makefile
index 7c1dd559..f9ef8ccc 100644
--- a/src/packages/fff/fff-gateway/Makefile
+++ b/src/packages/fff/fff-gateway/Makefile
@@ -13,6 +13,7 @@  define Package/fff-gateway
 	CATEGORY:=Freifunk
 	TITLE:= Freifunk-Franken gateway configuration
 	URL:=https://www.freifunk-franken.de
+	DEPENDS:=+fff-boardname +fff-network
 endef
 
 define Package/fff-gateway/description
diff --git a/src/packages/fff/fff-gateway/files/etc/gateway.d/20-vlan b/src/packages/fff/fff-gateway/files/etc/gateway.d/20-vlan
new file mode 100644
index 00000000..fc2779fd
--- /dev/null
+++ b/src/packages/fff/fff-gateway/files/etc/gateway.d/20-vlan
@@ -0,0 +1,44 @@ 
+# load uci functions
+. /lib/functions.sh
+
+# load CPUPORT
+. /lib/functions/fff/cpuport
+
+
+configure() {
+	add_vlan() {
+		local vlan="$1"
+		local ports="$(uci get gateway.$vlan.ports)"
+		local name="vlan$vlan"
+
+		uci set network.$name='switch_vlan'
+		uci set network.$name.device="$(uci get network.@switch[0].name)"
+		uci set network.$name.vlan="$vlan"
+		uci set network.$name.ports="$CPUPORT $ports"
+	}
+
+	remove_vlan() {
+		local name="$1"
+		local vlan=$(echo $name | sed 's/vlan//')
+
+		# only remove vlans not present in gateway config
+		if ! uci -q get gateway.$vlan > /dev/null; then
+			# remove switch_vlan
+			uci del network.$name
+		fi
+	}
+
+	config_load network
+	config_foreach remove_vlan switch_vlan
+
+	config_load gateway
+	config_foreach add_vlan vlan
+}
+
+apply() {
+	uci commit network
+}
+
+revert() {
+	uci revert network
+}
diff --git a/src/packages/fff/fff-gateway/files/etc/gateway.d/30-network-client b/src/packages/fff/fff-gateway/files/etc/gateway.d/30-network-client
new file mode 100644
index 00000000..8a43b521
--- /dev/null
+++ b/src/packages/fff/fff-gateway/files/etc/gateway.d/30-network-client
@@ -0,0 +1,71 @@ 
+configure() {
+	# IPv4 address
+	#remove old ipaddr
+	uci -q del network.mesh.ipaddr
+	#set new ipaddr
+	if ipaddr=$(uci -q get gateway.@client[0].ipaddr); then
+		for ip in $ipaddr; do
+			uci add_list network.mesh.ipaddr=$ip
+		done
+	else
+		echo "WARNING: No client IPv4 address set!"
+	fi
+	#put interface routes from set addresses into fff table
+	uci set network.mesh.ip4table='fff'
+
+	# IPv6 address
+	#remove old ip6addr
+	for ip in $(uci get network.mesh.ip6addr); do
+		if echo "$ip" | grep -q -v -e "^fdff:" -e "fe80::1/64"; then
+			uci del_list network.mesh.ip6addr="$ip"
+		fi
+	done
+	#set new ip6addr
+	if ip6addr=$(uci -q get gateway.@client[0].ip6addr); then
+		for ip in $ip6addr; do
+			uci add_list network.mesh.ip6addr=$ip
+		done
+	else
+		echo "WARNING: No client IPv6 address set!"
+	fi
+	#put interface routes from set addresses into fff table
+	uci set network.mesh.ip6table='fff'
+
+	# dhcp
+	uci -q del dhcp.mesh.start
+	uci -q del dhcp.mesh.limit
+	if dhcp_start=$(uci -q get gateway.@client[0].dhcp_start); then
+		uci set dhcp.mesh=dhcp
+		uci set dhcp.mesh.interface=mesh
+		uci set dhcp.mesh.start=$dhcp_start
+	else
+		echo "WARNING: No DHCP range start set!"
+	fi
+	if dhcp_limit=$(uci -q get gateway.@client[0].dhcp_limit); then
+		uci set dhcp.mesh.limit=$dhcp_limit
+	else
+		echo "WARNING: No DHCP range limit set!"
+	fi
+
+	# set interface
+	#Just replace existing eth0.x or ethX assigned to mesh.ifname
+	if vlan=$(uci -q get gateway.@client[0].vlan); then
+		newmesh="$(uci get network.mesh.ifname | sed "s/\(eth\d\.\)\d/\1$vlan/g")"
+		uci set network.mesh.ifname="$newmesh"
+	elif iface=$(uci -q get gateway.@client[0].iface); then
+		newmesh="$(uci get network.mesh.ifname | sed "s/eth[^ ]*/$iface/g")"
+		uci set network.mesh.ifname="$newmesh"
+	else
+		echo "WARNING: No interface for client specified!"
+	fi
+}
+
+apply() {
+	uci commit network
+	uci commit dhcp
+}
+
+revert() {
+	uci revert network
+	uci revert dhcp
+}
diff --git a/src/packages/fff/fff-gateway/files/etc/sysctl.d/60-fff-gateway.conf b/src/packages/fff/fff-gateway/files/etc/sysctl.d/60-fff-gateway.conf
new file mode 100644
index 00000000..62bda1b4
--- /dev/null
+++ b/src/packages/fff/fff-gateway/files/etc/sysctl.d/60-fff-gateway.conf
@@ -0,0 +1,5 @@ 
+# Enable forwarding
+net.ipv4.conf.all.forwarding=1
+net.ipv4.ip_forward=1
+net.ipv6.conf.all.forwarding=1
+net.ipv6.conf.default.forwarding=1