Page MenuHomeVyOS Platform

IPv6 BFD sessions never reach `Up` on unnumbered VLAN sub-interfaces sharing a parent's MAC (upstream FRR bug, tracked as FRRouting/frr#22921)
Closed, ResolvedPublicBUG

Description

    1. Environment
  • VyOS 1.5.1/circinus, FRR 10.5.2
  • Bonded interface (bond0) with multiple 802.1Q VLAN sub-interfaces (bond0.2XX), each carrying its own IPv6 global address but no explicit per-interface MAC — i.e. all sub-interfaces inherit the parent bond's MAC (standard Linux default, not a VyOS misconfiguration)

Summary

On two directly-connected routers with this addressing pattern, IPv6 BFD sessions between them — whether triggered by OSPFv3's own interface-level bfd profile integration, or by a manually configured protocols bfd peer <link-local> with explicit source address/source interface — never transition past Down, indefinitely. IPv4 BFD on the same physical links, same routers, same OSPF/BGP config style, works correctly and reaches Up with both sides negotiating the configured profile's timers.

Steps to reproduce

set interfaces bonding bond0 vif 210 address '<ipv6-global>/64'
set interfaces bonding bond0 vif 213 address '<ipv6-global>/64'
set interfaces bonding bond0 vif 214 address '<ipv6-global>/64'
# (no explicit `mac` set on bond0 or any vif — all inherit bond0's MAC)

set protocols bfd profile CORE interval receive '300'
set protocols bfd profile CORE interval transmit '300'
set protocols bfd profile CORE interval multiplier '3'
set protocols ospfv3 interface bond0.210 bfd profile 'CORE'
set protocols ospfv3 interface bond0.213 bfd profile 'CORE'
set protocols ospfv3 interface bond0.214 bfd profile 'CORE'
commit

Repeat symmetrically on the peer router for the same link. OSPFv3 adjacency reaches Full normally (BFD is not required for adjacency, just for fast failure detection). But:

run show bfd peers

shows the corresponding fe80::.../interface bond0.21X peer(s) permanently Status: down, Diagnostics: neighbor signaled session down, with a Downtime that only grows.

Observed behavior

tcpdump -ni bond0.210 udp port 3784 on either router shows both directions actively exchanging valid BFD control packets every ~300ms (matching the configured transmit interval) — this is not a packet-loss or firewall issue, packets genuinely arrive on both ends. Both sides simply never progress their own state machine past Down in response.

ip addr show confirms the actual root cause: because all VLAN sub-interfaces on bond0 inherit the parent's MAC, the EUI-64-derived IPv6 link-local address is identical across every one of that router's own sub-interfaces (bond0, .200, .210, .211/.213, .212/.214, .302, .310, .311, .312 all show the same fe80::... address). The link-local address alone is therefore not sufficient to uniquely identify which interface a BFD control packet belongs to.

    1. Workarounds attempted, both unsuccessful
  1. OSPFv3-integrated bfd profile (as above) — syntax accepted, adjacency fine, BFD session never comes up.
  2. Manual static peer with explicit disambiguation: ` set protocols bfd peer <peer-link-local> source address <own-link-local> set protocols bfd peer <peer-link-local> source interface bond0.210 ` VyOS correctly requires both source address and source interface for IPv6 link-local peers (rejects a bare link-local peer otherwise: *"BFD IPv6 link-local peers require explicit local address and interface setting"*), and the resulting session does show up correctly in show bfd peers as Peer Type: configured with the right local-address/interface binding — but it still never leaves Down, with the same neighbor signaled session down diagnostic.
  3. Removed the OSPFv3-integrated registration entirely (to rule out the dynamic and static registrations conflicting/stomping on each other for the same session) — the static-only session still stayed Down.

Root cause — matches known upstream FRR issue

This matches, exactly, the bug described in the still-open upstream PR FRRouting/frr#22921: multiple unnumbered peers deriving the same EUI-64 link-local address share an identical (source, destination) address pair, leaving the outgoing interface (ifindex) as the only distinguishing key in bfdd's session tracking — and under certain registration/update orderings, sessions with an unresolved or interface-less key collapse onto each other and "stomp," remaining Down indefinitely. The fix modifies _bfd_sess_valid() in lib/bfd.c to defer registration until the interface is unambiguously known. As of 2026-08-06 that PR is open, unmerged, targeting master — not present in FRR 10.5.2 (the version shipping in VyOS 1.5.1).

    1. Ask
  • Track FRRouting/frr#22921 for merge, and backport into VyOS's FRR package once it lands upstream — this is a real, reproducible functional gap for any unnumbered IPv6 deployment using OSPFv3/BGP BFD (i.e. anyone using VyOS's own IP-unnumbered pattern across VLAN sub-interfaces of the same physical bond/interface, not an exotic edge case).
  • No VyOS-side config or documentation change is needed once the upstream fix ships — the existing ospfv3 interface bfd profile/bfd peer config already does the right thing, it's purely blocked on the FRR-side session-tracking bug.

Related context

Structurally the same root category as the fib daddr . iif type ambiguity bug from T9157 (same IP-unnumbered multi-device addressing pattern, different subsystem affected — FIB classification there, BFD session tracking here). Worth cross-referencing if a maintainer is looking at unnumbered-addressing robustness more broadly.

Details

Version
1.5.1
Is it a breaking change?
Perfectly compatible
Issue type
Bug (incorrect behavior)

Event Timeline

Viacheslav triaged this task as Normal priority.

https://github.com/FRRouting/frr/pull/22921 got merged can we ask the frr project for a backport or do it self?

Viacheslav changed the task status from Open to In progress.Sep 10 2026, 1:34 PM
Viacheslav reassigned this task from hedrok to rherold.
Viacheslav added a subscriber: hedrok.

Update: in our case this was not an FRR bug, it was a firewall problem on our side.

Root cause: the input filter on the VLAN sub-interfaces ends in a default drop, and the rule that accepts BFD only matched a source group containing global addresses
(loopbacks). OSPFv3-integrated BFD and the static link-local peers send from fe80:: sources, so those packets were dropped. OSPFv3 itself was accepted (protocol ospf from
any source), which is why the adjacencies were Full. tcpdump showed BFD packets in both directions because it captures before netfilter.

Multihop BFD (BGP sessions between loopbacks, udp 4784) was blocked the same way: there was no accept rule for port 4784 on some of the routers, and on others the rule
used the wrong source group.

Reproduced in a lab with two VyOS 1.5.1 VMs (FRR 10.5.2), VLAN sub-interfaces sharing the parent MAC and therefore the same fe80:: address, OSPFv3 with a BFD profile:

  • without a firewall all sessions come up
  • with a default-drop input chain that only accepts BFD from global addresses they stay down
  • adding an accept rule for udp 3784 from fe80::/10 brings them up

After accepting fe80::/10 and udp 4784 in the BFD rules, all BFD sessions are up on our routers.

One additional config issue on one router: ebgp-multihop was missing on the peer-group of the loopback eBGP sessions, so BFD was registered as single-hop on the wrong
interface. After adding it, those sessions came up too.

So the shared link-local address by itself is not the problem. FRRouting/frr#22921 describes a different issue (BGP unnumbered with BFD, session registered before the
interface is known). I could not reproduce that one either, and it is not what happened here.