diff --git a/net/frr/pkg-descr b/net/frr/pkg-descr
index 01e0a13c6..efddc98ae 100644
--- a/net/frr/pkg-descr
+++ b/net/frr/pkg-descr
@@ -20,6 +20,8 @@ Plugin Changelog
* Add description fields to BGP tabs
* Add BGP community-lists
+* Add option for BGP graceful restart
+* Allow to set BGP neighbor timers
1.17
diff --git a/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/Api/BgpController.php b/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/Api/BgpController.php
index 0f926cf22..68fb8c75b 100644
--- a/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/Api/BgpController.php
+++ b/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/Api/BgpController.php
@@ -48,6 +48,9 @@ class BgpController extends ApiMutableModelControllerBase
"updatesource",
"nexthopself",
"multihop",
+ "keepalive",
+ "holddown",
+ "connecttimer",
"defaultoriginate",
"linkedPrefixlistIn",
"linkedPrefixlistOut",
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 b0128e5ff..d3bc6cca5 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
@@ -18,6 +18,13 @@
true
In some cases it might be clearer to set a fixed router-id.
+
+ bgp.graceful
+
+ checkbox
+ true
+ BGP graceful restart functionality as defined in RFC-4724 defines the mechanisms that allows BGP speaker to continue to forward data packets along known routes while the routing protocol information is being restored.
+
bgp.networks
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 6476f9ee9..7f170a4cb 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
@@ -38,7 +38,28 @@
checkbox
-
+
+ neighbor.keepalive
+
+ text
+ true
+ Keepalive timer to check if the neighbor is still up. Default when unset is 60 seconds.
+
+
+ neighbor.holddown
+
+ text
+ true
+ The time in seconds when a neighbor is considered dead. This is usually 3 times the keeplive timer and when unset 180 seconds.
+
+
+ neighbor.connecttimer
+
+ text
+ true
+ The time in seconds how fast a neighbor tries to reconnect.
+
+
neighbor.defaultoriginate
checkbox
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 0abecfd3b..e1106e13e 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.0.4
+ 1.0.5
0
@@ -17,6 +17,10 @@
N
/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/
+
+ 0
+ Y
+
N
@@ -70,6 +74,21 @@
0
N
+
+ N
+ 1
+ 1000
+
+
+ N
+ 3
+ 3000
+
+
+ N
+ 1
+ 65000
+
0
N
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 e5d05085b..86a75860a 100644
--- a/net/frr/src/opnsense/service/templates/OPNsense/Quagga/bgpd.conf
+++ b/net/frr/src/opnsense/service/templates/OPNsense/Quagga/bgpd.conf
@@ -15,6 +15,9 @@ log syslog {{ OPNsense.quagga.general.sysloglevel }}
{% if helpers.exists('OPNsense.quagga.bgp.asnumber') and OPNsense.quagga.bgp.asnumber != '' %}
router bgp {{ OPNsense.quagga.bgp.asnumber }}
no bgp ebgp-requires-policy
+{% if helpers.exists('OPNsense.quagga.bgp.graceful') and OPNsense.quagga.bgp.graceful == '1' %}
+ bgp graceful-restart
+{% endif %}
{% if helpers.exists('OPNsense.quagga.bgp.routerid') and OPNsense.quagga.bgp.routerid != '' %}
bgp router-id {{ OPNsense.quagga.bgp.routerid }}
{% endif %}
@@ -28,6 +31,14 @@ router bgp {{ OPNsense.quagga.bgp.asnumber }}
{% if 'multihop' in neighbor and neighbor.multihop == '1' %}
neighbor {{ neighbor.address }} ebgp-multihop
{% endif %}
+{% if 'keepalive' in neighbor and neighbor.keepalive != '' %}
+{% if 'holddown' in neighbor and neighbor.holddown != '' %}
+ neighbor {{ neighbor.address }} timers {{ neighbor.keepalive }} {{ neighbor.holddown }}
+{% endif %}
+{% endif %}
+{% if 'connecttimer' in neighbor and neighbor.connecttimer != '' %}
+ neighbor {{ neighbor.address }} timers connect {{ neighbor.connecttimer }}
+{% endif %}
{% endif %}
{% endfor %}
{% endif %}