Add bird2 as an alternative babel implementation #121

Closed
fbl wants to merge 5 commits from fbl:bird2 into master
Owner
No description provided.
fbl added the
feature
layer3
RFC
WIP
labels 2021-02-15 02:30:40 +01:00
fbl self-assigned this 2021-02-15 02:30:40 +01:00
fbl added 4 commits 2021-02-15 02:30:41 +01:00
1c4e5cec4b Lookup removed babel interfaces in network instead of babeld config
Signed-off-by: Fabian Bläse <fabian@blaese.de>
7d7e0ae891 Remove implementation-specific references
Signed-off-by: Fabian Bläse <fabian@blaese.de>
f7e1ec318f Make babel modular
Signed-off-by: Fabian Bläse <fabian@blaese.de>
8d0a7118c7 Add bird babel implementation
Signed-off-by: Fabian Bläse <fabian@blaese.de>
fbl force-pushed bird2 from 8d0a7118c7 to 35f15b8408 2021-05-01 23:42:41 +02:00 Compare
Author
Owner

Changes:

  • Add missing router id required for bird startup (might not be necessary anymore with bird 2.0.8)
  • mv does not overwrite existing directories, but pastes inside -> rework apply step
Changes: - Add missing router id required for bird startup (might not be necessary anymore with bird 2.0.8) - mv does not overwrite existing directories, but pastes inside -> rework apply step
fbl changed title from [WIP] Add bird2 as an alternative babel implementation to Add bird2 as an alternative babel implementation 2021-05-01 23:43:19 +02:00
fbl removed the
WIP
label 2021-05-01 23:43:24 +02:00
fbl added this to the next-feature milestone 2021-05-01 23:43:28 +02:00
Author
Owner

ToDo: Add kernel proto preference.

ToDo: Add kernel proto preference.
fbl force-pushed bird2 from 35f15b8408 to 3e43cb22be 2021-07-09 17:13:53 +02:00 Compare
Author
Owner

Changes:

  • Add kernel proto preference to ensure local routes are preferred over routes received from neighbors.
Changes: - Add kernel proto preference to ensure local routes are preferred over routes received from neighbors.
Author
Owner

Dieser Pull Request sucht noch Reviewer bzw. eine Diskussion.

Dieser Pull Request sucht noch Reviewer bzw. eine Diskussion.
fbl force-pushed bird2 from 3e43cb22be to b5f5fca023 2021-08-05 21:29:00 +02:00 Compare
Author
Owner

Changes:

  • Rebase onto current master
  • Add commit messages
  • Add SPDX license headers
Changes: - Rebase onto current master - Add commit messages - Add SPDX license headers
Member

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.

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.
Author
Owner

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.

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.
niXXda reviewed 2021-09-21 22:36:00 +02:00
niXXda left a comment
First-time contributor

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.

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.
niXXda reviewed 2021-09-21 23:00:45 +02:00
niXXda left a comment
First-time contributor

inline jetzt nochmal neu ;-)

inline jetzt nochmal neu ;-)
@ -0,0 +5,4 @@
ipv6 sadr table fff6;
ipv4 table local4;
ipv6 sadr table local6;
First-time contributor

Die beiden tables local4 und local6 werden hier zwar deklariert, aber sonst nirgendwo in der Konfiguration verwendet. Man könnte sie daher auch weglassen.

Die beiden tables `local4` und `local6` werden hier zwar deklariert, aber sonst nirgendwo in der Konfiguration verwendet. Man könnte sie daher auch weglassen.
fbl marked this conversation as resolved
@ -0,0 +68,4 @@
scan time 15;
learn yes;
}
First-time contributor

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 Route fdff::/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.

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 Route `fdff::/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.
Author
Owner

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.

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.
fbl marked this conversation as resolved
@ -0,0 +108,4 @@
};
export filter {
accept;
};
First-time contributor

Die hier angegebenen Filter bestehen nur aus einem accept; Statement und keiner weiteren Funktionalität, man könnte sie daher auch überall durch import all; bzw. export all; ersetzen.

Die hier angegebenen Filter bestehen nur aus einem `accept;` Statement und keiner weiteren Funktionalität, man könnte sie daher auch überall durch `import all;` bzw. `export all;` ersetzen.
fbl marked this conversation as resolved
@ -0,0 +16,4 @@
babel_delete_interface() {
return 0
}
First-time contributor

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)

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`)
Author
Owner

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.

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.
fbl marked this conversation as resolved
@ -0,0 +10,4 @@
CATEGORY:=Freifunk
TITLE:=Freifunk-Franken babel
URL:=https://www.freifunk-franken.de
DEPENDS:=+fff-babel-implementation
First-time contributor

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.

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.
Author
Owner

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

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
fbl marked this conversation as resolved
fbl modified the milestone from next-feature to 20220405-beta 2021-12-21 14:48:20 +01:00
fbl force-pushed bird2 from b5f5fca023 to b7829d789a 2022-01-05 14:33:56 +01:00 Compare
Author
Owner

