[v4,01/11] simple-tc: Fix simple-tc not being active if set

Submitted by Adrian Schmutzler on July 21, 2017, 1:08 p.m.

Details

Message ID 1500642529-3627-2-git-send-email-freifunk@adrianschmutzler.de
State Superseded
Headers show

Commit Message

Adrian Schmutzler July 21, 2017, 1:08 p.m.
Simple-tc is active immediately after the call and needs no
restart of anything

Signed-off-by: Adrian Schmutzler <freifunk@adrianschmutzler.de>

Tested-by: Adrian Schmutzler <freifunk@adrianschmutzler.de>
---
 src/packages/fff/fff-network/Makefile                      |  2 +-
 src/packages/fff/fff-network/files/usr/sbin/applysimpletc  | 14 ++++++++++++++
 .../fff/fff-network/files/usr/sbin/configurenetwork        | 12 ++++++++++++
 .../fff/fff-web/files/www/ssl/cgi-bin/settings.html        |  3 +++
 4 files changed, 30 insertions(+), 1 deletion(-)
 create mode 100755 src/packages/fff/fff-network/files/usr/sbin/applysimpletc

Patch hide | download patch | download mbox

diff --git a/src/packages/fff/fff-network/Makefile b/src/packages/fff/fff-network/Makefile
index fee3f98..f7dc63c 100644
--- a/src/packages/fff/fff-network/Makefile
+++ b/src/packages/fff/fff-network/Makefile
@@ -1,7 +1,7 @@ 
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=fff-network
-PKG_VERSION:=0.0.6
+PKG_VERSION:=7
 PKG_RELEASE:=1
 
 PKG_BUILD_DIR:=$(BUILD_DIR)/fff-network
diff --git a/src/packages/fff/fff-network/files/usr/sbin/applysimpletc b/src/packages/fff/fff-network/files/usr/sbin/applysimpletc
new file mode 100755
index 0000000..a9744b0
--- /dev/null
+++ b/src/packages/fff/fff-network/files/usr/sbin/applysimpletc
@@ -0,0 +1,14 @@ 
+#!/bin/sh
+
+tc_device=$(uci -q get "network.wan.ifname")
+tc_enabled=$(uci -q get "simple-tc.example.enabled")
+tc_in=$(uci -q get "simple-tc.example.limit_ingress")
+tc_out=$(uci -q get "simple-tc.example.limit_egress")
+
+if [ "$tc_enabled" -eq 1 ] ; then
+	test -n "$tc_in" || tc_in=-
+	test -n "$tc_out" || tc_out=-
+	simple-tc "$tc_device" "$tc_in" "$tc_out"
+else
+	simple-tc "$tc_device" - -
+fi
diff --git a/src/packages/fff/fff-network/files/usr/sbin/configurenetwork b/src/packages/fff/fff-network/files/usr/sbin/configurenetwork
index 7ecfa3b..63b216a 100755
--- a/src/packages/fff/fff-network/files/usr/sbin/configurenetwork
+++ b/src/packages/fff/fff-network/files/usr/sbin/configurenetwork
@@ -189,3 +189,15 @@  else
 
     /etc/init.d/fff-uradvd restart
 fi
+
+# Apply traffic control
+tc_device=$(uci -q get "network.wan.ifname")
+tc_enabled=$(uci -q get "simple-tc.example.enabled")
+tc_in=$(uci -q get "simple-tc.example.limit_ingress")
+tc_out=$(uci -q get "simple-tc.example.limit_egress")
+
+if [ "$tc_enabled" -eq 1 ] ; then
+	test -n "$tc_in" || tc_in=-
+	test -n "$tc_out" || tc_out=-
+	simple-tc "$tc_device" "$tc_in" "$tc_out"
+fi
diff --git a/src/packages/fff/fff-web/files/www/ssl/cgi-bin/settings.html b/src/packages/fff/fff-web/files/www/ssl/cgi-bin/settings.html
index a7417dc..bdbd69b 100755
--- a/src/packages/fff/fff-web/files/www/ssl/cgi-bin/settings.html
+++ b/src/packages/fff/fff-web/files/www/ssl/cgi-bin/settings.html
@@ -32,6 +32,9 @@  if [ "$REQUEST_METHOD" == "POST" ] ; then
 		uci -q set "simple-tc.example.limit_egress=${POST_limit_egress}"
 
 		uci commit
+		
+		/usr/sbin/applysimpletc
+		
 		MSG='<span class="green">Daten gespeichert! - Bitte Router neustarten.</span>'
 	fi
 fi

Comments

Tobias Klaus July 31, 2017, 10:12 p.m.
Hallo Adrian,

ich hab mir gerade mal das mantis-issue und den Patch angeschaut und das war 
jetzt gar nicht so leicht sich hier eine Meinung zu bilden. 

Wenn ich mich nicht irre liegen dem nicht-Funktionieren von simple-tc doch 2 
Probleme zugrunde:

1. Wir konfigurieren simple-tc nicht ordentlich und lassen den Standardwert 
für das interface mit "example" stehen.
- ich denke hier sollten wir das "ordentlich" konfigurieren und example    
  löschen und das jeweilige "wan" konfigurieren. Dafür bietet sich vermutlich
  ein entsprechendes uci-default script an

2. hotplug.d/net wird nicht mit unserem WAN aufgerufen. 
Nachdem ich auf die schnelle keine ordentliche Doku zu hotplug.de/net gefunden 
habe, gehe ich mal davon aus, dass sich das an der falschen Stelle befindet 
und eher in hotplug.d/iface landen hätte sollen. So oder so würde ich das 
ganze eher über ein init-Skript lösen, das durch ein procd_add_reload_trigger 
"simple-tc" immer mit dem "reload"-Parameter aufgerufen wird, wenn sich was im 
/etc/config/simplce-tc ändert. Dann müssen wir uns auch keine Gedanken machen, 
wann wir es manuell aufrufen müssen. Für ein solches Skript, könnten 
vermutlich die meisten Teile von dem Skript /etc/hotplug.d/net/50-simple-tc 
wieder verwendet werden. Die vorgeschlagene Lösung ist mir hier etwas zu 
"ungenerisch", da sie fest den wert für das interface "example" auf das wan-
interface anwenden.

