On 2022/08/02 12:34, 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.
How much of a problem is it that this clears any existing bgpd routes if "fib update no" is set? I guess in the common case there won't be any anyway, but is there any use-case for running two copies of bgpd, one with fib update, one without, on the same machine? > 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); > } >