Changes:

  • Keep babeld as build-default
  • Fix: uci apply -> uci commit
  • Add babel_delete_interface implementation for bird2
  • Remove empty bird2 filters
  • Remove unnecessary bird tables
  • Add filters for fdff::/64
  • Announce ULA addresses on loopback interface
Changes: - Keep babeld as build-default - Fix: uci apply -> uci commit - Add babel_delete_interface implementation for bird2 - Remove empty bird2 filters - Remove unnecessary bird tables - Add filters for fdff::/64 - Announce ULA addresses on loopback interface
fbl added a new dependency 2022-01-05 14:39:38 +01:00
fbl removed the
RFC
label 2022-01-05 14:39:49 +01:00
Author
Owner

Changes:

  • Rebase onto master, include #214
    -> Implement nat-filter for bird2 as well
  • Refine configure/test/apply mechanics
    • Move dynamic includes to /tmp -> not preserved during reboot
    • Add custom bird procd init.d script to generate dynamic includes in tmp
      -> Use /tmp/bird/fff if existent (test-mode), /etc/bird/fff otherwise
  • Move dynamic bird2 configs to /etc/bird/fff
  • Fix nodewatcher failing when bird is not running
  • Make babel implementation runtime switchable (also see #201)
    • Compared to #201:
      • Select implementation via uci `babelimpl.impl.impl
      • Adjust for moved includes
      • Adjust for custom procd init.d script
      • Disable both daemons on firstboot, enable appropriate daemon with configure-layer3

Changes 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.

Changes: - Rebase onto master, include #214 -> Implement nat-filter for bird2 as well - Refine configure/test/apply mechanics - Move dynamic includes to /tmp -> not preserved during reboot - Add custom bird procd init.d script to generate dynamic includes in tmp -> Use `/tmp/bird/fff` if existent (test-mode), /etc/bird/fff otherwise - Move dynamic bird2 configs to /etc/bird/fff - Fix nodewatcher failing when bird is not running - Make babel implementation runtime switchable (also see #201) - Compared to #201: - Select implementation via uci `babelimpl.impl.impl - Adjust for moved includes - Adjust for custom procd init.d script - Disable both daemons on firstboot, enable appropriate daemon with configure-layer3 Changes 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.
fbl removed a dependency 2022-03-07 20:15:42 +01:00
ChristianD requested changes 2022-03-12 18:06:18 +01:00
@ -0,0 +1,116 @@
implementation=$(uci -q get babelimpl.impl.impl)
Member

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

Da verweise ich mal wieder auf https://git.freifunk-franken.de/freifunk-franken/firmware/issues/118#issuecomment-2558 ich wäre weiterhin dafür, alles Usereinstellbare nach /etc/config/fff zu legen. Das ist immerhin dann auch gleich Updatefest
Author
Owner

Das ist immerhin dann auch gleich Updatefest

Ist es aktuell by-design nicht.

> Das ist immerhin dann auch gleich Updatefest Ist es aktuell by-design nicht.
Member

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?

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?
Author
Owner

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.

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.
Member

ok mit dieser Argumentation kann ich dann erstmal so mit leben wie es ist.

ok mit dieser Argumentation kann ich dann erstmal so mit leben wie es ist.
fbl marked this conversation as resolved
@ -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>"
Member

Wenn ich das richtig verstehe, sind im fertigen Build beide Implementationen vorhanden oder? D.h. hier würden beide Versionen geschickt werden?

Wenn ich das richtig verstehe, sind im fertigen Build beide Implementationen vorhanden oder? D.h. hier würden beide Versionen geschickt werden?
Author
Owner

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.

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.
Member

klingt sinnvoll es von babelimpl.impl.impl UCI-setting zu machen, ja

klingt sinnvoll es von babelimpl.impl.impl UCI-setting zu machen, ja
Author
Owner

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.

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.
fbl marked this conversation as resolved
Member

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

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
Author
Owner

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 (?).

> 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 (?).
Member

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

> > 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
fbl force-pushed bird2 from 9b11037120 to c2a6fc08e4 2022-03-19 15:01:26 +01:00 Compare
Author
Owner

Changes:

  • Rebase onto master
  • Make babel version reported in nodewatcher dependent on the selected implementation (fixup commit for easier review, will be squashed)
Changes: - Rebase onto master - Make babel version reported in nodewatcher dependent on the selected implementation (fixup commit for easier review, will be squashed)
fbl requested review from ChristianD 2022-03-19 15:02:37 +01:00
Member
Acked-by: Christian Dresel <freifunk@dresel.systems>
``` Acked-by: Christian Dresel <freifunk@dresel.systems> ```
Author
Owner

Die fixup-commits zusammen gesquashed und auf meinen staging tree applied.

Die fixup-commits zusammen gesquashed und auf meinen staging tree applied.
fbl closed this pull request 2022-03-25 13:57:12 +01:00
fbl removed review request for ChristianD 2022-03-25 13:57:16 +01:00
fbl deleted branch bird2 2022-04-07 00:03:09 +02:00

Pull request closed

Sign in to join this conversation.
No description provided.