Zusätzlich zu diesen zwei Überlegungen, frage ich mich noch _wo_ man solche 
Änderungen (vor allem die 2.) unterbringt. Eigentlich wäre hier ein Patch 
gegen den gluon-Feed, der durch unser buildskript aufgespielt wird, fast das 
sauberste. Diesen könnte man dann auch versuchen upstream zu kriegen. 
Allerdings können wir das auch wie vorgeschlagen in fff-network lassen(das für 
uns kaputte hotplug Skript tut ja nicht weh) oder aber (das finde ich wiederum 
etwas sauberer) ein fff-simpletc Paket einführen.

Wenn ich mir das so ansehe weiß ich wieder, warum ich simple-tc immer 
ignoriert habe und gehofft habe, dass es einfach tut.... :-D

Ich hab inline noch ein paar Anmerkungen zum Code.

Viele Grüße
Tobias


Am Freitag, 21. Juli 2017, 15:08:39 CEST schrieb Adrian Schmutzler:
> Simple-tc is active immediately after the call and needs no
> restart of anything
> 
> Signed-off-by: Adrian Schmutzler <freifunk@adrianschmutzler.de>
> 
> Tested-by: Adrian Schmutzler <freifunk@adrianschmutzler.de>
> ---
>  src/packages/fff/fff-network/Makefile                      |  2 +-
>  src/packages/fff/fff-network/files/usr/sbin/applysimpletc  | 14
> ++++++++++++++ .../fff/fff-network/files/usr/sbin/configurenetwork        |
> 12 ++++++++++++ .../fff/fff-web/files/www/ssl/cgi-bin/settings.html       
> |  3 +++ 4 files changed, 30 insertions(+), 1 deletion(-)
>  create mode 100755
> src/packages/fff/fff-network/files/usr/sbin/applysimpletc
> 
> diff --git a/src/packages/fff/fff-network/Makefile
> b/src/packages/fff/fff-network/Makefile index fee3f98..f7dc63c 100644
> --- a/src/packages/fff/fff-network/Makefile
> +++ b/src/packages/fff/fff-network/Makefile
> @@ -1,7 +1,7 @@
>  include $(TOPDIR)/rules.mk
> 
>  PKG_NAME:=fff-network
> -PKG_VERSION:=0.0.6
> +PKG_VERSION:=7
Das ist ein gehöriger Versionssprung. ;-)

>  PKG_RELEASE:=1
> 
>  PKG_BUILD_DIR:=$(BUILD_DIR)/fff-network
> diff --git a/src/packages/fff/fff-network/files/usr/sbin/applysimpletc
> b/src/packages/fff/fff-network/files/usr/sbin/applysimpletc new file mode
> 100755
> index 0000000..a9744b0
> --- /dev/null
> +++ b/src/packages/fff/fff-network/files/usr/sbin/applysimpletc
> @@ -0,0 +1,14 @@
> +#!/bin/sh
> +
> +tc_device=$(uci -q get "network.wan.ifname")
> +tc_enabled=$(uci -q get "simple-tc.example.enabled")
> +tc_in=$(uci -q get "simple-tc.example.limit_ingress")
> +tc_out=$(uci -q get "simple-tc.example.limit_egress")
> +
> +if [ "$tc_enabled" -eq 1 ] ; then
> +	test -n "$tc_in" || tc_in=-
> +	test -n "$tc_out" || tc_out=-
tc_out=${tc_out:-"-"} ist etwas eleganter und weißt tc_out den Wert von 
$tc_out zu oder, falls nicht vorhanden, "-".

> +	simple-tc "$tc_device" "$tc_in" "$tc_out"
Wenn man diese Zeile ans Ende des if/else zieht kann man sich den else-Zweig 
sparen und muss in Zukunft nur einen simple-tc-Aufruf "pflegen".
> +else
> +	simple-tc "$tc_device" - -
> +fi
> diff --git a/src/packages/fff/fff-network/files/usr/sbin/configurenetwork
> b/src/packages/fff/fff-network/files/usr/sbin/configurenetwork index
> 7ecfa3b..63b216a 100755
> --- a/src/packages/fff/fff-network/files/usr/sbin/configurenetwork
> +++ b/src/packages/fff/fff-network/files/usr/sbin/configurenetwork
> @@ -189,3 +189,15 @@ else
> 
>      /etc/init.d/fff-uradvd restart
>  fi
> +
> +# Apply traffic control
Wenn wir das skript "applysimpletc" doch drin lassen, sollte es hier direkt 
aufgerufen werden. Auch so sparen wir uns duplizierten und vor allem 
dupliziert zu pflegenden Code.

> +tc_device=$(uci -q get "network.wan.ifname")
> +tc_enabled=$(uci -q get "simple-tc.example.enabled")
> +tc_in=$(uci -q get "simple-tc.example.limit_ingress")
> +tc_out=$(uci -q get "simple-tc.example.limit_egress")
> +
> +if [ "$tc_enabled" -eq 1 ] ; then
> +	test -n "$tc_in" || tc_in=-
> +	test -n "$tc_out" || tc_out=-
> +	simple-tc "$tc_device" "$tc_in" "$tc_out"
> +fi
> diff --git a/src/packages/fff/fff-web/files/www/ssl/cgi-bin/settings.html
> b/src/packages/fff/fff-web/files/www/ssl/cgi-bin/settings.html index
> a7417dc..bdbd69b 100755
> --- a/src/packages/fff/fff-web/files/www/ssl/cgi-bin/settings.html
> +++ b/src/packages/fff/fff-web/files/www/ssl/cgi-bin/settings.html
> @@ -32,6 +32,9 @@ if [ "$REQUEST_METHOD" == "POST" ] ; then
>  		uci -q set "simple-tc.example.limit_egress=${POST_limit_egress}"
> 
>  		uci commit
> +
> +		/usr/sbin/applysimpletc
> +
>  		MSG='<span class="green">Daten gespeichert! - Bitte Router
> neustarten.</span>' fi
>  fi
Adrian Schmutzler Aug. 1, 2017, 9:58 p.m.
Hallo Tobias,

