diff --git a/net/frr/Makefile b/net/frr/Makefile
index 0e09074e9..c6f969860 100644
--- a/net/frr/Makefile
+++ b/net/frr/Makefile
@@ -1,5 +1,5 @@
PLUGIN_NAME= frr
-PLUGIN_VERSION= 1.2
+PLUGIN_VERSION= 1.3
PLUGIN_COMMENT= The FRRouting Protocol Suite
PLUGIN_DEPENDS= frr ruby
PLUGIN_CONFLICTS= quagga
diff --git a/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/dialogEditBGPPrefixLists.xml b/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/dialogEditBGPPrefixLists.xml
index 8472d0976..a919f082f 100644
--- a/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/dialogEditBGPPrefixLists.xml
+++ b/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/dialogEditBGPPrefixLists.xml
@@ -11,6 +11,12 @@
text
The name of your Prefix-List, please choose one near to the result you want to achieve.
+
+ prefixlist.version
+
+ select_multiple
+ Set the IP version to use.
+
prefixlist.seqnumber
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 349e223c5..c4eaa096c 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,6 +1,7 @@
//OPNsense/quagga/bgp
BGP Routing configuration
+ 1.0.0
0
@@ -15,7 +16,6 @@
N
- /^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\/\d{1,2},)*(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\/\d{1,2})$/
N
@@ -37,10 +37,9 @@
1
Y
-
+
Y
- /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/
@@ -154,6 +153,14 @@
Y
+
+ IPv4
+ Y
+
+ IPv4
+ IPv6
+
+
Y
diff --git a/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/General.xml b/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/General.xml
index 5bb1c1ddc..22e61f3c3 100644
--- a/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/General.xml
+++ b/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/General.xml
@@ -1,6 +1,7 @@
//OPNsense/quagga/general
Quagga Routing configuration
+ 1.0.0
0
diff --git a/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/OSPF.xml b/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/OSPF.xml
index 06c636764..8886b16a6 100644
--- a/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/OSPF.xml
+++ b/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/OSPF.xml
@@ -1,6 +1,7 @@
//OPNsense/quagga/ospf
OSPF Routing configuration
+ 1.0.0
0
diff --git a/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/OSPF6.xml b/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/OSPF6.xml
index b584b891b..b61d5d2f7 100644
--- a/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/OSPF6.xml
+++ b/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/OSPF6.xml
@@ -1,6 +1,7 @@
//OPNsense/quagga/ospf6
OSPFv3 Routing configuration
+ 1.0.0
0
diff --git a/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/RIP.xml b/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/RIP.xml
index 5a1b7bf10..2f228b63a 100644
--- a/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/RIP.xml
+++ b/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/RIP.xml
@@ -1,6 +1,7 @@
//OPNsense/quagga/rip
RIP Routing configuration
+ 1.0.0
0
diff --git a/net/frr/src/opnsense/service/templates/OPNsense/Quagga/bgpd.conf b/net/frr/src/opnsense/service/templates/OPNsense/Quagga/bgpd.conf
index 07dc90a91..a419097b1 100644
--- a/net/frr/src/opnsense/service/templates/OPNsense/Quagga/bgpd.conf
+++ b/net/frr/src/opnsense/service/templates/OPNsense/Quagga/bgpd.conf
@@ -17,16 +17,6 @@ log syslog {{ OPNsense.quagga.general.sysloglevel }}
!
{% if helpers.exists('OPNsense.quagga.bgp.asnumber') and OPNsense.quagga.bgp.asnumber != '' %}
router bgp {{ OPNsense.quagga.bgp.asnumber }}
-{% if helpers.exists('OPNsense.quagga.bgp.networks') %}
-{% for network in OPNsense.quagga.bgp.networks.split(',') %}
- network {{ network }}
-{% endfor %}
-{% endif %}
-{% if helpers.exists('OPNsense.quagga.bgp.redistribute') and OPNsense.quagga.bgp.redistribute != '' %}
-{% for bgp_redistribute in OPNsense.quagga.bgp.redistribute.split(',') %}
- redistribute {{ bgp_redistribute }}
-{% endfor %}
-{% endif %}
{% if helpers.exists('OPNsense.quagga.bgp.neighbors.neighbor') %}
{% for neighbor in helpers.toList('OPNsense.quagga.bgp.neighbors.neighbor') %}
{% if neighbor.enabled == '1' %}
@@ -34,17 +24,36 @@ router bgp {{ OPNsense.quagga.bgp.asnumber }}
{% if 'updatesource' in neighbor and neighbor.updatesource != '' %}
neighbor {{ neighbor.address }} update-source {{ physical_interface(neighbor.updatesource) }}
{% endif %}
+{% endif %}
+{% endfor %}
+{% endif %}
+ address-family ipv4 unicast
+{% if helpers.exists('OPNsense.quagga.bgp.networks') %}
+{% for network in OPNsense.quagga.bgp.networks.split(',') %}
+{% if ':' not in network %}
+ network {{ network }}
+{% endif %}
+{% endfor %}
+{% endif %}
+{% if helpers.exists('OPNsense.quagga.bgp.redistribute') and OPNsense.quagga.bgp.redistribute != '' %}
+{% for bgp_redistribute in OPNsense.quagga.bgp.redistribute.split(',') %}
+ redistribute {{ bgp_redistribute }}
+{% endfor %}
+{% endif %}
+{% if helpers.exists('OPNsense.quagga.bgp.neighbors.neighbor') and ':' not in OPNsense.quagga.bgp.neighbors.neighbor.address %}
+{% for neighbor in helpers.toList('OPNsense.quagga.bgp.neighbors.neighbor') %}
+{% if neighbor.enabled == '1' and ':' not in neighbor.address %}
{% if 'nexthopself' in neighbor and neighbor.nexthopself == '1' %}
- neighbor {{ neighbor.address }} next-hop-self
+ neighbor {{ neighbor.address }} next-hop-self
{% endif %}
{% if 'defaultoriginate' in neighbor and neighbor.defaultoriginate == '1' %}
- neighbor {{ neighbor.address }} default-originate
+ neighbor {{ neighbor.address }} default-originate
{% endif %}
{% if neighbor.linkedPrefixlistIn|default("") != "" %}
{% for prefixlist in neighbor.linkedPrefixlistIn.split(",") %}
{% set prefixlist2_data = helpers.getUUID(prefixlist) %}
{% if prefixlist2_data != {} and prefixlist2_data.enabled == '1' %}
- neighbor {{ neighbor.address }} prefix-list {{ prefixlist2_data.name }} in
+ neighbor {{ neighbor.address }} prefix-list {{ prefixlist2_data.name }} in
{% endif %}
{% endfor %}
{% endif %}
@@ -52,7 +61,7 @@ router bgp {{ OPNsense.quagga.bgp.asnumber }}
{% for prefixlist in neighbor.linkedPrefixlistOut.split(",") %}
{% set prefixlist_data = helpers.getUUID(prefixlist) %}
{% if prefixlist_data != {} and prefixlist_data.enabled == '1' %}
- neighbor {{ neighbor.address }} prefix-list {{ prefixlist_data.name }} out
+ neighbor {{ neighbor.address }} prefix-list {{ prefixlist_data.name }} out
{% endif %}
{% endfor %}
{% endif %}
@@ -60,7 +69,7 @@ router bgp {{ OPNsense.quagga.bgp.asnumber }}
{% for aspath in neighbor.linkedRoutemapIn.split(",") %}
{% set routemap2_data = helpers.getUUID(aspath) %}
{% if routemap2_data != {} and routemap2_data.enabled == '1' %}
- neighbor {{ neighbor.address }} route-map {{ routemap2_data.name }} in
+ neighbor {{ neighbor.address }} route-map {{ routemap2_data.name }} in
{% endif %}
{% endfor %}
{% endif %}
@@ -68,19 +77,83 @@ router bgp {{ OPNsense.quagga.bgp.asnumber }}
{% for aspath in neighbor.linkedRoutemapOut.split(",") %}
{% set routemap_data = helpers.getUUID(aspath) %}
{% if routemap_data != {} and routemap_data.enabled == '1' %}
- neighbor {{ neighbor.address }} route-map {{ routemap_data.name }} out
+ neighbor {{ neighbor.address }} route-map {{ routemap_data.name }} out
{% endif %}
{% endfor %}
{% endif %}
{% endif %}
{% endfor %}
{% endif %}
+ exit-address-family
+!
+ address-family ipv6 unicast
+{% if helpers.exists('OPNsense.quagga.bgp.networks') and ':' in OPNsense.quagga.bgp.networks %}
+{% for network in OPNsense.quagga.bgp.networks.split(',') %}
+{% if ':' in network %}
+ network {{ network }}
+{% endif %}
+{% endfor %}
+{% endif %}
+{% if helpers.exists('OPNsense.quagga.bgp.redistribute') and OPNsense.quagga.bgp.redistribute != '' %}
+{% for bgp_redistribute in OPNsense.quagga.bgp.redistribute.split(',') %}
+ redistribute {{ bgp_redistribute }}
+{% endfor %}
+{% endif %}
+{% if helpers.exists('OPNsense.quagga.bgp.neighbors.neighbor') %}
+{% for neighbor in helpers.toList('OPNsense.quagga.bgp.neighbors.neighbor') %}
+{% if neighbor.enabled == '1' and ':' in neighbor.address %}
+{% if 'nexthopself' in neighbor and neighbor.nexthopself == '1' %}
+ neighbor {{ neighbor.address }} next-hop-self
+{% endif %}
+{% if 'defaultoriginate' in neighbor and neighbor.defaultoriginate == '1' %}
+ neighbor {{ neighbor.address }} default-originate
+{% endif %}
+{% if neighbor.linkedPrefixlistIn|default("") != "" %}
+{% for prefixlist in neighbor.linkedPrefixlistIn.split(",") %}
+{% set prefixlist2_data = helpers.getUUID(prefixlist) %}
+{% if prefixlist2_data != {} and prefixlist2_data.enabled == '1' %}
+ neighbor {{ neighbor.address }} prefix-list {{ prefixlist2_data.name }} in
+{% endif %}
+{% endfor %}
+{% endif %}
+{% if neighbor.linkedPrefixlistOut|default("") != "" %}
+{% for prefixlist in neighbor.linkedPrefixlistOut.split(",") %}
+{% set prefixlist_data = helpers.getUUID(prefixlist) %}
+{% if prefixlist_data != {} and prefixlist_data.enabled == '1' %}
+ neighbor {{ neighbor.address }} prefix-list {{ prefixlist_data.name }} out
+{% endif %}
+{% endfor %}
+{% endif %}
+{% if neighbor.linkedRoutemapIn|default("") != "" %}
+{% for aspath in neighbor.linkedRoutemapIn.split(",") %}
+{% set routemap2_data = helpers.getUUID(aspath) %}
+{% if routemap2_data != {} and routemap2_data.enabled == '1' %}
+ neighbor {{ neighbor.address }} route-map {{ routemap2_data.name }} in
+{% endif %}
+{% endfor %}
+{% endif %}
+{% if neighbor.linkedRoutemapOut|default("") != "" %}
+{% for aspath in neighbor.linkedRoutemapOut.split(",") %}
+{% set routemap_data = helpers.getUUID(aspath) %}
+{% if routemap_data != {} and routemap_data.enabled == '1' %}
+ neighbor {{ neighbor.address }} route-map {{ routemap_data.name }} out
+{% endif %}
+{% endfor %}
+{% endif %}
+{% endif %}
+{% endfor %}
+{% endif %}
+ exit-address-family
!
{% if helpers.exists('OPNsense.quagga.bgp.prefixlists.prefixlist') %}
{% for prefixlist in helpers.sortDictList(OPNsense.quagga.bgp.prefixlists.prefixlist, 'name', 'seqnumber' ) %}
-{% if prefixlist.enabled == '1' %}
+{% if prefixlist.enabled == '1' and ':' not in prefixlist.network %}
ip prefix-list {{ prefixlist.name }} seq {{ prefixlist.seqnumber }} {{ prefixlist.action }} {{ prefixlist.network }}
{% endif %}
+!
+{% if prefixlist.enabled == '1' and ':' in prefixlist.network %}
+ipv6 prefix-list {{ prefixlist.name }} seq {{ prefixlist.seqnumber }} {{ prefixlist.action }} {{ prefixlist.network }}
+{% endif %}
{% endfor %}
{% endif %}
!