With address dhcp and a lease carrying option 121 and option 3, the option 121 routes never stay installed. Option 121 routes are added outside the FRR render (Debian's rfc3442-classless-routes hook via the VyOS ip() wrapper and vtysh). staticd.frr.j2 renders only the option 3 router, so any frr-reload deletes the 121 routes. 98-vyos-static-routes-dhclient-hook runs systemd-run --no-block vyos-frr-render.py --after-commit on every BOUND; the reload lands right after the rfc3442 hook has added the routes:
17:04:19.240 systemd[1]: Started /usr/libexec/vyos/vyos-frr-render.py --after-commit. 17:04:19.313 dhclient-script-vyos: Command was executed successfully via vtysh: "ip route 198.51.100.0/24 10.33.2.2 eth1 tag 210 210 " frr-reload 17:04:19.747: 'no ip route 198.51.100.0/24 10.33.2.2 eth1 tag 210 210'
Before T9278 (1.5.1) the hook ran only for dhcp-interface static routes and synchronously, so the 121 routes were installed at lease time and lost only at the next commit that reloaded FRR.
Also: the option 3 default is rendered even when option 121 is present. RFC 3442: "If the DHCP server returns both a Classless Static Routes option and a Router option, the DHCP client MUST ignore the Router option."
Impact: option 121 routes via a gateway other than the option 3 router are silently never installed.
Expected: option 121 routes kept across reloads; no option 3 default when option 121 is present.
Suggested fix: render the 121 routes in staticd.frr.j2 (store new_rfc3442_classless_static_routes in the lease dump, decode it like get_dhcp_router()), skip the option 3 default when 121 is present, and drop the vtysh route handling from the dhclient hooks. Reordering hooks does not help.