Ferritaas Incident Intelligence
Defect Intelligence Report Bug 0876102 Severity: High (P2)

BGP Route Reflection Convergence Loop with Graceful Restart

BGP route reflector hubs in enterprise SD-WAN architectures suffer continuous route flapping and neighbor drops when Graceful Restart stale timer expiration in bgp_gr_stale_timer_expire fails to synchronize Routing Information Base (RIB) state, sending Hold Timer Expired notifications.

Technical Root Cause Analysis

In large-scale SD-WAN hub-and-spoke networks, FortiGate appliances commonly act as BGP Route Reflectors (RR) while running Graceful Restart (GR) to prevent traffic interruption during brief network link hiccups or daemon restarts.

Under FortiOS 7.2.4–7.2.7 and 7.4.0–7.4.1, when a spoke router initiates a Graceful Restart sequence, the hub marks the spoke's advertised routes as 'stale' and begins decrementing the stale route retention timer (default 360 seconds). If the spoke re-establishes the BGP session and begins re-advertising prefixes before the stale timer finishes flushing, bgp_gr_stale_timer_expire() fails to cleanly unbind old RIB tree pointers. This induces a circular path calculation when reflecting routes to other spokes. The routing daemon routerd exhausts its hold timer loop, issues a BGP Notification 4/0 (Hold Timer Expired) to the peer, and flushes thousands of routes from the kernel forwarding plane.

routerd: BGP: [BGP-GR] 10.254.1.1: stale timer expired (360s) before peer restart completion! routerd: BGP: bgp_gr_stale_timer_expire: failed to clear stale rib entry 192.168.100.0/24 (flags=0x840) routerd: BGP: route reflection circular dependency: cluster_list loop detected on peer 10.254.1.2 routerd: BGP: %BGP-3-NOTIFICATION: sent to neighbor 10.254.1.1 4/0 (Hold Timer Expired) 0 bytes kernel: FIB: invalidating 4280 prefix paths across sdwan vdom root

Affected Firmware & Blast Radius Matrix

FortiOS Branch Vulnerable Builds Confirmed Clean Build Status & Workaround
FortiOS 7.2 7.2.4 – 7.2.7 7.2.8+ Disable graceful-restart or lower stale timer
FortiOS 7.4 7.4.0 – 7.4.1 7.4.2+ Upgrade recommended for SD-WAN hubs
FortiOS 7.0 Not Affected 7.0 Branch Clean Independent GR stale timer state machine

Platform Impact: Affects FortiGate 100F, 200F, 400F, and 600F appliances configured as BGP route reflectors for enterprise SD-WAN topologies with more than 50 spoke nodes.

Step 01: Free Verification CLI (Safe Read-Only)

Execute these diagnostic commands on the SD-WAN Hub to inspect BGP peer state stability and verify whether graceful restart timer expirations are triggering session tear-downs:

Diagnostic Commands

# 1. Check BGP neighbor status, prefix counts, and uptime
get router info bgp summary

# 2. Inspect specific neighbor Graceful Restart negotiation and timer flags
get router info bgp neighbors 10.254.1.1

# 3. Monitor routerd CPU consumption and process responsiveness
diagnose sys top 2 5 | grep routerd

# 4. View active BGP routes and identify lingering stale markers
get router info routing-table bgp | grep "stale"

Remediation & Workaround Steps (Teaser Preview)

Follow the complete step-by-step remediation guide in the Ferrite interactive platform:

Step 02: Tune BGP Graceful-Restart Stale Route Timers

Shorten graceful-restart-time and stale-route-timer to 30 seconds to force immediate clean reconvergence without RIB queue buildup.

🔒 Interactive CLI Available in Ferrite Runbook #24

Step 03: Temporarily Disable Graceful-Restart on Hub Reflectors

Disable graceful-restart helper mode selectively on spoke neighbor templates to eliminate circular route reflection stalls.

🔒 Interactive CLI Available in Ferrite Runbook #24

Step 04: Deploy FortiOS 7.2.8+ or 7.4.2+ GA Maintenance Release

Upgrade to fixed firmware containing atomic stale route invalidation and synchronized route reflector cluster loops.

🔒 Interactive CLI Available in Ferrite Runbook #24
⚡ Ferrite Platform Superpowers

Execute the Complete Runbook with Live Browser Automation

Connect your FortiGate via browser console (Web Serial) or local SSH bridge, verify each command in real-time, generate ready-to-run Tera Term scripts, and export sanitized TAC dossiers.

Live Browser Automation Direct terminal connection with live step checkoff.
📟
1-Click Tera Term (.ttl) Generate scripts for air-gapped jumpboxes.
🛡️
Zero-Trust Scrubber Scrub serials and credentials in local browser RAM.
📄
TAC P1 Escalation Dossier Standardized evidence export with SHA-256 seal.

Frequently Asked Questions

What causes the BGP Graceful Restart convergence loop?

In SD-WAN hub-and-spoke topologies with route reflection enabled, when a spoke reboots, the hub preserves advertised routes as 'stale' during the Graceful Restart window. In affected FortiOS builds, when the stale timer expires, bgp_gr_stale_timer_expire fails to clear the RIB before processing new route reflection updates, creating a circular route dependency. The routerd process locks on hold timers, sends BGP Notification 4/0 (Hold Timer Expired), and tears down all spoke sessions.

Can BGP Graceful Restart be disabled without dropping traffic?

Disabling graceful-restart under 'config router bgp' causes an immediate peer session reset if BGP capability negotiation is updated. To avoid outages, schedule this during a maintenance window or shorten graceful-restart-time to 30 seconds.

Which FortiOS firmware versions resolve Bug 0876102?

The bug is permanently fixed in FortiOS 7.2.8 and 7.4.2 GA, where the route reflection reflection loop detector and GR stale timer cleanups were synchronized into an atomic operation.