On Mon, Jul 09, 2018 at 11:58:05PM +0200, Sebastian Benoit wrote:
>
> compare the right things here: we want to know if the flag has changed.
> Found with claudios help and patience.
>
> ok?
This is fucked up. :)
> (benno_claudio_rde_reconf_F_RIB_HASNOFIB.diff)
>
> Index: rde.c
> ===================================================================
> RCS file: /cvs/src/usr.sbin/bgpd/rde.c,v
> retrieving revision 1.386
> diff -u -p -u -1 -2 -r1.386 rde.c
> --- rde.c 9 Jul 2018 14:44:02 -0000 1.386
> +++ rde.c 9 Jul 2018 21:56:40 -0000
> @@ -758,25 +758,25 @@ rde_dispatch_imsg_parent(struct imsgbuf
> }
> break;
> case IMSG_RECONF_RIB:
> if (imsg.hdr.len - IMSG_HEADER_SIZE !=
> sizeof(struct rde_rib))
> fatalx("IMSG_RECONF_RIB bad len");
> memcpy(&rn, imsg.data, sizeof(rn));
> rib = rib_find(rn.name);
> if (rib == NULL)
> rib = rib_new(rn.name, rn.rtableid, rn.flags);
> else if (rib->rtableid != rn.rtableid ||
> (rib->flags & F_RIB_HASNOFIB) !=
> - (rib->flags & F_RIB_HASNOFIB)) {
> + (rn->flags & F_RIB_HASNOFIB)) {
> struct filter_head *in_rules;
> struct rib_desc *ribd = rib_desc(rib);
> /*
> * Big hammer in the F_RIB_HASNOFIB case but
> * not often enough used to optimise it more.
> * Need to save the filters so that they're not
> * lost.
> */
> in_rules = ribd->in_rules;
> ribd->in_rules = NULL;
> rde_rib_free(ribd);
> rib = rib_new(rn.name, rn.rtableid, rn.flags);
>
--
:wq Claudio