[v2,3/3] gateway.d: Add scripts for network configuration

Submitted by Fabian Blaese on March 18, 2019, 9:54 p.m.

Details

Message ID 20190318215401.4082-3-fabian@blaese.de
State Superseded
Headers show

Commit Message

Fabian Blaese March 18, 2019, 9:54 p.m.
This adds scripts to configure vlan and client network.

This also adds sysctl settings to enable forwarding.

Signed-off-by: Fabian Bläse <fabian@blaese.de>
---
 .../fff-gateway/files/etc/gateway.d/10-vlan   | 39 +++++++++++
 .../files/etc/gateway.d/20-network-client     | 66 +++++++++++++++++++
 .../files/etc/sysctl.d/60-fff-gateway.conf    |  5 ++
 3 files changed, 110 insertions(+)
 create mode 100644 src/packages/fff/fff-gateway/files/etc/gateway.d/10-vlan
 create mode 100644 src/packages/fff/fff-gateway/files/etc/gateway.d/20-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/files/etc/gateway.d/10-vlan b/src/packages/fff/fff-gateway/files/etc/gateway.d/10-vlan
new file mode 100644
index 0000000..a8d64de
--- /dev/null
+++ b/src/packages/fff/fff-gateway/files/etc/gateway.d/10-vlan
@@ -0,0 +1,39 @@ 
+configure() {
+	add_vlan() {
+		local vlan="$1"
+		local ports=$(uci get gateway.$vlan.ports)
+		local name="$SWITCHDEV"_$vlan
+
+		uci set network.$name='switch_vlan'
+		uci set network.$name.device="$(uci get network.$SWITCHDEV.name)"
+		uci set network.$name.vlan="$vlan"
+		uci set network.$name.ports="$CPUPORT $ports"
+	}
+
+	remove_vlan() {
+		local name="$1"
+
+		local switchdev=$(echo $name | cut -d_ -f1)
+		local vlan=$(echo $name | cut -d_ -f2)
+
+		# 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/20-network-client b/src/packages/fff/fff-gateway/files/etc/gateway.d/20-network-client
new file mode 100644
index 0000000..330be54
--- /dev/null
+++ b/src/packages/fff/fff-gateway/files/etc/gateway.d/20-network-client
@@ -0,0 +1,66 @@ 
+configure() {
+	# ipaddr
+	#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 ipaddr set!"
+	fi
+	#put interface routes from set addresses into fff table
+	uci set network.mesh.ip4table='fff'
+
+	# ip6addr
+	#remove old ip6addr
+	for ip in $(uci get network.mesh.ip6addr); do
+		if echo "$ip" | grep -v -e "fdff:" -e "fe80::1/64" > /dev/null; 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 ip6addr 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
+		uci set dhcp.mesh.limit=$(uci -q get gateway.@client[0].dhcp_limit)
+	else
+		echo "WARNING: No DHCP range start and/or limit set!"
+	fi
+
+	# set interface
+	#remove all eth interfaces
+	ifaces=$(uci get network.mesh.ifname | sed -e "s/ *eth\d\.\d//g" -e "s/ *eth\d//g" -e "s/^ //")
+	if vlan=$(uci -q get gateway.@client[0].vlan); then
+		uci set network.mesh.ifname="${SWITCHDEV}.$vlan $ifaces"
+	elif iface=$(uci -q get gateway.@client[0].iface); then
+		uci set network.mesh.ifname="$iface $ifaces"
+	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 0000000..62bda1b
--- /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

Comments

Adrian Schmutzler March 18, 2019, 10:13 p.m.
Hallo Fabian,

ich schaue mir das gelegentlich noch genauer an, zunächst nur eine Frage unten.

> -----Original Message-----
> From: franken-dev [mailto:franken-dev-bounces@freifunk.net] On Behalf
> Of Fabian Bläse
> Sent: Montag, 18. März 2019 22:54
> To: franken-dev@freifunk.net
> Subject: [PATCH v2 3/3] gateway.d: Add scripts for network configuration
> 
> This adds scripts to configure vlan and client network.
> 
> This also adds sysctl settings to enable forwarding.
> 
> Signed-off-by: Fabian Bläse <fabian@blaese.de>
> ---
>  .../fff-gateway/files/etc/gateway.d/10-vlan   | 39 +++++++++++
>  .../files/etc/gateway.d/20-network-client     | 66 +++++++++++++++++++
>  .../files/etc/sysctl.d/60-fff-gateway.conf    |  5 ++
>  3 files changed, 110 insertions(+)
>  create mode 100644 src/packages/fff/fff-gateway/files/etc/gateway.d/10-
> vlan
>  create mode 100644 src/packages/fff/fff-gateway/files/etc/gateway.d/20-
> network-client
>  create mode 100644 src/packages/fff/fff-gateway/files/etc/sysctl.d/60-fff-
> gateway.conf
> 
> diff --git a/src/packages/fff/fff-gateway/files/etc/gateway.d/10-vlan
> b/src/packages/fff/fff-gateway/files/etc/gateway.d/10-vlan
> new file mode 100644
> index 0000000..a8d64de
> --- /dev/null
> +++ b/src/packages/fff/fff-gateway/files/etc/gateway.d/10-vlan
> @@ -0,0 +1,39 @@
> +configure() {

Müssen die Funktionen hier nested sein?

Hat das einen tieferen Sinn oder ist das Willkür?

Grüße

Adrian

> +	add_vlan() {
> +		local vlan="$1"
> +		local ports=$(uci get gateway.$vlan.ports)
> +		local name="$SWITCHDEV"_$vlan
> +
> +		uci set network.$name='switch_vlan'
> +		uci set network.$name.device="$(uci get
> network.$SWITCHDEV.name)"
> +		uci set network.$name.vlan="$vlan"
> +		uci set network.$name.ports="$CPUPORT $ports"
> +	}
> +
> +	remove_vlan() {
> +		local name="$1"
> +
> +		local switchdev=$(echo $name | cut -d_ -f1)
> +		local vlan=$(echo $name | cut -d_ -f2)
> +
> +		# 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/20-network-
> client b/src/packages/fff/fff-gateway/files/etc/gateway.d/20-network-client
> new file mode 100644
> index 0000000..330be54
> --- /dev/null
> +++ b/src/packages/fff/fff-gateway/files/etc/gateway.d/20-network-client
> @@ -0,0 +1,66 @@
> +configure() {
> +	# ipaddr
> +	#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 ipaddr set!"
> +	fi
> +	#put interface routes from set addresses into fff table
> +	uci set network.mesh.ip4table='fff'
> +
> +	# ip6addr
> +	#remove old ip6addr
> +	for ip in $(uci get network.mesh.ip6addr); do
> +		if echo "$ip" | grep -v -e "fdff:" -e "fe80::1/64" > /dev/null;
> 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 ip6addr 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
> +		uci set dhcp.mesh.limit=$(uci -q get
> gateway.@client[0].dhcp_limit)
> +	else
> +		echo "WARNING: No DHCP range start and/or limit set!"
> +	fi
> +
> +	# set interface
> +	#remove all eth interfaces
> +	ifaces=$(uci get network.mesh.ifname | sed -e "s/ *eth\d\.\d//g" -e
> "s/ *eth\d//g" -e "s/^ //")
> +	if vlan=$(uci -q get gateway.@client[0].vlan); then
> +		uci set network.mesh.ifname="${SWITCHDEV}.$vlan $ifaces"
> +	elif iface=$(uci -q get gateway.@client[0].iface); then
> +		uci set network.mesh.ifname="$iface $ifaces"
> +	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 0000000..62bda1b
> --- /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
> --
> 2.21.0
Robert Langhammer March 19, 2019, 1:05 a.m.
Hi Fabian,

s. inline

Am 18.03.19 um 22:54 schrieb Fabian Bläse:
> This adds scripts to configure vlan and client network.
>
> This also adds sysctl settings to enable forwarding.
>
> Signed-off-by: Fabian Bläse <fabian@blaese.de>
> ---
>  .../fff-gateway/files/etc/gateway.d/10-vlan   | 39 +++++++++++
>  .../files/etc/gateway.d/20-network-client     | 66 +++++++++++++++++++
>  .../files/etc/sysctl.d/60-fff-gateway.conf    |  5 ++
>  3 files changed, 110 insertions(+)
>  create mode 100644 src/packages/fff/fff-gateway/files/etc/gateway.d/10-vlan
>  create mode 100644 src/packages/fff/fff-gateway/files/etc/gateway.d/20-network-client
>  create mode 100644 src/packages/fff/fff-gateway/files/etc/sysctl.d/60-fff-gateway.conf
>
> diff --git a/src/packages/fff/fff-gateway/files/etc/gateway.d/10-vlan b/src/packages/fff/fff-gateway/files/etc/gateway.d/10-vlan
> new file mode 100644
> index 0000000..a8d64de
> --- /dev/null
> +++ b/src/packages/fff/fff-gateway/files/etc/gateway.d/10-vlan
> @@ -0,0 +1,39 @@
> +configure() {
> +	add_vlan() {
> +		local vlan="$1"
> +		local ports=$(uci get gateway.$vlan.ports)
> +		local name="$SWITCHDEV"_$vlan
> +
> +		uci set network.$name='switch_vlan'
> +		uci set network.$name.device="$(uci get network.$SWITCHDEV.name)"
> +		uci set network.$name.vlan="$vlan"
> +		uci set network.$name.ports="$CPUPORT $ports"

$SWITCHDEVund $CPUPORT ist unbekannt, du hast bei v2 1/3 das Sourcen von
network.$BOARD rausgeworfen. Am besten hier rein holen, dann ist alles
beisammen. Mehrfaches Sourcen schadet nicht.

> +	}
> +
> +	remove_vlan() {
> +		local name="$1"
> +
> +		local switchdev=$(echo $name | cut -d_ -f1)
> +		local vlan=$(echo $name | cut -d_ -f2)
> +
> +		# 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/20-network-client b/src/packages/fff/fff-gateway/files/etc/gateway.d/20-network-client
> new file mode 100644
> index 0000000..330be54
> --- /dev/null
> +++ b/src/packages/fff/fff-gateway/files/etc/gateway.d/20-network-client
> @@ -0,0 +1,66 @@
> +configure() {
> +	# ipaddr
> +	#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 ipaddr set!"
> +	fi
> +	#put interface routes from set addresses into fff table
> +	uci set network.mesh.ip4table='fff'
> +
> +	# ip6addr
> +	#remove old ip6addr
> +	for ip in $(uci get network.mesh.ip6addr); do
> +		if echo "$ip" | grep -v -e "fdff:" -e "fe80::1/64" > /dev/null; 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 ip6addr 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
> +		uci set dhcp.mesh.limit=$(uci -q get gateway.@client[0].dhcp_limit)
> +	else
> +		echo "WARNING: No DHCP range start and/or limit set!"
> +	fi
> +
> +	# set interface
> +	#remove all eth interfaces
> +	ifaces=$(uci get network.mesh.ifname | sed -e "s/ *eth\d\.\d//g" -e "s/ *eth\d//g" -e "s/^ //")
> +	if vlan=$(uci -q get gateway.@client[0].vlan); then
> +		uci set network.mesh.ifname="${SWITCHDEV}.$vlan $ifaces"

hier auch

Robert

> +	elif iface=$(uci -q get gateway.@client[0].iface); then
> +		uci set network.mesh.ifname="$iface $ifaces"
> +	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 0000000..62bda1b
> --- /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
Fabian Blaese March 19, 2019, 7:22 a.m.
Hallo robert,

On 19.03.19 02:05, robert wrote:
>> +		uci set network.$name='switch_vlan'
>> +		uci set network.$name.device="$(uci get network.$SWITCHDEV.name)"
>> +		uci set network.$name.vlan="$vlan"
>> +		uci set network.$name.ports="$CPUPORT $ports"
> 
> $SWITCHDEVund $CPUPORT ist unbekannt, du hast bei v2 1/3 das Sourcen von
> network.$BOARD rausgeworfen. Am besten hier rein holen, dann ist alles
> beisammen. Mehrfaches Sourcen schadet nicht.

Gut gesehen, danke!
Wenn da sonst keine Einwände mehr sind und keiner was dagegen hat, würde ich das einfach fix beim applien reparieren.

Gruß
Fabian
Fabian Blaese March 19, 2019, 7:23 a.m.
Hallo Adrian,

On 18.03.19 23:13, mail@adrianschmutzler.de wrote:
> Müssen die Funktionen hier nested sein?
> 
> Hat das einen tieferen Sinn oder ist das Willkür?
_Müssen_ müssen sie nicht. Ich fand das so aber hübscher, weil man dann alles zusammen hat.
Sind ja nur Hilfsfunktionen mit konkret für diese Funktion (configure) interessantem Code.

Gruß
Fabian
Adrian Schmutzler March 20, 2019, 3:25 p.m.
Hallo,

auch hier: siehe unten:

> -----Original Message-----
> From: franken-dev [mailto:franken-dev-bounces@freifunk.net] On Behalf Of
> Fabian Bläse
> Sent: Montag, 18. März 2019 22:54
> To: franken-dev@freifunk.net
> Subject: [PATCH v2 3/3] gateway.d: Add scripts for network configuration
> 
> This adds scripts to configure vlan and client network.
> 
> This also adds sysctl settings to enable forwarding.
> 
> Signed-off-by: Fabian Bläse <fabian@blaese.de>
> ---
>  .../fff-gateway/files/etc/gateway.d/10-vlan   | 39 +++++++++++
>  .../files/etc/gateway.d/20-network-client     | 66 +++++++++++++++++++
>  .../files/etc/sysctl.d/60-fff-gateway.conf    |  5 ++
>  3 files changed, 110 insertions(+)
>  create mode 100644 src/packages/fff/fff-gateway/files/etc/gateway.d/10-vlan
>  create mode 100644 src/packages/fff/fff-gateway/files/etc/gateway.d/20-
> network-client
>  create mode 100644 src/packages/fff/fff-gateway/files/etc/sysctl.d/60-fff-
> gateway.conf
> 
> diff --git a/src/packages/fff/fff-gateway/files/etc/gateway.d/10-vlan
> b/src/packages/fff/fff-gateway/files/etc/gateway.d/10-vlan
> new file mode 100644
> index 0000000..a8d64de
> --- /dev/null
> +++ b/src/packages/fff/fff-gateway/files/etc/gateway.d/10-vlan
> @@ -0,0 +1,39 @@
> +configure() {
> +	add_vlan() {
> +		local vlan="$1"
> +		local ports=$(uci get gateway.$vlan.ports)
> +		local name="$SWITCHDEV"_$vlan
> +
> +		uci set network.$name='switch_vlan'
> +		uci set network.$name.device="$(uci get
> network.$SWITCHDEV.name)"
> +		uci set network.$name.vlan="$vlan"
> +		uci set network.$name.ports="$CPUPORT $ports"
> +	}
> +
> +	remove_vlan() {
> +		local name="$1"
> +
> +		local switchdev=$(echo $name | cut -d_ -f1)
> +		local vlan=$(echo $name | cut -d_ -f2)
> +
> +		# 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/20-network-client
> b/src/packages/fff/fff-gateway/files/etc/gateway.d/20-network-client
> new file mode 100644
> index 0000000..330be54
> --- /dev/null
> +++ b/src/packages/fff/fff-gateway/files/etc/gateway.d/20-network-client
> @@ -0,0 +1,66 @@
> +configure() {
> +	# ipaddr
> +	#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 ipaddr set!"
> +	fi

Ich würde hier lieber ip4addr statt ipaddr lesen. Mindestens in der warning (ggf. auch direkt "IPv4 address"), man könnte aber auch überlegen, ob man es "jetzt noch" generell macht: Man könnte z.B. auch in der gateway-config ip4addr als option verwenden. Hat dann den Nachteil, dass es nicht konsistent mit der network-config ist, wäre aber ggf. einfacher für den Nutzer.


> +	#put interface routes from set addresses into fff table
> +	uci set network.mesh.ip4table='fff'
> +
> +	# ip6addr
> +	#remove old ip6addr
> +	for ip in $(uci get network.mesh.ip6addr); do
> +		if echo "$ip" | grep -v -e "fdff:" -e "fe80::1/64" > /dev/null; then

Wo wird in der GW-Firmware die fe80::1 denn gesetzt? Bei V2 ist es in der configurehood:
https://github.com/adrianschmutzler/fff-firmware/blob/gwmod/src/packages/fff/fff-hoods/files/usr/sbin/configurehood#L57

> +			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 ip6addr 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
> +		uci set dhcp.mesh.limit=$(uci -q get
> gateway.@client[0].dhcp_limit)

Im Prinzip muss man das Limit ja nicht setzen, dann würde der uci get ein Fehler werfen, der vom "-q" wiederum unterdrückt wird.

Das funktioniert zwar, besser verständlich wäre meines Erachtens aber so:

	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
		dhcp_limit=$(uci -q get gateway.@client[0].dhcp_limit) && uci set dhcp.mesh.limit=$dhcp_limit
	else
		echo "WARNING: No DHCP range start set!"
	fi

> +	else
> +		echo "WARNING: No DHCP range start and/or limit set!"
> +	fi
> +
> +	# set interface
> +	#remove all eth interfaces
> +	ifaces=$(uci get network.mesh.ifname | sed -e "s/ *eth\d\.\d//g" -e "s/
> *eth\d//g" -e "s/^ //")
> +	if vlan=$(uci -q get gateway.@client[0].vlan); then
> +		uci set network.mesh.ifname="${SWITCHDEV}.$vlan $ifaces"
> +	elif iface=$(uci -q get gateway.@client[0].iface); then
> +		uci set network.mesh.ifname="$iface $ifaces"
> +	else
> +		echo "WARNING: No Interface for client specified"

"interface" klein schreiben.

Wie schon zuvor festgestellt gefällt mir der Ansatz sehr gut, zumal ich das ja ohnehin in Funktionen zerstückeln wollte.

Beste Grüße

Adrian

> +	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 0000000..62bda1b
> --- /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
> --
> 2.21.0
Adrian Schmutzler March 20, 2019, 3:47 p.m.
Hab ich jetzt beim Durchkucken in der Tat auch übersehen.

 

Da es den CPUPORT im Moment noch gar nicht gibt, müsste man den streng genommen aber vorher noch bei den Geräten hinzufügen.

Das sollte man in dem Fall dann am besten auch ordentlich in nem separaten Patch für ALLE Geräte machen.

Ich finde das zwar hässlich, aber bisher ist mir auch nichts besseres eingefallen als der CPU-Port.

 

Grüße

 

Adrian

 

From: franken-dev [mailto:franken-dev-bounces@freifunk.net] On Behalf Of Fabian Bläse
Sent: Dienstag, 19. März 2019 08:22
To: robert <rlanghammer@web.de>; franken-dev@freifunk.net
Subject: Re: [PATCH v2 3/3] gateway.d: Add scripts for network configuration

 

Hallo robert, 

On 19.03.19 02:05, robert wrote: 
>> +            uci set network.$name='switch_vlan' 
>> +            uci set network.$name.device="$(uci get network.$SWITCHDEV.name)" 
>> +            uci set network.$name.vlan="$vlan" 
>> +            uci set network.$name.ports="$CPUPORT $ports" 
> 
> $SWITCHDEVund $CPUPORT ist unbekannt, du hast bei v2 1/3 das Sourcen von 
> network.$BOARD rausgeworfen. Am besten hier rein holen, dann ist alles 
> beisammen. Mehrfaches Sourcen schadet nicht. 

Gut gesehen, danke! 
Wenn da sonst keine Einwände mehr sind und keiner was dagegen hat, würde ich das einfach fix beim applien reparieren. 

Gruß 
Fabian
Fabian Blaese March 21, 2019, 1:13 p.m.
Stimmt.

Auf einem 4900 kriegt man den CPU-Port mit "swconfig dev switch0 help" zur Laufzeit raus.
Ich kann aber nicht sicher sagen, ob das für alle Geräte gilt.

Ich würde nur ungern eine Abhängigkeit zu fff-network erzeugen (die hab ich ja im v2 extra raus genommen).
Wo bringt man also diese Konfigurationen am besten unter?

Gruß
Fabian

P.S.: Dein Mailclient erzeugt immer noch ziemlich kaputt aussehende (viel zu viele Zeilenumbrüche) Plaintext Mails. (siehe unten)

On 20.03.19 16:47, Adrian Schmutzler wrote:
> Hab ich jetzt beim Durchkucken in der Tat auch übersehen.
> 
>  
> 
> Da es den CPUPORT im Moment noch gar nicht gibt, müsste man den streng genommen aber vorher noch bei den Geräten hinzufügen.
> 
> Das sollte man in dem Fall dann am besten auch ordentlich in nem separaten Patch für ALLE Geräte machen.
> 
> Ich finde das zwar hässlich, aber bisher ist mir auch nichts besseres eingefallen als der CPU-Port.
> 
>  
> 
> Grüße
> 
>  
> 
> Adrian
Fabian Blaese March 21, 2019, 1:17 p.m.
Hallo,

On 20.03.19 16:25, Adrian Schmutzler wrote:
>> +configure() {
>> +	# ipaddr
>> +	#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 ipaddr set!"
>> +	fi
> 
> Ich würde hier lieber ip4addr statt ipaddr lesen. Mindestens in der warning (ggf. auch direkt "IPv4 address"), man könnte aber auch überlegen, ob man es "jetzt noch" generell macht: Man könnte z.B. auch in der gateway-config ip4addr als option verwenden. Hat dann den Nachteil, dass es nicht konsistent mit der network-config ist, wäre aber ggf. einfacher für den Nutzer.
Ich tatsächlich auch. Aber ich würde da auf jeden Fall eher bei dem bleiben, wie es auch bei OpenWRT verwendet wird.
Die Fehlermeldung kann man anpassen.

> Wo wird in der GW-Firmware die fe80::1 denn gesetzt? Bei V2 ist es in der configurehood:
> https://github.com/adrianschmutzler/fff-firmware/blob/gwmod/src/packages/fff/fff-hoods/files/usr/sbin/configurehood#L57
Nirgends. Überrest von Früher.

Auch diese hart da reinkodierte fdff sollte wohl eher weg. Ich würde diesen ganzen Kram bei der Gatewayfirmware (inklusive configurenetwork Skript) bei der Gatewayfirmware komplett weglassen und lieber eine Standard-Konfiguration fürs Gateway mitbringen.
Initiale Konfiguration kann dann über fe80 oder so funktionieren.
Was meint ihr dazu?

Gruß
Fabian
Christian Dresel March 21, 2019, 1:53 p.m.
hi

ich bin aktuell wegen etwas Zeitmangel nur am überfliegen, ich hab mir
den Code nicht weiter angeguckt aber auf Fragen antworte ich mal eben
gerne ;)

On 21.03.19 14:17, Fabian Bläse wrote:
> Hallo,
>
> On 20.03.19 16:25, Adrian Schmutzler wrote:
>>> +configure() {
>>> +	# ipaddr
>>> +	#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 ipaddr set!"
>>> +	fi
>> Ich würde hier lieber ip4addr statt ipaddr lesen. Mindestens in der warning (ggf. auch direkt "IPv4 address"), man könnte aber auch überlegen, ob man es "jetzt noch" generell macht: Man könnte z.B. auch in der gateway-config ip4addr als option verwenden. Hat dann den Nachteil, dass es nicht konsistent mit der network-config ist, wäre aber ggf. einfacher für den Nutzer.
> Ich tatsächlich auch. Aber ich würde da auf jeden Fall eher bei dem bleiben, wie es auch bei OpenWRT verwendet wird.
> Die Fehlermeldung kann man anpassen.
>
>> Wo wird in der GW-Firmware die fe80::1 denn gesetzt? Bei V2 ist es in der configurehood:
>> https://github.com/adrianschmutzler/fff-firmware/blob/gwmod/src/packages/fff/fff-hoods/files/usr/sbin/configurehood#L57
> Nirgends. Überrest von Früher.
>
> Auch diese hart da reinkodierte fdff sollte wohl eher weg. Ich würde diesen ganzen Kram bei der Gatewayfirmware (inklusive configurenetwork Skript) bei der Gatewayfirmware komplett weglassen und lieber eine Standard-Konfiguration fürs Gateway mitbringen.
> Initiale Konfiguration kann dann über fe80 oder so funktionieren.
> Was meint ihr dazu?

ich würde schon gerne die fdff:: behalten. "Später" will man vllt. mal
die Konfiguration des Gateways von SSH ins WebUI übertragen und WebUI
per fe80 geht bekanntlich nicht.

Gruß

Christian

>
> Gruß
> Fabian
>
Adrian Schmutzler March 21, 2019, 3:02 p.m.
Hallo Fabian,

 

für SWITCHDEV hast du doch ohnehin eine Abhängigkeit auf fff-network.

 

Wenn du das mit dem CPU-Port im network.* vermeiden willst, fiele mir sonst noch folgendes ein:

- man verlangt einfach vom Nutzer, das selbst im /etc/config/gateway einzutragen. Dann gibt es halt dort einen zusätzlichen Parameter. Ist zwar nicht schön, aber könnte man zumindest als Interimslösung machen.

- Du wirfst für den CPU-Port ein eigenes File oder Skript in fff-gateway, dass die Information enthält (gibt dann aber ne Abhängigkeit auf fff-boardname).

- Man könnte theoretisch auch in /etc/config/network bei den Ports rumlesen, das geht aber natürlich nur solange, wie da niemand andere tagged Ports reingeschrieben hat (und ist damit eigentlich nicht brauchbar).

 

swconfig parsen mag ich gar nicht. Außerdem höre ich immer mal wieder, dass OpenWrt swconfig irgendwann loswerden will. Weiterhin geht sowas kaputt, wenn es kein Switch gibt. (z.B. ar150, auch wenn ich weiß, dass das absolute Nischenszenarien sind)

 

Von allen vorhandenen schlechten Lösungen würde ich im Moment die „alte“ wählen und tatsächlich den CPU-Port jeweils in die network.* schreiben.

(Ich würde den Patch sogar selbst bauen, wenn jemand vorher den hier reviewed: https://pw.freifunk-franken.de/patch/897/ ;-) )

 

Beste Grüße

 

Adrian

 

From: Fabian Bläse [mailto:fabian@blaese.de] 
Sent: Donnerstag, 21. März 2019 14:14
To: Adrian Schmutzler <mail@adrianschmutzler.de>; franken-dev@freifunk.net
Subject: Re: [PATCH v2 3/3] gateway.d: Add scripts for network configuration

 

Stimmt. 

Auf einem 4900 kriegt man den CPU-Port mit "swconfig dev switch0 help" zur Laufzeit raus. 
Ich kann aber nicht sicher sagen, ob das für alle Geräte gilt. 

Ich würde nur ungern eine Abhängigkeit zu fff-network erzeugen (die hab ich ja im v2 extra raus genommen). 
Wo bringt man also diese Konfigurationen am besten unter? 

Gruß 
Fabian 

P.S.: Dein Mailclient erzeugt immer noch ziemlich kaputt aussehende (viel zu viele Zeilenumbrüche) Plaintext Mails. (siehe unten)

On 20.03.19 16:47, Adrian Schmutzler wrote: 
> Hab ich jetzt beim Durchkucken in der Tat auch übersehen. 
> 
>   
> 
> Da es den CPUPORT im Moment noch gar nicht gibt, müsste man den streng genommen aber vorher noch bei den Geräten hinzufügen.

> 
> Das sollte man in dem Fall dann am besten auch ordentlich in nem separaten Patch für ALLE Geräte machen. 
> 
> Ich finde das zwar hässlich, aber bisher ist mir auch nichts besseres eingefallen als der CPU-Port. 
> 
>   
> 
> Grüße 
> 
>   
> 
> Adrian
Adrian Schmutzler April 12, 2019, 3:12 p.m.
Hallo Fabian,

aus aktuellem Anlass habe ich mir den Patch nochmal aus einem etwas anderen Blickwinkel angesehen.

> +	config_load network
> +	config_foreach remove_vlan switch_vlan
> +
> +	config_load gateway
> +	config_foreach add_vlan vlan

Ich habe erst länger rumüberlegt, ob man das irgendwie hinkriegt, ohne alles zu löschen und neu zu schreiben. Da man bei dir aber variabel neue VLANs definieren kann, geht es glaube ich nur so.

Hier besteht jetzt das Problem mit dem SWITCHDEV. Wenn man das nicht aus network.* auslesen möchte, gibt es mehrere Möglichkeiten:

1. Das Switch ist im uci noch da. Switch gibt es bei uns immer nur eines. D.h. auch ohne Namen kann ich mit network.@switch[0] arbeiten.
Leider kriegt man mit uci bei dieser Syntax den Namen der section nur mit viel Murks:
DEV=$(uci show network.@switch[0] | grep "=switch" |  sed "s#network.\([^=]*\)=switch.*#\1#")
Finde ich nicht so geil.
Allerdings brauchen wir den Namen des ethX gar nicht, denn:

2. Das Switch enthält den Namen des Hardware-Device (?) unter network.@switch[0].name (beim 1043v2 z.B. „ag71xx-mdio.0“).
Da uns keiner zwingt, die switch_vlans zu benennen, und wenn wir alle alten gelöscht haben (hierzu müsste man dann remove_vlan ändern), können wir dann
      swvlan=$(uci add network switch_vlan)
      uci set network.$swvlan.device="$(uci get network.@switch[0].name)"
      uci set network.$swvlan.vlan="$vlan"
      uci set network.$swvlan.ports="$CPUPORT $ports"
Und schon sind wir unabhängig von fff-network. Das ginge so btw auch mit der OpenWrt Standardconfig, die benennen übrigens ihre switch_vlan Einträge auch nicht.
Nebenbei ist der Code trotzdem schlank.

Mit dieser Lösung wären wir unabhängig von irgendwelchen spezifischen Informationen über das Gerät, solange es ein Switch hat.

Für den CPUPORT würde ich jetzt wie bereits an anderer Stelle erwähnt einfach das Skript aus meinem Patchset sourcen und fertig.

Würde dann wohl so aussehen:
+. /lib/functions/fff/cpuport
+
+configure() {
+	add_vlan() {
+		local vlan="$1"
+		local device="$(uci get network.@switch[0].name)"
+		local ports="$(uci get gateway.$vlan.ports)"
+
+		local name="$(uci add network 'switch_vlan')"
+		uci set network.$name.device="$device"
+		uci set network.$name.vlan="$vlan"
+		uci set network.$name.ports="$CPUPORT $ports"
+	}
+
+	remove_vlan() {
+		local name="$1"
+
+		# remove switch_vlan
+		uci del network.$name
+	}
+
+	config_load network
+	config_foreach remove_vlan switch_vlan
+
+	config_load gateway
+	config_foreach add_vlan vlan
+}

Ich finde es zwar durchaus blöd, erst alle switch_vlan platt zu machen, aber in meinen Augen ist die allgemeinere Lösung erstrebenswerter. Zudem wird das Skript in der Praxis ja sehr selten laufen, also ist das Löschen auch von der Speicherbelastung marginal.

Grüße

Adrian
Adrian Schmutzler April 18, 2019, 9:29 a.m.
Nachtrag:

 

Man könnte auch hier (wie beim network-Patchset) die switch_vlan Einträge einfach mit „vlan1“, „vlan2“, „vlan11“ benennen. Dann wäre sie vom Gerätenamen unabhängig, aber trotzdem per Name ansprechbar:

uci set network.vlan2.ports=’1 2 0t’

 

Ich fände es super, wenn wir zumindest 1/3 und 3/3 zeitnah mal in eine neue Version kriegen.

 

Wenn du willst, kann ich das auch übernehmen.

 

Grüße

 

Adrian

 

From: franken-dev [mailto:franken-dev-bounces@freifunk.net] On Behalf Of Adrian Schmutzler
Sent: Freitag, 12. April 2019 17:13
To: franken-dev@freifunk.net
Subject: RE: [PATCH v2 3/3] gateway.d: Add scripts for network configuration

 

Hallo Fabian, 

aus aktuellem Anlass habe ich mir den Patch nochmal aus einem etwas anderen Blickwinkel angesehen. 

> +     config_load network 
> +     config_foreach remove_vlan switch_vlan 
> + 
> +     config_load gateway 
> +     config_foreach add_vlan vlan 

Ich habe erst länger rumüberlegt, ob man das irgendwie hinkriegt, ohne alles zu löschen und neu zu schreiben. Da man bei dir aber variabel neue VLANs definieren kann, geht es glaube ich nur so.

Hier besteht jetzt das Problem mit dem SWITCHDEV. Wenn man das nicht aus network.* auslesen möchte, gibt es mehrere Möglichkeiten:

1. Das Switch ist im uci noch da. Switch gibt es bei uns immer nur eines. D.h. auch ohne Namen kann ich mit network.@switch[0 <mailto:network.@switch[0> ] arbeiten.

Leider kriegt man mit uci bei dieser Syntax den Namen der section nur mit viel Murks: 
DEV=$(uci show network.@switch[0 <mailto:network.@switch[0> ] | grep "=switch" |  sed "s#network.\([^=]*\)=switch.*#\1#") 
Finde ich nicht so geil. 
Allerdings brauchen wir den Namen des ethX gar nicht, denn: 

2. Das Switch enthält den Namen des Hardware-Device (?) unter network.@switch[0].name <mailto:network.@switch[0].name>  (beim 1043v2 z.B. „ag71xx-mdio.0“).

Da uns keiner zwingt, die switch_vlans zu benennen, und wenn wir alle alten gelöscht haben (hierzu müsste man dann remove_vlan ändern), können wir dann

      swvlan=$(uci add network switch_vlan) 
      uci set network.$swvlan.device="$(uci get network.@switch[0].name <mailto:network.@switch[0].name> )" 
      uci set network.$swvlan.vlan="$vlan" 
      uci set network.$swvlan.ports="$CPUPORT $ports" 
Und schon sind wir unabhängig von fff-network. Das ginge so btw auch mit der OpenWrt Standardconfig, die benennen übrigens ihre switch_vlan Einträge auch nicht.

Nebenbei ist der Code trotzdem schlank. 

Mit dieser Lösung wären wir unabhängig von irgendwelchen spezifischen Informationen über das Gerät, solange es ein Switch hat.

Für den CPUPORT würde ich jetzt wie bereits an anderer Stelle erwähnt einfach das Skript aus meinem Patchset sourcen und fertig.

Würde dann wohl so aussehen: 
+. /lib/functions/fff/cpuport 
+ 
+configure() { 
+       add_vlan() { 
+               local vlan="$1" 
+               local device="$(uci get network.@switch[0].name <mailto:network.@switch[0].name> )" 
+               local ports="$(uci get gateway.$vlan.ports)" 
+ 
+               local name="$(uci add network 'switch_vlan')" 
+               uci set network.$name.device="$device" 
+               uci set network.$name.vlan="$vlan" 
+               uci set network.$name.ports="$CPUPORT $ports" 
+       } 
+ 
+       remove_vlan() { 
+               local name="$1" 
+ 
+               # remove switch_vlan 
+               uci del network.$name 
+       } 
+ 
+       config_load network 
+       config_foreach remove_vlan switch_vlan 
+ 
+       config_load gateway 
+       config_foreach add_vlan vlan 
+} 

Ich finde es zwar durchaus blöd, erst alle switch_vlan platt zu machen, aber in meinen Augen ist die allgemeinere Lösung erstrebenswerter. Zudem wird das Skript in der Praxis ja sehr selten laufen, also ist das Löschen auch von der Speicherbelastung marginal.

Grüße 

Adrian