FRRouting (FRR)
Overview
FRRouting (FRR) is an open-source IP routing protocol suite for Linux systems. SiteRM controls FRR-based software routers using the sense.frr Ansible collection. This collection is also used to manage FRR when combined with VPP (DPDK-accelerated data plane) for high-performance software routing.
| Property | Value |
|---|---|
Ansible network_os |
sense.frr.frr |
| Ansible Collection | sense-frr-collection |
| VLAN Creation | Yes |
| BGP Control | Yes |
| BGP Multipath | Yes |
| QoS (network-level) | No |
| Ping / Traceroute | Yes |
Note: When used with VPP (DPDK), the same sense.frr.frr collection is used. The FRR instance runs alongside VPP and handles control-plane routing while VPP handles the high-performance data plane. See the FRR + VPP DPDK guide for hardware setup.
Ansible Inventory Configuration
inventory:
frr_s0:
network_os: sense.frr.frr
host: 192.168.1.10
user: admin
pass: <password> # or use sshkey
# sshkey: /opt/siterm/config/ssh-keys/id-rsa-sense
become: true # FRR requires root or sudo access
ssh_common_args: "-o StrictHostKeyChecking=no"
Note: FRR devices typically do not use SNMP for monitoring. The snmp_params block can be omitted.
Facts Collection
SiteRM collects topology and interface information from FRR-based systems using standard Linux networking commands (executed via SSH):
ip addr
ip r
ip -6 r
ip neigh
Additionally, interface information is gathered from the Linux kernel filesystem:
/sys/class/net/<interface>/operstate
/sys/class/net/<interface>/mtu
/sys/class/net/<interface>/speed
/sys/class/net/<interface>/address
Information extracted:
- IPv4 and IPv6 addresses with subnet masks
- IPv4 and IPv6 routing tables (all routes)
- ARP/NDP neighbor table with MAC address mapping by VLAN
- Interface operational status (
up/down) - MTU, TX queue length, link speed
- MAC addresses
- VLAN interface configuration (sub-interfaces and bridges)
VLAN Creation and Deletion
FRR-based systems use Linux VLAN sub-interfaces or bridge/VLAN interfaces. The sense.frr collection configures the Linux networking stack directly via commands or by interacting with the FRR management daemon.
Example: VLAN 3617, VRF lhcone, physical interface eth0
Creating a VLAN sub-interface and associated VRF binding:
# Create VLAN interface
ip link add link eth0 name eth0.3617 type vlan id 3617
ip link set eth0.3617 mtu 9000
# Assign to VRF
ip link set eth0.3617 master lhcone
# Assign IPv6 address
ip -6 addr add fc00:0:0:0:0:0:0:59/124 dev eth0.3617
# Bring up
ip link set eth0.3617 up
Delete VLAN
ip link set eth0.3617 down
ip link del eth0.3617
BGP Configuration
FRR BGP is configured through FRR’s vtysh management shell. The sense.frr collection applies configuration by communicating with the FRR daemon.
Example: BGP (ASN 64513, VRF lhcone)
# Enter vtysh
vtysh
# Configure prefix lists
configure terminal
ipv6 prefix-list sense-abc123-from permit 2001:48d0:3001:110::/64
ipv6 prefix-list sense-abc123-to permit 2605:d9c0:2:fff1::/64
# Configure route maps
route-map sense-abc123-mapin permit 10
match ipv6 address prefix-list sense-abc123-from
route-map sense-abc123-mapout permit 10
match ipv6 address prefix-list sense-abc123-to
# Configure BGP
router bgp 64513 vrf lhcone
address-family ipv6 unicast
network 2605:d9c0:2:fff1::/64
neighbor fc00:0:0:0:0:0:0:5a remote-as 64512
neighbor fc00:0:0:0:0:0:0:5a activate
neighbor fc00:0:0:0:0:0:0:5a soft-reconfiguration inbound
neighbor fc00:0:0:0:0:0:0:5a route-map sense-abc123-mapin in
neighbor fc00:0:0:0:0:0:0:5a route-map sense-abc123-mapout out
end
write memory
Delete BGP
vtysh
configure terminal
no ipv6 prefix-list sense-abc123-from
no ipv6 prefix-list sense-abc123-to
no route-map sense-abc123-mapin
no route-map sense-abc123-mapout
router bgp 64513 vrf lhcone
address-family ipv6 unicast
no network 2605:d9c0:2:fff1::/64
no neighbor fc00:0:0:0:0:0:0:5a
end
write memory
Ping and Traceroute
SENSE can issue active probes from FRR-based systems (requires IP assigned to a SENSE VLAN interface).
Ping
# IPv6
ping6 -c 10 -W 5 fc00:0:0:0:0:0:0:5a
# IPv6 with VRF (Linux network namespace)
ip netns exec lhcone ping6 -c 10 -W 5 fc00:0:0:0:0:0:0:5a
# IPv4
ping -c 10 -W 5 10.0.0.1
Traceroute
# IPv6
traceroute6 fc00:0:0:0:0:0:0:5a
# IPv4
traceroute 10.0.0.1
Switch Configuration in main.yaml
frr_s0:
rsts_enabled: ipv4,ipv6 # Enable BGP control
private_asn: 64513 # Private ASN assigned by SENSE team
vrf: lhcone # VRF name for SENSE traffic
vlan_mtu: 9000
vlan_range:
- 3600-3699
allports: false
ports:
eth0:
capacity: 100000 # Port capacity in Mbps
eth1:
capacity: 100000
isAlias: urn:ogf:network:remote-site.net:2024:frr_s0:port_xyz
wanlink: true
Deployment Options
Docker / Bare-metal
FRR is commonly deployed as a Docker container on a bare-metal host. Refer to the Software Based Router (FRR) guide for Docker Compose deployment instructions.
Critical requirement: FRR containers must use network_mode: host — bridge networking does not work because FRR needs direct access to the Linux kernel routing table.
Docker + VPP (DPDK, bare-metal)
For high-throughput deployments (10/40/100 Gbps), FRR can be paired with VPP as a DPDK-accelerated data plane. VPP bypasses the kernel for packet forwarding; FRR handles BGP via Linux mirror interfaces (LCP). See the FRR + VPP DPDK guide.
Kubernetes with Multus (VPP+FRR in a pod)
VPP+FRR can be deployed as a Kubernetes StatefulSet with physical NICs passed into the pod via Multus CNI and the host-device plugin. This is suited for sites managing SENSE infrastructure on Kubernetes.
Two manifest variants are available:
| Variant | NICs | Hugepages | Description |
|---|---|---|---|
vpp-frr-router.yaml |
1 NIC | 1Gi + 2Mi | Single uplink, static IPAM on Multus interface |
new-vpp-frr.yaml |
2 NICs bonded | 2Mi only | Dual uplink with XOR/L3-4 bond for higher throughput |
Both variants:
- Use the
sdnsense/vppfrr:devDocker image - Run VPP with DPDK (privileged pod,
NET_ADMIN/SYS_RAWIO/IPC_LOCKcapabilities) - Create Linux mirror interfaces via VPP LCP (
lcp create) so FRR can use them for BGP - Expose SSH on port 22334 at the pod’s WAN IPv6 address for SENSE Ansible management
- Accept the SiteRM Frontend’s SSH public key via a Kubernetes Secret
SENSE connects to the pod using the standard sense.frr.frr Ansible collection with the pod’s IPv6 address and port 22334 as the management endpoint.
See the FRR + VPP DPDK guide for full manifest examples and configuration details.
Required Kernel Modules for QoS (Agent-side)
When the SiteRM Agent runs on the same host as FRR, host-level QoS (Linux TC / FireQOS) requires these kernel modules:
sch_htb sch_sfq ifb sch_ingress cls_u32 act_mirred
These are loaded automatically by the Agent’s run.sh script. If missing:
modprobe sch_htb sch_sfq ifb sch_ingress cls_u32 act_mirred
Known Limitations and Notes
- No network-level QoS: QoS rate limiting on FRR is applied at the Linux host level by the SiteRM Agent (using
tc/FireQOS), not at the FRR/switch level. - BGP Multipath: Supported via ECMP in FRR. Multiple BGP peers for the same destination will create multipath routes.
- VRF isolation: Linux VRF (via L3 master devices) is required for VRF-scoped routing. Ensure VRF interfaces are created before FRR attempts to add VRF-scoped routes.
- Host networking required: FRR Docker deployments must use
network_mode: hostfor the container to access the host’s VLAN interfaces and routing tables.