On Tue, Aug 02, 2022 at 01:44:42PM +0200, Theo Buehler wrote: > On Tue, Aug 02, 2022 at 12:34:40PM +0200, Claudio Jeker wrote: > > On startup we load the routing table in bgpd and at that moment a cleanup > > of old bgpd routes should happen. I noticed this is not the case because > > fib_sync is not set and so send_rtmsg() just returns. > > I think we need to force fib_sync in fetchtable() to make sure the cleanup > > happens correctly. > > If I understand correctly, this ignores the fs flag of ktable_new() for > the fetchtable() call. In particular, 'fib-update no' is ignored in this > situation. Is that intentional?
I think it is. At least I thought that even with 'fib-update no' bgpd should cleanup the FIB. Now that may be a problem when people run multiple bgpds with 'fib-update no'. I see if I can find a solution that is a smaller hammer to fix this. > > > > OK? > > -- > > :wq Claudio > > > > Index: kroute.c > > =================================================================== > > RCS file: /cvs/src/usr.sbin/bgpd/kroute.c,v > > retrieving revision 1.285 > > diff -u -p -r1.285 kroute.c > > --- kroute.c 28 Jul 2022 14:05:13 -0000 1.285 > > +++ kroute.c 2 Aug 2022 10:13:59 -0000 > > @@ -2726,6 +2726,7 @@ fetchtable(struct ktable *kt) > > char *buf = NULL, *next, *lim; > > struct rt_msghdr *rtm; > > struct kroute_full kf; > > + int fib_sync; > > > > mib[0] = CTL_NET; > > mib[1] = PF_ROUTE; > > @@ -2754,6 +2755,10 @@ fetchtable(struct ktable *kt) > > } > > } > > > > + /* force fib_sync on during fetch */ > > + fib_sync = kt->fib_sync; > > + kt->fib_sync = 1; > > + > > lim = buf + len; > > for (next = buf; next < lim; next += rtm->rtm_msglen) { > > rtm = (struct rt_msghdr *)next; > > @@ -2768,6 +2773,8 @@ fetchtable(struct ktable *kt) > > else > > kroute_insert(kt, &kf); > > } > > + kt->fib_sync = fib_sync; > > + > > free(buf); > > return (0); > > } > > > -- :wq Claudio