You're reading the deprecated documentation on readthedocs.io. The documentation has moved to netlab.tools.

BFD Configuration Templates

This document describes BFD configuration module implementation details:

  • Typical BFD interface configuration template

  • Data structures describing IGP BFD client state

  • Typical configuration template enabling IGP BFD client in individual interfaces

BFD Configuration Template Boilerplate

When configuring BFD on an interface, you have to consider global and interface BFD parameters as well as whether BFD is disabled on an interface with bfd: false:

  • Global BFD parameters are in bfd variable. At least bfd.multiplier is set in the global parameters (from system defaults)

  • Interface BFD parameters are in l.bfd variable

  • BFD is disabled when l.bfd is defined and has a False (or None or empty) value.

  • You could specify default platform values for bfd.min_rx and bfd.min_tx in devices.device.bfd system settings or in the configuration template.

{% for l in interfaces if bfd|default(False) or l.bfd|default(False) %}
interface {{ l.ifname }}
{%   set disable_bfd = l.bfd is defined and not l.bfd %}
{%   if not disable_bfd %}
{%     set link_bfd = l.bfd|default({}) %}
 bfd interval {{ 
   link_bfd.min_tx|default(bfd.min_tx)|default(500) }} min_rx {{ 
   link_bfd.min_rx|default(bfd.min_rx)|default(500) }} multiplier {{
   link_bfd.multiplier|default(bfd.multiplier)|default(3)
   }}
!
{%   else %}
 no bfd interval
{%   endif %}
{% endfor %}
{% if bfd.min_echo_rx|default(0) %}
bfd slow-timers {{ bfd.min_echo_rx }} 
{% endif %}

IGP/BFD Interaction

There are so many corner cases in BFD-with-IGP configuration matrix that it turned out to be simpler to calculate target IGP BFD state in the transformation code than to try to figure it out in Jinja2 configuration templates.

Inputs:

  • Target BFD interface state – True or False. Set with bfd link- or interface parameter. BFD is enabled on all interfaces whenever the BFD module is added to a node and can be disable on individual links/interface with bfd: false

  • IGP BFD state – Set with igp.bfd node parameter, for example ospf.bfd or isis.bfd. It can be a boolean value or a list of address families for multi-protocol IGPs (example: IS-IS).

  • Interface IGP BFD state – set with igp.bfd link- or interface parameter.

Output:

  • Target interface IGP BFD state in igp.bfd interface parameter – boolean value for single-AF routing protocols (OSPF, OSPFv3), AF dictionary for multi-AF routing protocols (IS-IS). You can use that parameter directly in device configuration templates (examples below).

Please note that the Python code calculating final IGP/BFD interface state updates only the interface data within nodes but not links or node-on-link data.

Most combinations of input parameters are covered in tests/topology/input/isis-bfd-test.yml, here are just a few examples. Starting with a topology that has IPv6 enabled on P2P interfaces and runs IS-IS BFD for IPv4 and IPv6:

addressing: # Enable IPv6 on links
  p2p:
    ipv6: 2001:db8:1::/48

isis:
  area: 49.0002
  bfd:
    ipv4: True
    ipv6: True

module: [ isis, bfd ]

provider: clab

nodes:
- name: sros_r1
  device: sros
- name: srlinux_r2
  device: srlinux

Links with no parameters will have IS-IS BFD enabled for IPv4 and IPv6:

links:
- name: Regular link, BFD enabled
  sros_r1:
  srlinux_r2:

Sample interface data:

- ifindex: 1
  ifname: ethernet-1/1
  ipv4: 10.1.0.1/30
  ipv6: 2001:db8:1::1/64
  isis:
    bfd:
      ipv4: true
      ipv6: true
  linkindex: 1
  name: Regular link, BFD enabled
  neighbors:
    sros_r1:
      ifname: 1/1/c1
      ipv4: 10.1.0.2/30
      ipv6: 2001:db8:1::2/64
  provider_ifname: e1-1
  remote_id: 1
  remote_ifindex: 1
  type: p2p

Disabling BFD on a link removes igp.bfd parameter from the interface data:

- name: Link with BFD disabled
  sros_r1:
  srlinux_r2:
  bfd: False
- bfd: false
  ifindex: 2
  ifname: ethernet-1/2
  ipv4: 10.1.0.5/30
  ipv6: 2001:db8:1:1::1/64
  linkindex: 2
  name: Link with BFD disabled
  neighbors:
    sros_r1:
      ifname: 1/1/c2
      ipv4: 10.1.0.6/30
      ipv6: 2001:db8:1:1::2/64
  provider_ifname: e1-2
  remote_id: 1
  remote_ifindex: 2
  type: p2p

You get the same result if you disable BFD with IGP settings:

- name: Link with ISIS BFD disabled
  sros_r1:
  srlinux_r2:
  isis.bfd: False

In multi-AF routing protocols you could enable or disable BFD on each link/interface for individual address families:

- name: Link with IPv4-only BFD
  sros_r1:
  srlinux_r2:
  isis.bfd: { ipv4: True, ipv6: False }

Resulting interface data:

- ifindex: 4
  ifname: ethernet-1/4
  ipv4: 10.1.0.13/30
  ipv6: 2001:db8:1:3::1/64
  isis:
    bfd:
      ipv4: true
      ipv6: false
  linkindex: 4
  name: Link with IPv4-only BFD
  neighbors:
    sros_r1:
      ifname: 1/1/c4
      ipv4: 10.1.0.14/30
      ipv6: 2001:db8:1:3::2/64
  provider_ifname: e1-4
  remote_id: 1
  remote_ifindex: 4
  type: p2p

IGP BFD Configuration Template Boilerplate

Adding BFD to an IGP configuration template is trivial due to already-computed interface BFD state.

Single-protocol boilerplate (OSPFv2):

{% for l in interfaces %}
...
{%     if l.ospf.bfd|default(False) %}
 ip ospf bfd
{%     endif %}
...
{% endfor %}

Multi-protocol boilerplate (IS-IS):

{% for l in interfaces %}
...
{%     if l.isis.bfd.ipv4|default(False) %}
 isis bfd
{%     endif %}
{%     if l.isis.bfd.ipv6|default(False) %}
 isis ipv6 bfd
{%     endif %}
...
{% endfor %}