zu 1.:
Wir konfigurieren simple-tc richtig.
Das hotplug.d Skript
(https://github.com/freifunk-gluon/packages/blob/90380414f10842238b7ebc21c34
dbaf986659320/net/simple-tc/files/etc/hotplug.d/net/50-simple-tc) nutzt die
config_foreach Funktion, die alle Elemente parst, die Typ 'interface' haben.
Der Name ist völlig egal und könnte auch qwertz oder sonstwie sein. Relevant
ist die option ifname (simple-tc.example.ifname), die den Bezug zum WAN
interface herstellt. Diese wird richtig gesetzt, entsprechend bin ich gegen
eine Änderung, weil diese nichts bringt und eher Probleme aufwirft.
Effektiv wird also das letzte 'interface' genutzt, das den richtigen
'ifname' eingetragen hat (z.B. falls mehrere interfaces in
/etc/config/simple-tc vorhanden sind).

zu 2.:
Das mit iface kann ich mal testen, wobei mich wundert, das andere Interfaces
hotplug.d/net ja auch triggern. Kann es sein, dass es einen
hotplug-Parameter gibt, der nicht bei allen interfaces gesetzt ist? So wie
z.B. bei SATA-Festplatten/-Ports einzeln die Hotplug-Fähigkeit im BIOS
konfiguriert werden kann (bei AHCI)?
Den Teil mit dem procd_add_reload_trigger verstehe ich nicht ganz, da fehlt
mir der Hintergrund der Software-Konzeption.
Tatsächlich habe ich die jetzige Lösung als Workaround gedacht, bis es eine
echte Lösung gibt (was meines Erachtens noch etwas dauern könnte). Da wir
ohnehin nur 'example' setzen, kann man im configurenetwork auch direkt
'example' auswerten.

Im Moment ist die Situation ja so, dass man im WebUI ein Feature einstellen
kann, dass keine Funktion hat (immerhin auf wohl allen 20170110-Geräten).
Falls eine Möglichkeit zeitnah absehbar ist, das Ganze generisch zu fixen,
würde ich diese natürlich bevorzugen (bei anderen interfaces als WAN
funktioniert das Originalskript aber wahrscheinlich sogar). Falls dies nicht
absehbar ist (und das war zum Zeitpunkt der Patcherstellung der Fall) würde
ich das lieber erstmal als Workaround reparieren und dann irgendwann später
mal ordentlich lösen, wenn jemand das Problem wirklich durchdrungen hat.

Zudem existiert ja das Problem, dass die Einstellung nicht update-sicher
ist, was ich mit einem weiteren Patch (das fff config file) beheben will.
Auch hier wird natürlich wieder _nur_ das WAN-Setting gespeichert (generisch
für alle ist das ja wenig sinnvoll), sodass wieder spezifisch 'example'
herausgegriffen wird. Im Grunde ist es also wahrscheinlich gerechtfertigt,
hier auf die nicht generische Lösung zu setzen, da die wohl als einzige von
der Mehrzahl der Nutzer genutzt wird.

Zu den Inlines:
siehe Inline!

Sorry für den vielen Text und beste Grüße

Adrian


-----Original Message-----
From: franken-dev [mailto:franken-dev-bounces@freifunk.net] On Behalf Of
Tobias Klaus
Sent: Dienstag, 1. August 2017 00:12
To: franken-dev@freifunk.net; Adrian Schmutzler
<freifunk@adrianschmutzler.de>
Subject: Re: [PATCH v4 01/11] simple-tc: Fix simple-tc not being active if
set

Hallo Adrian,

ich hab mir gerade mal das mantis-issue und den Patch angeschaut und das war
jetzt gar nicht so leicht sich hier eine Meinung zu bilden. 

Wenn ich mich nicht irre liegen dem nicht-Funktionieren von simple-tc doch 2
Probleme zugrunde:

1. Wir konfigurieren simple-tc nicht ordentlich und lassen den Standardwert
für das interface mit "example" stehen.
- ich denke hier sollten wir das "ordentlich" konfigurieren und example    
  löschen und das jeweilige "wan" konfigurieren. Dafür bietet sich
vermutlich
  ein entsprechendes uci-default script an

2. hotplug.d/net wird nicht mit unserem WAN aufgerufen. 
Nachdem ich auf die schnelle keine ordentliche Doku zu hotplug.de/net
gefunden habe, gehe ich mal davon aus, dass sich das an der falschen Stelle
befindet und eher in hotplug.d/iface landen hätte sollen. So oder so würde
ich das ganze eher über ein init-Skript lösen, das durch ein
procd_add_reload_trigger "simple-tc" immer mit dem "reload"-Parameter
aufgerufen wird, wenn sich was im /etc/config/simplce-tc ändert. Dann müssen
wir uns auch keine Gedanken machen, wann wir es manuell aufrufen müssen. Für
ein solches Skript, könnten vermutlich die meisten Teile von dem Skript
/etc/hotplug.d/net/50-simple-tc wieder verwendet werden. Die vorgeschlagene
Lösung ist mir hier etwas zu "ungenerisch", da sie fest den wert für das
interface "example" auf das wan- interface anwenden.

Zusätzlich zu diesen zwei Überlegungen, frage ich mich noch _wo_ man solche
Änderungen (vor allem die 2.) unterbringt. Eigentlich wäre hier ein Patch
gegen den gluon-Feed, der durch unser buildskript aufgespielt wird, fast das
sauberste. Diesen könnte man dann auch versuchen upstream zu kriegen. 
Allerdings können wir das auch wie vorgeschlagen in fff-network lassen(das
für uns kaputte hotplug Skript tut ja nicht weh) oder aber (das finde ich
wiederum etwas sauberer) ein fff-simpletc Paket einführen.

Wenn ich mir das so ansehe weiß ich wieder, warum ich simple-tc immer
ignoriert habe und gehofft habe, dass es einfach tut.... :-D

Ich hab inline noch ein paar Anmerkungen zum Code.

Viele Grüße
Tobias


