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 %}