diff options
-rw-r--r-- | data/templates/frr/bgp.frr.tmpl | 10 | ||||
-rw-r--r-- | interface-definitions/include/bgp/neighbor-graceful-restart.xml.i | 25 | ||||
-rw-r--r-- | interface-definitions/include/bgp/protocol-common-config.xml.i | 9 | ||||
-rwxr-xr-x | src/conf_mode/protocols_bgp.py | 4 |
4 files changed, 46 insertions, 2 deletions
diff --git a/data/templates/frr/bgp.frr.tmpl b/data/templates/frr/bgp.frr.tmpl index dafe45f59..2f67fa39e 100644 --- a/data/templates/frr/bgp.frr.tmpl +++ b/data/templates/frr/bgp.frr.tmpl @@ -35,6 +35,16 @@ {% if config.ebgp_multihop is defined and config.ebgp_multihop is not none %} neighbor {{ neighbor }} ebgp-multihop {{ config.ebgp_multihop }} {% endif %} +{% if config.graceful_restart is defined and config.graceful_restart is not none %} +{% if config.graceful_restart == 'enable' %} +{% set graceful_restart = 'graceful-restart' %} +{% elif config.graceful_restart == 'disable' %} +{% set graceful_restart = 'graceful-restart-disable' %} +{% elif config.graceful_restart == 'restart-helper' %} +{% set graceful_restart = 'graceful-restart-helper' %} +{% endif %} + neighbor {{ neighbor }} {{ graceful_restart }} +{% endif %} {% if config.local_as is defined and config.local_as is not none %} {% for local_asn in config.local_as %} neighbor {{ neighbor }} local-as {{ local_asn }} {{ 'no-prepend' if config.local_as[local_asn].no_prepend is defined }} diff --git a/interface-definitions/include/bgp/neighbor-graceful-restart.xml.i b/interface-definitions/include/bgp/neighbor-graceful-restart.xml.i new file mode 100644 index 000000000..25558cd5c --- /dev/null +++ b/interface-definitions/include/bgp/neighbor-graceful-restart.xml.i @@ -0,0 +1,25 @@ +<!-- include start from bgp/neighbor-graceful-restart.xml.i --> +<leafNode name="graceful-restart"> + <properties> + <help>BGP graceful restart functionality</help> + <completionHelp> + <list>enable disable restart-helper</list> + </completionHelp> + <valueHelp> + <format>enable</format> + <description>Enable BGP graceful restart at peer level</description> + </valueHelp> + <valueHelp> + <format>disable</format> + <description>Disable BGP graceful restart at peer level</description> + </valueHelp> + <valueHelp> + <format>restart-helper</format> + <description>Enable BGP graceful restart helper only functionality</description> + </valueHelp> + <constraint> + <regex>^(enable|disable|restart-helper)$</regex> + </constraint> + </properties> +</leafNode> +<!-- include end --> diff --git a/interface-definitions/include/bgp/protocol-common-config.xml.i b/interface-definitions/include/bgp/protocol-common-config.xml.i index 1d5fe88b1..9c17780bf 100644 --- a/interface-definitions/include/bgp/protocol-common-config.xml.i +++ b/interface-definitions/include/bgp/protocol-common-config.xml.i @@ -1000,6 +1000,10 @@ #include <include/bgp/neighbor-disable-capability-negotiation.xml.i>
#include <include/bgp/neighbor-disable-connected-check.xml.i>
#include <include/bgp/neighbor-ebgp-multihop.xml.i>
+<!--
+ requires GitHub FRR issues #8403 to be fixed
+ bgp/neighbor-graceful-restart.xml.i
+-->
<node name="interface">
<properties>
<help>Interface parameters</help>
@@ -1435,6 +1439,11 @@ #include <include/bgp/neighbor-disable-capability-negotiation.xml.i>
#include <include/bgp/neighbor-disable-connected-check.xml.i>
#include <include/bgp/neighbor-ebgp-multihop.xml.i>
+<!--
+ requires GitHub FRR issues #8403 to be fixed
+ bgp/neighbor-graceful-restart.xml.i
+-->
+ #include <include/bgp/neighbor-graceful-restart.xml.i>
#include <include/bgp/neighbor-local-as.xml.i>
#include <include/bgp/neighbor-override-capability.xml.i>
#include <include/bgp/neighbor-passive.xml.i>
diff --git a/src/conf_mode/protocols_bgp.py b/src/conf_mode/protocols_bgp.py index a8c8ff2a2..aca1dbe46 100755 --- a/src/conf_mode/protocols_bgp.py +++ b/src/conf_mode/protocols_bgp.py @@ -161,7 +161,7 @@ def verify(bgp): # Check if neighbor has both ipv4 unicast and ipv4 labeled unicast configured at the same time. if 'ipv4_unicast' in peer_config['address_family'] and 'ipv4_labeled_unicast' in peer_config['address_family']: raise ConfigError(f'Neighbor "{peer}" cannot have both ipv4-unicast and ipv4-labeled-unicast configured at the same time!') - + # Check if neighbor has both ipv6 unicast and ipv6 labeled unicast configured at the same time. if 'ipv6_unicast' in peer_config['address_family'] and 'ipv6_labeled_unicast' in peer_config['address_family']: raise ConfigError(f'Neighbor "{peer}" cannot have both ipv6-unicast and ipv6-labeled-unicast configured at the same time!') @@ -214,7 +214,7 @@ def verify(bgp): if dict_search(f'parameters.distance.global.{key}', bgp) == None: raise ConfigError('Missing mandatory configuration option for '\ f'global administrative distance {key}!') - + # Throw an error if the address family specific administrative distance parameters aren't all filled out. if dict_search('address_family', bgp) == None: pass |