Am Freitag, 21. Juli 2017, 15:08:39 CEST schrieb Adrian Schmutzler:
> Simple-tc is active immediately after the call and needs no restart of 
> anything
> 
> Signed-off-by: Adrian Schmutzler <freifunk@adrianschmutzler.de>
> 
> Tested-by: Adrian Schmutzler <freifunk@adrianschmutzler.de>
> ---
>  src/packages/fff/fff-network/Makefile                      |  2 +-
>  src/packages/fff/fff-network/files/usr/sbin/applysimpletc  | 14
> ++++++++++++++ .../fff/fff-network/files/usr/sbin/configurenetwork
|
> 12 ++++++++++++ .../fff/fff-web/files/www/ssl/cgi-bin/settings.html       
> |  3 +++ 4 files changed, 30 insertions(+), 1 deletion(-)
>  create mode 100755
> src/packages/fff/fff-network/files/usr/sbin/applysimpletc
> 
> diff --git a/src/packages/fff/fff-network/Makefile
> b/src/packages/fff/fff-network/Makefile index fee3f98..f7dc63c 100644
> --- a/src/packages/fff/fff-network/Makefile
> +++ b/src/packages/fff/fff-network/Makefile
> @@ -1,7 +1,7 @@
>  include $(TOPDIR)/rules.mk
> 
>  PKG_NAME:=fff-network
> -PKG_VERSION:=0.0.6
> +PKG_VERSION:=7
Das ist ein gehöriger Versionssprung. ;-)
ADRIAN: Die Versionsnummer sind inkonsistent, insofern bin ich davon
ausgegangen, von 0.0.x auf x+1 zu ändern. Beim Nodewatcher gibt es ja z.B.
auch kein 0.0.x

>  PKG_RELEASE:=1
> 
>  PKG_BUILD_DIR:=$(BUILD_DIR)/fff-network
> diff --git a/src/packages/fff/fff-network/files/usr/sbin/applysimpletc
> b/src/packages/fff/fff-network/files/usr/sbin/applysimpletc new file 
> mode
> 100755
> index 0000000..a9744b0
> --- /dev/null
> +++ b/src/packages/fff/fff-network/files/usr/sbin/applysimpletc
> @@ -0,0 +1,14 @@
> +#!/bin/sh
> +
> +tc_device=$(uci -q get "network.wan.ifname") tc_enabled=$(uci -q get 
> +"simple-tc.example.enabled") tc_in=$(uci -q get 
> +"simple-tc.example.limit_ingress")
> +tc_out=$(uci -q get "simple-tc.example.limit_egress")
> +
> +if [ "$tc_enabled" -eq 1 ] ; then
> +	test -n "$tc_in" || tc_in=-
> +	test -n "$tc_out" || tc_out=-
tc_out=${tc_out:-"-"} ist etwas eleganter und weißt tc_out den Wert von
$tc_out zu oder, falls nicht vorhanden, "-".
ADRIAN: Die Syntax kenne ich nicht ... ;-)

> +	simple-tc "$tc_device" "$tc_in" "$tc_out"
Wenn man diese Zeile ans Ende des if/else zieht kann man sich den else-Zweig
sparen und muss in Zukunft nur einen simple-tc-Aufruf "pflegen".
ADRIAN: Sicher? Denn tc_in und tc_out werden nicht auf "-" gesetzt, nur weil
tc_enabled=0 ist! Die müsste man dann ich else beide setzen ...
> +else
> +	simple-tc "$tc_device" - -
> +fi
> diff --git 
> a/src/packages/fff/fff-network/files/usr/sbin/configurenetwork
> b/src/packages/fff/fff-network/files/usr/sbin/configurenetwork index 
> 7ecfa3b..63b216a 100755
> --- a/src/packages/fff/fff-network/files/usr/sbin/configurenetwork
> +++ b/src/packages/fff/fff-network/files/usr/sbin/configurenetwork
> @@ -189,3 +189,15 @@ else
> 
>      /etc/init.d/fff-uradvd restart
>  fi
> +
> +# Apply traffic control
Wenn wir das skript "applysimpletc" doch drin lassen, sollte es hier direkt
aufgerufen werden. Auch so sparen wir uns duplizierten und vor allem
dupliziert zu pflegenden Code.
ADRIAN: War so in meiner ursprünglichen Variante. Da configurenetwork aber
beim Boot aufgerufen wird, fand ich es besser, simple-tc nur aufzurufen,
wenn es gebraucht wird. Sonst würde auf allen Geräten ohne Traffic-Control
immer "simple-tc - -" beim Start aufgerufen (was nicht sein muss, um eine
unnötige Störungsquelle zu vermeiden). In der applysimpletc wiederum braucht
man "simple-tc - -", da so beim Aufruf aus dem WebUI nach Änderung die alten
Werte gelöscht werden müssen.
Mir ist nichts eingefallen, das eleganter zu lösen.

> +tc_device=$(uci -q get "network.wan.ifname") tc_enabled=$(uci -q get 
> +"simple-tc.example.enabled") tc_in=$(uci -q get 
> +"simple-tc.example.limit_ingress")
> +tc_out=$(uci -q get "simple-tc.example.limit_egress")
> +
> +if [ "$tc_enabled" -eq 1 ] ; then
> +	test -n "$tc_in" || tc_in=-
> +	test -n "$tc_out" || tc_out=-
> +	simple-tc "$tc_device" "$tc_in" "$tc_out"
> +fi
> diff --git 
> a/src/packages/fff/fff-web/files/www/ssl/cgi-bin/settings.html
> b/src/packages/fff/fff-web/files/www/ssl/cgi-bin/settings.html index 
> a7417dc..bdbd69b 100755
> --- a/src/packages/fff/fff-web/files/www/ssl/cgi-bin/settings.html
> +++ b/src/packages/fff/fff-web/files/www/ssl/cgi-bin/settings.html
> @@ -32,6 +32,9 @@ if [ "$REQUEST_METHOD" == "POST" ] ; then
>  		uci -q set
"simple-tc.example.limit_egress=${POST_limit_egress}"
> 
>  		uci commit
> +
> +		/usr/sbin/applysimpletc
> +
>  		MSG='<span class="green">Daten gespeichert! - Bitte Router 
> neustarten.</span>' fi  fi

