From 3c5e2b9d771bf8e7145eb659f1d8a4302640cc62 Mon Sep 17 00:00:00 2001 From: Ad Schellevis Date: Sun, 20 Oct 2024 09:57:21 +0100 Subject: [PATCH] net/frr - Routing: BFD - add multihop support for IPv4. closes https://github.com/opnsense/plugins/issues/4282 (#4285) Although IPv6 also supports multihop, it does require a local-address to be set (https://docs.frrouting.org/en/latest/bfd.html#bfdd-commands), to avoid adding extra complexity now, start with IPv4 and see where that brings us. --- .../Quagga/forms/dialogEditBFDNeighbor.xml | 9 ++++++++ .../mvc/app/models/OPNsense/Quagga/BFD.php | 23 +++++++++++++++++++ .../mvc/app/models/OPNsense/Quagga/BFD.xml | 6 ++++- .../templates/OPNsense/Quagga/bfdd.conf | 2 +- 4 files changed, 38 insertions(+), 2 deletions(-) diff --git a/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/dialogEditBFDNeighbor.xml b/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/dialogEditBFDNeighbor.xml index 4a76e64a9..26780cc97 100644 --- a/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/dialogEditBFDNeighbor.xml +++ b/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/dialogEditBFDNeighbor.xml @@ -16,4 +16,13 @@ text Specify the IP of your neighbor. + + neighbor.multihop + + checkbox + multihop tells the BFD daemon that we should expect packets with TTL less than 254 + (because it will take more than one hop) and to listen on the multihop port (4784). + When using multi-hop mode echo-mode will not work (see RFC 5883 section 3). + + diff --git a/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/BFD.php b/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/BFD.php index 39313ae57..f1a01d56b 100644 --- a/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/BFD.php +++ b/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/BFD.php @@ -3,8 +3,10 @@ namespace OPNsense\Quagga; use OPNsense\Base\BaseModel; +use OPNsense\Base\Messages\Message; /* + Copyright (C) 2024 Deciso B.V. Copyright (C) 2017 Fabian Franz Copyright (C) 2017 - 2021 Michael Muenz All rights reserved. @@ -28,4 +30,25 @@ use OPNsense\Base\BaseModel; */ class BFD extends BaseModel { + /** + * {@inheritdoc} + */ + public function performValidation($validateFullModel = false) + { + $messages = parent::performValidation($validateFullModel); + foreach ($this->neighbors->neighbor->iterateItems() as $neighbor) { + if (!$validateFullModel && !$neighbor->isFieldChanged()) { + continue; + } + $key = $neighbor->__reference; + $address_proto = str_contains($neighbor->address, ':') ? 'inet6' : 'inet'; + if (!empty((string)$neighbor->multihop) && $address_proto == 'inet6') { + $messages->appendMessage( + new Message(gettext("Multihop is currently only supported for IPv4"), $key . ".multihop") + ); + } + + } + return $messages; + } } diff --git a/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/BFD.xml b/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/BFD.xml index df4e256b7..9c14c4416 100644 --- a/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/BFD.xml +++ b/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/BFD.xml @@ -1,7 +1,7 @@ //OPNsense/quagga/bfd BFD configuration - 1.0.0 + 1.0.1 0 @@ -21,6 +21,10 @@ Y + + 0 + Y + diff --git a/net/frr/src/opnsense/service/templates/OPNsense/Quagga/bfdd.conf b/net/frr/src/opnsense/service/templates/OPNsense/Quagga/bfdd.conf index 8b1365263..235d5d9b7 100644 --- a/net/frr/src/opnsense/service/templates/OPNsense/Quagga/bfdd.conf +++ b/net/frr/src/opnsense/service/templates/OPNsense/Quagga/bfdd.conf @@ -21,7 +21,7 @@ bfd {% if helpers.exists('OPNsense.quagga.bfd.neighbors.neighbor') %} {% for neighbor in helpers.toList('OPNsense.quagga.bfd.neighbors.neighbor') %} {% if neighbor.enabled == '1' %} - peer {{ neighbor.address }} + peer {{ neighbor.address }} {% if neighbor.multihop|default('0') == '1' %}multihop{% endif +%} {% endif %} {% endfor %} {% endif %}