On Mon, Mar 21, 2022 at 12:24:33PM +0100, Claudio Jeker wrote: > During config reload the RIB may need to be resynced when the > 'no evaluate' setting changes. > > This changes the code to actually flush the Adj-RIB-Out of affected peers > and then adjust the RIB in a 2nd step. That way there is no need to use > rde_generate_updates() to remove the prefixes one by one in the NOFIB case. > > Also fix the loop to reinsert all prefixes to remove the prefix from the > temporary list before calling prefix_evaluate(). Calling prefix_evaluate() > with p as the old prefix is just wrong. It is not on the rib_entry list at > that time.
I'm ok with this. I noticed that the bit changing prefix_evaluate(re, p, p) to prefix_evaluate(re, p, NULL) undoes part of rde.c r1.512 whose commit message said Doing the LIST_REMOVE() outside of prefix_evalute() is no longer valid. > This can be improved further but since this code path is almost never > needed (changing rib flags happens almost never) it is not urgent. > -- > :wq Claudio > > Index: rde.c > =================================================================== > RCS file: /cvs/src/usr.sbin/bgpd/rde.c,v > retrieving revision 1.541 > diff -u -p -r1.541 rde.c > --- rde.c 21 Mar 2022 10:15:34 -0000 1.541 > +++ rde.c 21 Mar 2022 11:13:34 -0000 > @@ -3469,7 +3469,33 @@ rde_reload_done(void) > rib_free(rib); > break; > case RECONF_RELOAD: > - rib_update(rib); > + if (rib_update(rib)) { > + LIST_FOREACH(peer, &peerlist, peer_l) { > + /* ignore peerself*/ Missing space after peerself