--
franken-dev mailing list
franken-dev@freifunk.net
http://lists.freifunk.net/mailman/listinfo/franken-dev-freifunk.net
Adrian Schmutzler Aug. 1, 2017, 10:06 p.m.
Nachtrag:

Warum steht der Code im configurenetwork?

=> Um Race-Conditions auszuschließen, wollte ich simple-tc erst direkt
aufrufen, wenn das Netzwerk "konfiguriert" ist. Da configurenetwork in der
rc.local aufgerufen wird, also meines Wissens nach allem anderen was es so
als boot-init-Zeugs gibt, muss ich simple-tc wieder danach callen (sonst
gibt es eth0 bzw. eth1 evtl. gar nicht). Also entweder (wie im Patch) am
Ende von configurenetwork einfügen oder als eigenes Skript in rc.local
aufrufen (was mir nicht so gut gefallen hat).

Grüße

Adrian

-----Original Message-----
From: franken-dev [mailto:franken-dev-bounces@freifunk.net] On Behalf Of
Tobias Klaus
Sent: Dienstag, 1. August 2017 00:12
To: franken-dev@freifunk.net; Adrian Schmutzler
<freifunk@adrianschmutzler.de>
Subject: Re: [PATCH v4 01/11] simple-tc: Fix simple-tc not being active if
set

Hallo Adrian,

ich hab mir gerade mal das mantis-issue und den Patch angeschaut und das war
jetzt gar nicht so leicht sich hier eine Meinung zu bilden. 

Wenn ich mich nicht irre liegen dem nicht-Funktionieren von simple-tc doch 2
Probleme zugrunde:

1. Wir konfigurieren simple-tc nicht ordentlich und lassen den Standardwert
für das interface mit "example" stehen.
- ich denke hier sollten wir das "ordentlich" konfigurieren und example    
  löschen und das jeweilige "wan" konfigurieren. Dafür bietet sich
vermutlich
  ein entsprechendes uci-default script an

2. hotplug.d/net wird nicht mit unserem WAN aufgerufen. 
Nachdem ich auf die schnelle keine ordentliche Doku zu hotplug.de/net
gefunden habe, gehe ich mal davon aus, dass sich das an der falschen Stelle
befindet und eher in hotplug.d/iface landen hätte sollen. So oder so würde
ich das ganze eher über ein init-Skript lösen, das durch ein
procd_add_reload_trigger "simple-tc" immer mit dem "reload"-Parameter
aufgerufen wird, wenn sich was im /etc/config/simplce-tc ändert. Dann müssen
wir uns auch keine Gedanken machen, wann wir es manuell aufrufen müssen. Für
ein solches Skript, könnten vermutlich die meisten Teile von dem Skript
/etc/hotplug.d/net/50-simple-tc wieder verwendet werden. Die vorgeschlagene
Lösung ist mir hier etwas zu "ungenerisch", da sie fest den wert für das
interface "example" auf das wan- interface anwenden.

Zusätzlich zu diesen zwei Überlegungen, frage ich mich noch _wo_ man solche
Änderungen (vor allem die 2.) unterbringt. Eigentlich wäre hier ein Patch
gegen den gluon-Feed, der durch unser buildskript aufgespielt wird, fast das
sauberste. Diesen könnte man dann auch versuchen upstream zu kriegen. 
Allerdings können wir das auch wie vorgeschlagen in fff-network lassen(das
für uns kaputte hotplug Skript tut ja nicht weh) oder aber (das finde ich
wiederum etwas sauberer) ein fff-simpletc Paket einführen.

Wenn ich mir das so ansehe weiß ich wieder, warum ich simple-tc immer
ignoriert habe und gehofft habe, dass es einfach tut.... :-D

Ich hab inline noch ein paar Anmerkungen zum Code.

Viele Grüße
Tobias


Am Freitag, 21. Juli 2017, 15:08:39 CEST schrieb Adrian Schmutzler:
> Simple-tc is active immediately after the call and needs no restart of 
> anything
> 
> Signed-off-by: Adrian Schmutzler <freifunk@adrianschmutzler.de>
> 
> Tested-by: Adrian Schmutzler <freifunk@adrianschmutzler.de>
> ---
>  src/packages/fff/fff-network/Makefile                      |  2 +-
>  src/packages/fff/fff-network/files/usr/sbin/applysimpletc  | 14
> ++++++++++++++ .../fff/fff-network/files/usr/sbin/configurenetwork
|
> 12 ++++++++++++ .../fff/fff-web/files/www/ssl/cgi-bin/settings.html       
> |  3 +++ 4 files changed, 30 insertions(+), 1 deletion(-)
>  create mode 100755
> src/packages/fff/fff-network/files/usr/sbin/applysimpletc
> 
> diff --git a/src/packages/fff/fff-network/Makefile
> b/src/packages/fff/fff-network/Makefile index fee3f98..f7dc63c 100644
> --- a/src/packages/fff/fff-network/Makefile
> +++ b/src/packages/fff/fff-network/Makefile
> @@ -1,7 +1,7 @@
>  include $(TOPDIR)/rules.mk
> 
>  PKG_NAME:=fff-network
> -PKG_VERSION:=0.0.6
> +PKG_VERSION:=7
Das ist ein gehöriger Versionssprung. ;-)

>  PKG_RELEASE:=1
> 
>  PKG_BUILD_DIR:=$(BUILD_DIR)/fff-network
> diff --git a/src/packages/fff/fff-network/files/usr/sbin/applysimpletc
> b/src/packages/fff/fff-network/files/usr/sbin/applysimpletc new file 
> mode
> 100755
> index 0000000..a9744b0
> --- /dev/null
> +++ b/src/packages/fff/fff-network/files/usr/sbin/applysimpletc
> @@ -0,0 +1,14 @@
> +#!/bin/sh
> +
> +tc_device=$(uci -q get "network.wan.ifname") tc_enabled=$(uci -q get 
> +"simple-tc.example.enabled") tc_in=$(uci -q get 
> +"simple-tc.example.limit_ingress")
> +tc_out=$(uci -q get "simple-tc.example.limit_egress")
> +
> +if [ "$tc_enabled" -eq 1 ] ; then
> +	test -n "$tc_in" || tc_in=-
> +	test -n "$tc_out" || tc_out=-
tc_out=${tc_out:-"-"} ist etwas eleganter und weißt tc_out den Wert von
$tc_out zu oder, falls nicht vorhanden, "-".

