diff --git a/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/bgp.xml b/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/bgp.xml
index 5be7fb2e2e..d50fc136d6 100644
--- a/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/bgp.xml
+++ b/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/bgp.xml
@@ -11,6 +11,22 @@
textYour AS Number here.
+
+ bgp.confed_asn
+
+ text
+ true
+ Specify the autonomous system number of the local confederation group. (Required if Confederation Peers are set)
+
+
+ bgp.confed_peers
+
+ select_multiple
+
+ true
+ true
+ Specify the Peers of the confederation group. (Required if Confederation ASN is set)
+ bgp.distance
diff --git a/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/BGP.php b/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/BGP.php
index 6af510a0c2..3655560259 100644
--- a/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/BGP.php
+++ b/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/BGP.php
@@ -3,6 +3,41 @@
namespace OPNsense\Quagga;
use OPNsense\Base\BaseModel;
+use Phalcon\Messages\Message;
+
+class BGP extends BaseModel
+{
+ public function performValidation($validateFullModel = false)
+ {
+ // Run standard XML field validations first
+ $messages = parent::performValidation($validateFullModel);
+
+ // Fetch values
+ $asn = trim((string)$this->confed_asn);
+ $peers = trim((string)$this->confed_peers);
+
+ $has_asn = !empty($asn);
+ $has_peers = !empty($peers);
+
+ // 1. ASN is set, but Peers are empty
+ if ($has_asn && !$has_peers) {
+ $messages->appendMessage(new Message(
+ "BGP Confederation Peers are required when a Confederation ASN is defined.",
+ "confed_peers"
+ ));
+ }
+
+ // 2. Peers are set, but ASN is empty
+ if (!$has_asn && $has_peers) {
+ $messages->appendMessage(new Message(
+ "BGP Confederation ASN is required when Confederation Peers are defined.",
+ "confed_asn"
+ ));
+ }
+
+ return $messages;
+ }
+}
/*
Copyright (C) 2017 Fabian Franz
@@ -25,7 +60,4 @@
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
-*/
-class BGP extends BaseModel
-{
-}
+*/
\ No newline at end of file
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..527693a7b2 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
@@ -13,6 +13,17 @@
14294967295
+
+ N
+ BGP Confederation ASN must be an integer between 1 and 4294967295.
+ 1
+ 4294967295
+
+
+ N
+ Each Peer ASN must be an integer between 1 and 4294967295.
+ /^(([1-9]|[1-9][0-9]{1,8}|[1-3][0-9]{9}|4[0-1][0-9]{8}|42[0-8][0-9]{7}|429[0-3][0-9]{6}|4294[0-8][0-9]{5}|42949[0-5][0-9]{4}|429496[0-6][0-9]{3}|4294967[0-1][0-9]{2}|42949672[0-8][0-9]|429496729[0-5])(,|$))+$/
+ 1255
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 d1e5b4073f..68e83776c5 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
@@ -29,6 +29,12 @@
{% endif %}
{% if helpers.exists('OPNsense.quagga.bgp.asnumber') and OPNsense.quagga.bgp.asnumber != '' %}
router bgp {{ OPNsense.quagga.bgp.asnumber }}
+{% if OPNsense.quagga.bgp.confed_asn|default('') != '' %}
+ bgp confederation identifier {{ OPNsense.quagga.bgp.confed_asn }}
+{% endif %}
+{% if OPNsense.quagga.bgp.confed_peers|default('') != '' %}
+ bgp confederation peers {{ OPNsense.quagga.bgp.confed_peers|replace(',', ' ') }}
+{% endif %}
{% if not helpers.empty('OPNsense.quagga.bgp.logneighborchanges') %}
bgp log-neighbor-changes
{% endif %}