Add bird2 as an alternative babel implementation #121
No reviewers
Labels
No Label
RFC
RFT
WIP
blocked
bsp
bug
build/scripts/tools
duplicate
feature
fixed
layer3
mantis
more details required
needs changes
node
packages/fff
rejected
security
trivial
upstream
No Milestone
No Assignees
3 Participants
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: freifunk-franken/firmware#121
Loading…
Reference in New Issue
No description provided.
Delete Branch "fbl:bird2"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
8d0a7118c7
to35f15b8408
Changes:
[WIP] Add bird2 as an alternative babel implementationto Add bird2 as an alternative babel implementationToDo: Add kernel proto preference.
35f15b8408
to3e43cb22be
Changes:
Dieser Pull Request sucht noch Reviewer bzw. eine Diskussion.
3e43cb22be
tob5f5fca023
Changes:
ich tendiere nach wie vor dazu, das wir den User wärend der Laufzeit überlassen sollten ob er bird2 oder babeld verwenden will z.b. über einen Schalter in der /etc/config/gateway
Ich hab durchaus Fälle wo ich gerne bei babeld bleiben würde und will mir da eigentlich nicht extra eine Firmware bauen.
Ich hab das jetzt nicht bis zu Ende gedacht wieviel Aufwand das ganze wäre aber ansich fände ich es einfach hübsch.
Wenn jemand lustig ist, dann kann man noch eine (leider nicht ganz triviale) Unterscheidung zur Laufzeit obendrauf setzen. Das hat mit diesem Pull Request aber erstmal nicht viel zu tun, das wäre dann nochmal ein zusätzliches Features.
Ich sehe in der Unterscheidung zur Laufzeit hauptsächlich Nachteile bezüglich der Komplexität, daher würde ich gerne erstmal beim aktuellen Patch bleiben.
Ich finde es gut, bird2 als Routing-Daemon in der Firmware zu haben, vor allem wegen der Performance und der Möglichkeit des sauberen config-reloads im Betrieb. Ob es eine Unterscheidung zwischen babeld und bird2 während der Laufzeit braucht, kann ich nicht abschließend beurteilen. Mir persönlich würde bird2 als Routing-Daemon in der Firmware vermutlich ausreichen, da die meisten Use-Cases damit abgedeckt sind und der Vorteil von babeld nur darin liegen würde, dass man damit mehr Filtermöglichkeiten innerhalb des babel-Protokolls hat. Die habe ich bisher aber auch nur selten gebraucht.
Zum Patch noch, man könnte die protocol-Abschnitte in der bird.conf noch benennen nach Funktion etc., dann findet man sich bei der Nutzung der CLI etwas besser zurecht. Sonst heißt es nur direct1, direct2, device1, kernel2, babel1, ...
restliche Anmerkungen siehe inline.
inline jetzt nochmal neu ;-)
@ -0,0 +5,4 @@
ipv6 sadr table fff6;
ipv4 table local4;
ipv6 sadr table local6;
Die beiden tables
local4
undlocal6
werden hier zwar deklariert, aber sonst nirgendwo in der Konfiguration verwendet. Man könnte sie daher auch weglassen.@ -0,0 +68,4 @@
scan time 15;
learn yes;
}
Dieser Block importiert alle
proto static
Routen aus der fff-table in die bird-internen Tabellen. Im Unterschied dazu gibt es bei der babeld-Variante aber noch redistribute-Filter, welche Einschränkungen in der Routenauswahl treffen. Es gibt aktuell in der Firmware z.B. eine Routefdff::/64 dev br-client proto static metric 1024 pref medium
in der fff-table, welche dadurch in der bird2-Variante mit importiert und an andere babel-Nachbarn weitergegeben wird. Das ist vllt. nicht unbedingt gewollt und notwendig.Dazu hatte ich mich entschieden, weil das nachrüsten von passenden Regeln (nötig für eigene IPv6 Präfixe) mit bird etwas fummeliger wäre. An fdff:: hatte ich nicht gedacht, guter Fund!
Für den Moment würde ich fdff::/64 daher explizit ausschließen.
In Zukunft sollte man aber auf jeden Fall beide Implementierungen in dieser Hinsicht aneinander angleichen.
@ -0,0 +108,4 @@
};
export filter {
accept;
};
Die hier angegebenen Filter bestehen nur aus einem
accept;
Statement und keiner weiteren Funktionalität, man könnte sie daher auch überall durchimport all;
bzw.export all;
ersetzen.@ -0,0 +16,4 @@
babel_delete_interface() {
return 0
}
Müsste hier nicht noch eine Implementierung hin? In der babeld-Variante gibt es jedenfalls eine. Ich weiß aber auch nicht genau, wann und wie diese Funktion normalerweise aufgerufen und genutzt wird.
(Implementierung im Sinne von: lösche
/tmp/bird-babel/$name.conf
)Zuerst hatte ich angenommen, dass es das nicht braucht, weil bei jedem Konfigurations-run alle Peers neu in /tmp aufgebaut werden und dann komplett nach /etc verschoben werden. Dort bereits existierende Peers werden überschrieben.
Bei genauerem Nachdenken hab ich aber festgestellt, dass es dennoch einen Randfall gibt: Nämlich wenn zwei configuration runs ohne apply aufeinanderfolgend ausgeführt werden, und zwischendrin ein peer in der gateway-config entfernt wurde.
An dieser Stelle ist es tatsächlich am einfachsten einfach diese Funktion dafür her zu nehmen und entsprechende Peers in /tmp zu entfernen.
@ -0,0 +10,4 @@
CATEGORY:=Freifunk
TITLE:=Freifunk-Franken babel
URL:=https://www.freifunk-franken.de
DEPENDS:=+fff-babel-implementation
Im Makefile von fff-babel-bird2 gibt es an dieser Stelle noch ein
CONFLICTS:=
, welches das fff-babeld package ausschließen soll, das Gleiche in umgekehrt könnte man hier auch noch hinzufügen.Das stimmt. Funktioniert so auch, weil dennoch nie beide gleichzeitig da sein können. Ich habs jetzt so gelassen, da das voraussichtlich sowieso bald wieder weg fliegt, siehe #201
b5f5fca023
tob7829d789a
Changes:
Changes:
-> Implement nat-filter for bird2 as well
-> Use
/tmp/bird/fff
if existent (test-mode), /etc/bird/fff otherwiseChanges to the previous bird commit are combined in a "bird2-fixup" commit for easier follow-up reviews, so only bird2-fixup and "make implementation runtime switchable have to be reviewed if the previous commits are already known.
I will squash this commit into "Add bird2 as selectable babel implementation" after approval.
@ -0,0 +1,116 @@
implementation=$(uci -q get babelimpl.impl.impl)
Da verweise ich mal wieder auf
#118 (comment)
ich wäre weiterhin dafür, alles Usereinstellbare nach /etc/config/fff zu legen. Das ist immerhin dann auch gleich Updatefest
Ist es aktuell by-design nicht.
ich hab keinen Grund gefunden was dagegen sprechen würde? So wie ich das verstehe, wir die Implementation über config-layer3 ausgewählt. Da darf das doch gerne Updatefest sein.
Gibts einen Grund warum das Design so gewählt ist?
Aktuell ist das mehr so ein Test-Feature. Ich weiß noch überhaupt nicht, ob ich die Laufzeit-Auswahl langfristig unterstützen möchte, und ob dauerhaft zwei Daemons in der Firmware enthalten sein werden (eher nicht..). Die gibt es jetzt eigentlich mehr deshalb, damit man beide Implementierungen möglichst zügig testen kann.
Zudem ist die Auswahl des Daemons auch eine Entscheidung, die den Nutzer der Firmware erst mal überhaupt nicht interessieren soll. Langfristig möchte ich bird zum default machen.
Wenn das jetzt alles mit diesem Release gut funktioniert, kann man noch einmal evaluieren, ob man die Laufzeit-Auswahl des Daemons dauerhaft anbieten möchte.
ok mit dieser Argumentation kann ich dann erstmal so mit leben wie es ist.
@ -77,2 +77,4 @@
if [ -x /usr/sbin/babeld ]; then
SYSTEM_DATA="$SYSTEM_DATA<babel_version>$(/usr/sbin/babeld -V 2>&1)</babel_version>"
elif [ -x /usr/sbin/bird ]; then
SYSTEM_DATA="$SYSTEM_DATA<babel_version>$(/usr/sbin/bird --version 2>&1 | sed "s/BIRD version /bird-/")</babel_version>"
Wenn ich das richtig verstehe, sind im fertigen Build beide Implementationen vorhanden oder? D.h. hier würden beide Versionen geschickt werden?
Zweiteres ist ein "elif", daher wird nur eins von beiden geschickt. Man müsste das eigentlich noch vom aktuellen config-Zustand abhängig machen. Ich würde das dann stattdessen vom babelimpl.impl.impl UCI-setting abhängig machen.
klingt sinnvoll es von babelimpl.impl.impl UCI-setting zu machen, ja
erledigt. Ganz sauber ist das eigentlich nicht, da das bereits wechselt bevor configure-layer3 ausgeführt wurde. Aber da es nur Statusdaten sind, ist es mir die aufwändigere Unterscheidung nicht Wert.
src/packages/fff/fff-babeld/files/usr/lib/nodewatcher.d/80-babeld.sh
Hier sollte man dann noch Abfragen ob babeld überhaupt läuft, wie es bei der 80-bird2.sh schon gemacht ist
Passiert doch in Zeile 3 (?).
urgs ups, übersehen
9b11037120
toc2a6fc08e4
Changes:
Die fixup-commits zusammen gesquashed und auf meinen staging tree applied.
Pull request closed