> +	simple-tc "$tc_device" "$tc_in" "$tc_out"
Wenn man diese Zeile ans Ende des if/else zieht kann man sich den else-Zweig
sparen und muss in Zukunft nur einen simple-tc-Aufruf "pflegen".
> +else
> +	simple-tc "$tc_device" - -
> +fi
> diff --git 
> a/src/packages/fff/fff-network/files/usr/sbin/configurenetwork
> b/src/packages/fff/fff-network/files/usr/sbin/configurenetwork index 
> 7ecfa3b..63b216a 100755
> --- a/src/packages/fff/fff-network/files/usr/sbin/configurenetwork
> +++ b/src/packages/fff/fff-network/files/usr/sbin/configurenetwork
> @@ -189,3 +189,15 @@ else
> 
>      /etc/init.d/fff-uradvd restart
>  fi
> +
> +# Apply traffic control
Wenn wir das skript "applysimpletc" doch drin lassen, sollte es hier direkt
aufgerufen werden. Auch so sparen wir uns duplizierten und vor allem
dupliziert zu pflegenden Code.

> +tc_device=$(uci -q get "network.wan.ifname") tc_enabled=$(uci -q get 
> +"simple-tc.example.enabled") tc_in=$(uci -q get 
> +"simple-tc.example.limit_ingress")
> +tc_out=$(uci -q get "simple-tc.example.limit_egress")
> +
> +if [ "$tc_enabled" -eq 1 ] ; then
> +	test -n "$tc_in" || tc_in=-
> +	test -n "$tc_out" || tc_out=-
> +	simple-tc "$tc_device" "$tc_in" "$tc_out"
> +fi
> diff --git 
> a/src/packages/fff/fff-web/files/www/ssl/cgi-bin/settings.html
> b/src/packages/fff/fff-web/files/www/ssl/cgi-bin/settings.html index 
> a7417dc..bdbd69b 100755
> --- a/src/packages/fff/fff-web/files/www/ssl/cgi-bin/settings.html
> +++ b/src/packages/fff/fff-web/files/www/ssl/cgi-bin/settings.html
> @@ -32,6 +32,9 @@ if [ "$REQUEST_METHOD" == "POST" ] ; then
>  		uci -q set
"simple-tc.example.limit_egress=${POST_limit_egress}"
> 
>  		uci commit
> +
> +		/usr/sbin/applysimpletc
> +
>  		MSG='<span class="green">Daten gespeichert! - Bitte Router 
> neustarten.</span>' fi  fi

--
franken-dev mailing list
franken-dev@freifunk.net
http://lists.freifunk.net/mailman/listinfo/franken-dev-freifunk.net
Tobias Klaus Aug. 2, 2017, 8:30 p.m.
Hallo,

Am Dienstag, 1. August 2017, 23:58:37 CEST schrieb mail@adrianschmutzler.de:
> Hallo Tobias,
> 
> zu 1.:
> Wir konfigurieren simple-tc richtig.
> Das hotplug.d Skript
> (https://github.com/freifunk-gluon/packages/blob/90380414f10842238b7ebc21c34
> dbaf986659320/net/simple-tc/files/etc/hotplug.d/net/50-simple-tc) nutzt die
> config_foreach Funktion, die alle Elemente parst, die Typ 'interface'
> haben. Der Name ist völlig egal und könnte auch qwertz oder sonstwie sein.
> Relevant ist die option ifname (simple-tc.example.ifname), die den Bezug
> zum WAN interface herstellt. Diese wird richtig gesetzt, entsprechend bin
> ich gegen eine Änderung, weil diese nichts bringt und eher Probleme
> aufwirft. Effektiv wird also das letzte 'interface' genutzt, das den
> richtigen 'ifname' eingetragen hat (z.B. falls mehrere interfaces in
> /etc/config/simple-tc vorhanden sind).
Ja du hast recht, das hab ich falsch interpretiert.

> zu 2.:
> Das mit iface kann ich mal testen, wobei mich wundert, das andere Interfaces
> hotplug.d/net ja auch triggern. Kann es sein, dass es einen
> hotplug-Parameter gibt, der nicht bei allen interfaces gesetzt ist? So wie
> z.B. bei SATA-Festplatten/-Ports einzeln die Hotplug-Fähigkeit im BIOS
> konfiguriert werden kann (bei AHCI)?
Ich könnte mir auch vorstellen, dass der hotplug Mechanismus zu spät aktiviert 
wird und so das Event verloren geht. Wenn einen das interessiert, sollte man 
vielleicht mal auf der lede-Mailingliste oder bugtracker ansprechen. 
Unabhängig davon finde ich immer mehr, dass es gar nicht ausschließlich ins 
hotplug gehört. Mehr dazu im nächsten Block.

> Den Teil mit dem procd_add_reload_trigger verstehe ich nicht ganz, da fehlt
> mir der Hintergrund der Software-Konzeption.
Lede bietet die Möglichkeit in initskripten ein "callback" zu hinterlegen wenn 
sich eine config section im uci ändert.
https://wiki.openwrt.org/inbox/procd-init-scripts
Und das ist ja das was wir _eigentlich_ wollen: Beim wird die simple-tc config 
an den kernel gegeben und wenn dich was ändert wird die neue weitergegeben.
Somit müssten wir uns gar nicht mehr um explizite Aufrufen kümmern, sondern 
müssten nur noch die Config ändern.
Da man das hotplug-Skript wahrscheinlich trotzdem weiterhin haben will (evtl 
ruft es dann nur noch ein reload auf dem init-Skript auf) könnte das eine 
race-condition erzeugen. Da die Operationen aber idempotent zu sein scheinen 
sollte das kein größeres Problem sein.

