Download raw body.
bgpd: handle validation state updates better
On Thu, Sep 24, 2026 at 04:27:15PM +0200, Claudio Jeker wrote:
> Right now prefix_update() handles validation state updates that don't
> change anything as a nop. The problem is that because of this possible
> outbound filters are not rerun. So filter rules like
> deny to ebgp ovs invalid
> don't get rerun and the so routes may be sent out that should not.
>
> Doing the same dance we do for the filtered flag is enough to trigger the
> outbound filters.
Makes sense and reads fine to me.
ok tb
>
> PS: The Adj-RIB-Out does no longer track the validation state so the
> bgpctl show rib out output will always show the validation states as N-?.
>
> --
> :wq Claudio
>
> Index: rde_rib.c
> ===================================================================
> RCS file: /cvs/src/usr.sbin/bgpd/rde_rib.c,v
> diff -u -p -r1.305 rde_rib.c
> --- rde_rib.c 21 Sep 2026 18:47:26 -0000 1.305
> +++ rde_rib.c 24 Sep 2026 13:47:11 -0000
> @@ -955,17 +955,23 @@ prefix_update(struct rib *rib, struct rd
>
> /* no change, update last change */
> p->lastchange = getmonotime();
> - p->validation_state = state->vstate;
> p_filtered = (p->flags & PREFIX_FLAG_FILTERED) != 0;
> - /* check if filtered flag changed */
> - if (p_filtered != filtered) {
> + /* check if filtered flag or validation state changed */
> + if (p_filtered != filtered ||
> + p->validation_state != state->vstate) {
> struct rib_entry *re;
>
> re = rib_get_addr(rib, prefix, prefixlen);
> /* remove prefix from rib */
> prefix_evaluate(re, NULL, p);
> - /* toggle filtered flag */
> - p->flags ^= PREFIX_FLAG_FILTERED;
> +
> + /* adjust filtered flag and vstate */
> + if (filtered)
> + p->flags |= PREFIX_FLAG_FILTERED;
> + else
> + p->flags &= ~PREFIX_FLAG_FILTERED;
> + p->validation_state = state->vstate;
> +
> /* redo route decision */
> prefix_evaluate(re, p, NULL);
> }
>
bgpd: handle validation state updates better