Rework prefix_insert() and prefix_remove() to properly recalculate dmetric
authorclaudio <claudio@openbsd.org>
Thu, 7 Jul 2022 19:46:38 +0000 (19:46 +0000)
committerclaudio <claudio@openbsd.org>
Thu, 7 Jul 2022 19:46:38 +0000 (19:46 +0000)
commit1d5ff589dc4b4b0284b505b92c9baf4d5b00eca5
tree411e9d3bc6486843b90e77739b5a8016851045d2
parent5a601eee0fe4b44f242eba03061614330e2e3e12
Rework prefix_insert() and prefix_remove() to properly recalculate dmetric

The med regress test triggered the fatal in prefix_set_dmetric() because
on MED priority inversion the simple check previous with next before remove
can return a negative number because that prefix is also inversed.

Adjust code so that when removing prefixes from the list wait until the
next element is checked to do the fixup. In prefix_remove() cache the
previous element and calculate the dmetric at the end of the MED check.
In prefix_insert() alter the loop to also defer the dmetric recalc by
removing most continue statements in the loop.
With and OK tb@
usr.sbin/bgpd/rde_decide.c