Leider bin ich heute anders als geplant weder dazugekommen da mal umzusetzen, 
noch mir die weiteren Patches anzuschauen.

> Tatsächlich habe ich die jetzige Lösung als Workaround gedacht, bis es eine
> echte Lösung gibt (was meines Erachtens noch etwas dauern könnte). Da wir
> ohnehin nur 'example' setzen, kann man im configurenetwork auch direkt
> 'example' auswerten.
> 
> Im Moment ist die Situation ja so, dass man im WebUI ein Feature einstellen
> kann, dass keine Funktion hat (immerhin auf wohl allen 20170110-Geräten).
> Falls eine Möglichkeit zeitnah absehbar ist, das Ganze generisch zu fixen,
> würde ich diese natürlich bevorzugen (bei anderen interfaces als WAN
> funktioniert das Originalskript aber wahrscheinlich sogar). Falls dies nicht
> absehbar ist (und das war zum Zeitpunkt der Patcherstellung der Fall) würde
> ich das lieber erstmal als Workaround reparieren und dann irgendwann später
> mal ordentlich lösen, wenn jemand das Problem wirklich durchdrungen hat.
Eigentlich hast du recht, aber ich hab das Gefühl, dass wir nicht weit von 
generisch weg sind und obengenanntes init-Skript könnte man evtl eben auch 
gleich beim paket selber einreichen. Daher würde ich das ganz gern mal 
probieren.

> Zu den Inlines:
> siehe Inline!
Ebenso
> Sorry für den vielen Text und beste Grüße
Ebenso

Tobias


> -----Original Message-----
> From: franken-dev [mailto:franken-dev-bounces@freifunk.net] On Behalf Of
> Tobias Klaus
> Sent: Dienstag, 1. August 2017 00:12
> To: franken-dev@freifunk.net; Adrian Schmutzler
> <freifunk@adrianschmutzler.de>
> Subject: Re: [PATCH v4 01/11] simple-tc: Fix simple-tc not being active if
> set
> 
> Hallo Adrian,
> 
> ich hab mir gerade mal das mantis-issue und den Patch angeschaut und das war
> jetzt gar nicht so leicht sich hier eine Meinung zu bilden.
> 
> Wenn ich mich nicht irre liegen dem nicht-Funktionieren von simple-tc doch 2
> Probleme zugrunde:
> 
> 1. Wir konfigurieren simple-tc nicht ordentlich und lassen den Standardwert
> für das interface mit "example" stehen.
> - ich denke hier sollten wir das "ordentlich" konfigurieren und example
>   löschen und das jeweilige "wan" konfigurieren. Dafür bietet sich
> vermutlich
>   ein entsprechendes uci-default script an
> 
> 2. hotplug.d/net wird nicht mit unserem WAN aufgerufen.
> Nachdem ich auf die schnelle keine ordentliche Doku zu hotplug.de/net
> gefunden habe, gehe ich mal davon aus, dass sich das an der falschen Stelle
> befindet und eher in hotplug.d/iface landen hätte sollen. So oder so würde
> ich das ganze eher über ein init-Skript lösen, das durch ein
> procd_add_reload_trigger "simple-tc" immer mit dem "reload"-Parameter
> aufgerufen wird, wenn sich was im /etc/config/simplce-tc ändert. Dann müssen
> wir uns auch keine Gedanken machen, wann wir es manuell aufrufen müssen.
> Für ein solches Skript, könnten vermutlich die meisten Teile von dem Skript
> /etc/hotplug.d/net/50-simple-tc wieder verwendet werden. Die vorgeschlagene
> Lösung ist mir hier etwas zu "ungenerisch", da sie fest den wert für das
> interface "example" auf das wan- interface anwenden.
> 
> Zusätzlich zu diesen zwei Überlegungen, frage ich mich noch _wo_ man solche
> Änderungen (vor allem die 2.) unterbringt. Eigentlich wäre hier ein Patch
> gegen den gluon-Feed, der durch unser buildskript aufgespielt wird, fast das
> sauberste. Diesen könnte man dann auch versuchen upstream zu kriegen.
> Allerdings können wir das auch wie vorgeschlagen in fff-network lassen(das
> für uns kaputte hotplug Skript tut ja nicht weh) oder aber (das finde ich
> wiederum etwas sauberer) ein fff-simpletc Paket einführen.
> 
> Wenn ich mir das so ansehe weiß ich wieder, warum ich simple-tc immer
> ignoriert habe und gehofft habe, dass es einfach tut.... :-D
> 
> Ich hab inline noch ein paar Anmerkungen zum Code.
> 
> Viele Grüße
> Tobias
> 
> Am Freitag, 21. Juli 2017, 15:08:39 CEST schrieb Adrian Schmutzler:
> > Simple-tc is active immediately after the call and needs no restart of
> > anything
> > 
> > Signed-off-by: Adrian Schmutzler <freifunk@adrianschmutzler.de>
> > 
> > Tested-by: Adrian Schmutzler <freifunk@adrianschmutzler.de>
> > ---
> > 
> >  src/packages/fff/fff-network/Makefile                      |  2 +-
> >  src/packages/fff/fff-network/files/usr/sbin/applysimpletc  | 14
> > 
> > ++++++++++++++ .../fff/fff-network/files/usr/sbin/configurenetwork
> > 
> > 12 ++++++++++++ .../fff/fff-web/files/www/ssl/cgi-bin/settings.html
> > 
> > |  3 +++ 4 files changed, 30 insertions(+), 1 deletion(-)
> >  
> >  create mode 100755
> > 
> > src/packages/fff/fff-network/files/usr/sbin/applysimpletc
> > 
> > diff --git a/src/packages/fff/fff-network/Makefile
> > b/src/packages/fff/fff-network/Makefile index fee3f98..f7dc63c 100644
> > --- a/src/packages/fff/fff-network/Makefile
> > +++ b/src/packages/fff/fff-network/Makefile
> > @@ -1,7 +1,7 @@
> > 
> >  include $(TOPDIR)/rules.mk
> >  
> >  PKG_NAME:=fff-network
> > 
> > -PKG_VERSION:=0.0.6
> > +PKG_VERSION:=7
> 
> Das ist ein gehöriger Versionssprung. ;-)
> ADRIAN: Die Versionsnummer sind inkonsistent, insofern bin ich davon
> ausgegangen, von 0.0.x auf x+1 zu ändern. Beim Nodewatcher gibt es ja z.B.
> auch kein 0.0.x
> 
> >  PKG_RELEASE:=1
> >  
> >  PKG_BUILD_DIR:=$(BUILD_DIR)/fff-network
> > 
> > diff --git a/src/packages/fff/fff-network/files/usr/sbin/applysimpletc
> > b/src/packages/fff/fff-network/files/usr/sbin/applysimpletc new file
> > mode
> > 100755
> > index 0000000..a9744b0
> > --- /dev/null
> > +++ b/src/packages/fff/fff-network/files/usr/sbin/applysimpletc
> > @@ -0,0 +1,14 @@
> > +#!/bin/sh
> > +
> > +tc_device=$(uci -q get "network.wan.ifname") tc_enabled=$(uci -q get
> > +"simple-tc.example.enabled") tc_in=$(uci -q get
> > +"simple-tc.example.limit_ingress")
> > +tc_out=$(uci -q get "simple-tc.example.limit_egress")
> > +
> > +if [ "$tc_enabled" -eq 1 ] ; then
> > +	test -n "$tc_in" || tc_in=-
> > +	test -n "$tc_out" || tc_out=-
> 
> tc_out=${tc_out:-"-"} ist etwas eleganter und weißt tc_out den Wert von
> $tc_out zu oder, falls nicht vorhanden, "-".
> ADRIAN: Die Syntax kenne ich nicht ... ;-)
> 
> > +	simple-tc "$tc_device" "$tc_in" "$tc_out"
> 
> Wenn man diese Zeile ans Ende des if/else zieht kann man sich den else-Zweig
> sparen und muss in Zukunft nur einen simple-tc-Aufruf "pflegen".
> ADRIAN: Sicher? Denn tc_in und tc_out werden nicht auf "-" gesetzt, nur weil
> tc_enabled=0 ist! Die müsste man dann ich else beide setzen ...
Ja du hast recht, mir ging es hauptsächlich darum den Aufruf nach unten zu 
ziehen. Das pflegt sich leichter. Wenn man ein bisschen rumprobiert lässt sich 
das bestimmt auch nur im  mit dem if zweig setzen. Aber das muss nicht.

