Properly handle nexthop state changes in the decision process
authorclaudio <claudio@openbsd.org>
Mon, 25 Jul 2022 16:37:55 +0000 (16:37 +0000)
committerclaudio <claudio@openbsd.org>
Mon, 25 Jul 2022 16:37:55 +0000 (16:37 +0000)
commit13d31ce9d625cd457d307aacf713d55b48d659b2
tree1f92b5c2ac0d82760f98e42913ac3a0178fac812
parent6e49524e53a0634e679c3be872a96929038e41f9
Properly handle nexthop state changes in the decision process

In rev 1.90 of rde_decide.c the re->active cache of the best prefix was
replaced with a call to prefix_best(). This introduced a bug because the
nexthop state at that time may have changed already. As a result when
a nexthop became unreachable prefix_evaluate() had oldbest = NULL and
newbest = NULL and did not withdraw the prefix from FIB and Adj-RIB-Out.

To fix this store the nexthop state per prefix and introduce
prefix_evaluate_nexthop() which removes the prefix from the decision list,
updates the nexthop state of the prefix and reinserts the prefix. Doing
this ensures that prefix_best() always reports the same result once the
decison process is done. prefix_best() and prefix_eligible() only depend
on data stored on the prefix itself.

OK tb@
usr.sbin/bgpd/rde.c
usr.sbin/bgpd/rde.h
usr.sbin/bgpd/rde_decide.c
usr.sbin/bgpd/rde_rib.c