From 12f88282d9d8eb47d39ee9e83278f85b68689ec7 Mon Sep 17 00:00:00 2001 From: Ad Schellevis Date: Sun, 12 Apr 2026 14:35:29 +0200 Subject: [PATCH] Squashed commit of the following: commit b256ed7fcfa5e36bfd29e08c479bd02b461b21f5 Author: Ad Schellevis Date: Sun Apr 12 14:31:54 2026 +0200 net/frr - Routing: STATIC, finish https://github.com/opnsense/plugins/pull/5390 and add diagnostics. commit be8a53d3d2fc4a91e7834e68322dd295a41f6888 Author: Sven Scholle Date: Sat Apr 11 14:50:56 2026 +0200 net/frr: add BFD dependency support for static routes We redistribute static routes from staticd into OSPF via WireGuard tunnels. We want the redistribution to depend on whether the tunnel is actually up. Since WireGuard interfaces remain up even when the tunnel is not functional, BFD appears to be the simplest solution for detecting tunnel failures. --- .../Quagga/Api/DiagnosticsController.php | 17 ++++++++++++++++- .../OPNsense/Quagga/DiagnosticsController.php | 7 +++++++ .../Quagga/forms/dialogEditSTATICRoute.xml | 10 ++++++++++ .../app/models/OPNsense/Quagga/STATICd.xml | 4 ++++ .../views/OPNsense/Quagga/diagnostics.volt | 19 ++++++++++++++++++- .../conf/actions.d/actions_quagga.conf | 7 +++++++ .../templates/OPNsense/Quagga/staticd.conf | 3 +++ 7 files changed, 65 insertions(+), 2 deletions(-) diff --git a/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/Api/DiagnosticsController.php b/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/Api/DiagnosticsController.php index 60ce0808d..7d0ffa117 100644 --- a/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/Api/DiagnosticsController.php +++ b/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/Api/DiagnosticsController.php @@ -1,7 +1,7 @@ * @@ -329,4 +329,19 @@ class DiagnosticsController extends ApiControllerBase { return $this->bfdTreeFetch('counters'); } + + public function bfdstaticrouteAction(): array + { + $records = []; + $payload = json_decode((new Backend())->configdpRun('quagga diagnostics bfd_staticroute json'), true) ?? []; + if (!empty($payload['path-list'])) { + foreach ($payload['path-list'] as $proto => $values) { + foreach ($values as $record) { + $record['proto'] = $proto; + $records[] = $record; + } + } + } + return $this->searchRecordsetBase($records); + } } diff --git a/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/DiagnosticsController.php b/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/DiagnosticsController.php index 7cb40b232..125be3477 100644 --- a/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/DiagnosticsController.php +++ b/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/DiagnosticsController.php @@ -1,6 +1,7 @@ All rights reserved. @@ -123,6 +124,12 @@ class DiagnosticsController extends \OPNsense\Base\IndexController 'tabhead' => gettext('Summary'), 'type' => 'bfdsummary' ], + [ + 'name' => 'staticroute', + 'endpoint' => '/api/quagga/diagnostics/bfdstaticroute', + 'tabhead' => gettext('Static Route'), + 'type' => 'bfdstaticroute' + ], [ 'name' => 'neighbors', 'endpoint' => '/api/quagga/diagnostics/bfdneighbors', diff --git a/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/dialogEditSTATICRoute.xml b/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/dialogEditSTATICRoute.xml index aae3f26c7..786d69359 100644 --- a/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/dialogEditSTATICRoute.xml +++ b/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/dialogEditSTATICRoute.xml @@ -27,4 +27,14 @@ dropdown Select an interface where this settings apply to. + + route.bfd + + checkbox + Mark the route as dependent on the BFD neighbor session with the next hop. + + boolean + boolean + + diff --git a/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/STATICd.xml b/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/STATICd.xml index 8610f0c90..7f5fdb49b 100644 --- a/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/STATICd.xml +++ b/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/STATICd.xml @@ -28,6 +28,10 @@ /^(?!group).*$/ + + 0 + N + diff --git a/net/frr/src/opnsense/mvc/app/views/OPNsense/Quagga/diagnostics.volt b/net/frr/src/opnsense/mvc/app/views/OPNsense/Quagga/diagnostics.volt index c6dbe668f..3792e3f82 100644 --- a/net/frr/src/opnsense/mvc/app/views/OPNsense/Quagga/diagnostics.volt +++ b/net/frr/src/opnsense/mvc/app/views/OPNsense/Quagga/diagnostics.volt @@ -1,6 +1,6 @@ {# -OPNsense® is Copyright © 2014 – 2023 by Deciso B.V. +OPNsense® is Copyright © 2014 – 2026 by Deciso B.V. Copyright (C) 2023 Marc Bartelt Copyright (C) 2017 Fabian Franz Copyright (C) 2017 Michael Muenz @@ -101,6 +101,7 @@ POSSIBILITY OF SUCH DAMAGE. {% case 'ospfv3databasetable' %} {% case 'ospfneighbors' %} {% case 'bfdsummary' %} + {% case 'bfdstaticroute' %} if (all_grids["{{ tab['name'] }}"] === undefined) { /** * initialize bootgrid table for {{ tab['tabhead'] }} @@ -406,6 +407,22 @@ POSSIBILITY OF SUCH DAMAGE. {% break %} + {% case 'bfdstaticroute' %} +
+ + + + + + + + + + + +
{{ lang._('Protocol') }}{{ lang._('Vrf') }}{{ lang._('Peer') }}{{ lang._('Installed') }}
+
+ {% break %} {% case 'tree' %}