> > +else
> > +	simple-tc "$tc_device" - -
> > +fi
> > diff --git
> > a/src/packages/fff/fff-network/files/usr/sbin/configurenetwork
> > b/src/packages/fff/fff-network/files/usr/sbin/configurenetwork index
> > 7ecfa3b..63b216a 100755
> > --- a/src/packages/fff/fff-network/files/usr/sbin/configurenetwork
> > +++ b/src/packages/fff/fff-network/files/usr/sbin/configurenetwork
> > @@ -189,3 +189,15 @@ else
> > 
> >      /etc/init.d/fff-uradvd restart
> >  
> >  fi
> > 
> > +
> > +# Apply traffic control
> 
> Wenn wir das skript "applysimpletc" doch drin lassen, sollte es hier direkt
> aufgerufen werden. Auch so sparen wir uns duplizierten und vor allem
> dupliziert zu pflegenden Code.
> ADRIAN: War so in meiner ursprünglichen Variante. Da configurenetwork aber
> beim Boot aufgerufen wird, fand ich es besser, simple-tc nur aufzurufen,
> wenn es gebraucht wird. Sonst würde auf allen Geräten ohne Traffic-Control
> immer "simple-tc - -" beim Start aufgerufen (was nicht sein muss, um eine
> unnötige Störungsquelle zu vermeiden). In der applysimpletc wiederum braucht
> man "simple-tc - -", da so beim Aufruf aus dem WebUI nach Änderung die
> alten Werte gelöscht werden müssen.
> Mir ist nichts eingefallen, das eleganter zu lösen.
Ah, jetzt sehe ich den Unterschied. Ich würde es aber tatsächlich in kauf 
nehmen manchmal ein überflüssiges simple-tc aufzurufen, als an zwei Stellen 
duplizierten Code mitzuführen. Das sollte doch bis auf die vermutlich fast 
vernachlässigbare Laufzeit von simple-tc keine Nebenwirkungen haben, oder?
Aber wie schon gesagt, wäre es mir am Liebsten unsere skripte ganz davon frei 
zu halten.

> > +tc_device=$(uci -q get "network.wan.ifname") tc_enabled=$(uci -q get
> > +"simple-tc.example.enabled") tc_in=$(uci -q get
> > +"simple-tc.example.limit_ingress")
> > +tc_out=$(uci -q get "simple-tc.example.limit_egress")
> > +
> > +if [ "$tc_enabled" -eq 1 ] ; then
> > +	test -n "$tc_in" || tc_in=-
> > +	test -n "$tc_out" || tc_out=-
> > +	simple-tc "$tc_device" "$tc_in" "$tc_out"
> > +fi
> > diff --git
> > a/src/packages/fff/fff-web/files/www/ssl/cgi-bin/settings.html
> > b/src/packages/fff/fff-web/files/www/ssl/cgi-bin/settings.html index
> > a7417dc..bdbd69b 100755
> > --- a/src/packages/fff/fff-web/files/www/ssl/cgi-bin/settings.html
> > +++ b/src/packages/fff/fff-web/files/www/ssl/cgi-bin/settings.html
> > @@ -32,6 +32,9 @@ if [ "$REQUEST_METHOD" == "POST" ] ; then
> > 
> >  		uci -q set
> 
> "simple-tc.example.limit_egress=${POST_limit_egress}"
> 
> >  		uci commit
> > 
> > +
> > +		/usr/sbin/applysimpletc
> > +
> > 
> >  		MSG='<span class="green">Daten gespeichert! - Bitte Router
> > 
> > neustarten.</span>' fi  fi
> 
> --
> franken-dev mailing list
> franken-dev@freifunk.net
> http://lists.freifunk.net/mailman/listinfo/franken-dev-freifunk.net