]> git.proxmox.com Git - mirror_frr.git/commit
ospfd: fix incorrect detection of topology changes in helper mode
authorRenato Westphal <renato@opensourcerouting.org>
Thu, 18 Nov 2021 17:52:20 +0000 (14:52 -0300)
committerRenato Westphal <renato@opensourcerouting.org>
Tue, 23 Nov 2021 18:31:39 +0000 (15:31 -0300)
commit1bb2674ce451d634635fcfec509bd195af8310ca
tree0bb97696ec7a396f21b6fb583d0c5d441096bdfa
parent003d3dbeada846989b9471a9840491272cd0d86a
ospfd: fix incorrect detection of topology changes in helper mode

This commit fixes a rather obscure bug that was causing the GR
topotest to fail on a frequent basis.

RFC 3623 specifies that a router acting as a helper to a restarting
neighbor should monitor topology changes and abort the GR procedures
when one is detected, falling back to normal OSPF operation.

ospfd uses the ospf_lsa_different() function to detect when the
content of an LSA has changed, which is considered as a topology
change. The problem is that ospf_lsa_different() can return true
even when the two LSAs passed as parameters are identical, provided
one LSA has the OSPF_LSA_RECEIVED flag set and the other not.

In the context of the ospf_gr_topo1 test, router rt6 performs
a graceful restart and a few seconds later acts as a helper for
router rt7. When it's acting as a helper for rt7, it still didn't
translate its NSSA Type-7 LSAs, something that happens only after 7
seconds (OSPF_ABR_TASK_DELAY) of the first SPF run. The translated
Type-5 LSAs on its LSDB were learned from the helping neighbors
(rt3 and rt7). It's then possible that the NSSA Type-7 LSAs might
be translated while rt6 is acting as helper for rt7, which causes
the daemon to detect a non-existent topology change only because
the OSPF_LSA_RECEIVED flag is unset in the recently originated
Type-5 LSA.

Fix this problem by ignoring the OSPF_LSA_RECEIVED flag when
comparing LSAs for the purpose of topology change detection.

In short, the bug would only show up when the restarting router
would start acting as a helper immediately after coming back up
(which would be hard to happen in the real world). The topotest
failures became more frequent after commit 6255aad0bc78c1 because of
the removal of the 'sleep' calls, which used to give ospfd more time
to converge before start acting as a helper for other routers. The
problem still occurred from time to time though.

Fixes #9983.

Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
ospfd/ospf_gr_helper.c
ospfd/ospf_lsa.c
ospfd/ospf_lsa.h