From 474494764213c62591ae13b8b2c7cd7b6e9d1159 Mon Sep 17 00:00:00 2001 From: Monviech Date: Tue, 18 Aug 2026 15:09:43 +0200 Subject: [PATCH] net/frr: Add address family dropdown to neighbors, replacing implicit Multi-Protocol toggle, making it inline with what peergroups offer --- .../Quagga/forms/dialogEditBGPNeighbor.xml | 19 ++--- .../mvc/app/models/OPNsense/Quagga/BGP.xml | 12 ++- .../OPNsense/Quagga/Migrations/M1_1_3.php | 75 +++++++++++++++++++ .../OPNsense/Quagga/Config/bgpd.conf | 13 ++-- 4 files changed, 97 insertions(+), 22 deletions(-) create mode 100644 net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/Migrations/M1_1_3.php diff --git a/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/dialogEditBGPNeighbor.xml b/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/dialogEditBGPNeighbor.xml index 245b6505c5..b6a4e4c2c5 100644 --- a/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/dialogEditBGPNeighbor.xml +++ b/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/dialogEditBGPNeighbor.xml @@ -45,6 +45,13 @@ false + + neighbor.family + + dropdown + select_multiple + Select which address families to activate for this neighbor. + neighbor.password @@ -127,18 +134,6 @@ false - - neighbor.multiprotocol - - checkbox - true - Enables multiprotocol BGP for support of additional address families like IPv6. - - boolean - boolean - false - - neighbor.rrclient diff --git a/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/BGP.xml b/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/BGP.xml index 4397fd4a1e..ea8a0d2818 100644 --- a/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/BGP.xml +++ b/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/BGP.xml @@ -1,7 +1,7 @@ //OPNsense/quagga/bgp BGP Routing configuration - 1.1.2 + 1.1.3 0 @@ -68,6 +68,15 @@
Y
+ + Y + ipv4 + Y + + IPv4 + IPv6 + + Use Remote AS Number @@ -104,7 +113,6 @@ - diff --git a/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/Migrations/M1_1_3.php b/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/Migrations/M1_1_3.php new file mode 100644 index 0000000000..642ab19049 --- /dev/null +++ b/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/Migrations/M1_1_3.php @@ -0,0 +1,75 @@ +getNodeByReference('neighbors.neighbor'); + + if ($neighbors === null) { + return; + } + + $config = Config::getInstance()->object(); + + if (empty($config->OPNsense->quagga->bgp->neighbors->neighbor)) { + return; + } + + foreach ($neighbors->iterateItems() as $uuid => $neighbor) { + $config_neighbor = null; + // Could be a lookup table but a migration is one shot anyway + foreach ($config->OPNsense->quagga->bgp->neighbors->neighbor as $candidate) { + if ((string)$candidate['uuid'] === (string)$uuid) { + $config_neighbor = $candidate; + break; + } + } + + if ($config_neighbor === null || isset($config_neighbor->family)) { + continue; + } + + if ((string)$config_neighbor->multiprotocol === '1') { + $neighbor->family = 'ipv4,ipv6'; + } elseif (strpos((string)$config_neighbor->address, ':') !== false) { + $neighbor->family = 'ipv6'; + } else { + $neighbor->family = 'ipv4'; + } + } + } + + // Model is saved by 'run_migrations.php' +} diff --git a/net/frr/src/opnsense/service/templates/OPNsense/Quagga/Config/bgpd.conf b/net/frr/src/opnsense/service/templates/OPNsense/Quagga/Config/bgpd.conf index 55e2390373..02928d276c 100644 --- a/net/frr/src/opnsense/service/templates/OPNsense/Quagga/Config/bgpd.conf +++ b/net/frr/src/opnsense/service/templates/OPNsense/Quagga/Config/bgpd.conf @@ -7,14 +7,11 @@ {% if helpers.exists('OPNsense.quagga.bgp.neighbors.neighbor') %} {% for neighbor in helpers.toList('OPNsense.quagga.bgp.neighbors.neighbor') %} -{% if neighbor.enabled == '1' and neighbor.multiprotocol == '1' %} -{# // the .append() method in Jinja2 returns "None", so filter through default() to suppress #} -{{ neighbors['ipv4'].append(neighbor) | default("", True) }} -{{ neighbors['ipv6'].append(neighbor) | default("", True) }} -{% elif neighbor.enabled == '1' and ':' not in neighbor.address %} -{{ neighbors['ipv4'].append(neighbor) | default("", True) }} -{% elif neighbor.enabled == '1' and ':' in neighbor.address %} -{{ neighbors['ipv6'].append(neighbor) | default("", True) }} +{% if neighbor.enabled == '1' %} +{% for family in neighbor.family.split(',') %} +{# // the .append() method in Jinja2 returns "None", so filter through default() to suppress #} +{{ neighbors[family].append(neighbor) | default("", True) }} +{% endfor %} {% endif %} {% endfor %} {% endif %}