Download raw body.
bgpd: rework rde out filters
On Thu, Feb 12, 2026 at 04:40:10PM +0100, Claudio Jeker wrote:
> The out filters are currently very expensive because at 700 peers
> rde_filter_out() is chasing memory all over the place and spends lot of
> time waiting for RAM access into pretty fat objects.
>
> Do the same thing as was done for filter_sets. Use a rde_filter struct
> that uses an array of match rules and on top of this use a hash table
> and refcnt to dedup equal filters.
>
> This diff reduces the initial load of my test IXP RS setup from 25min to
> around 18min. So this change is a significant speedup on busy systems.
>
> I want to apply the same for inbound filters but that requires a fair
> amount of reshuffling which will take some time.
>
ok tb
Two very minor comments below.
[...]
>
> Index: usr.sbin/bgpd/rde_filter.c
> ===================================================================
> RCS file: /cvs/src/usr.sbin/bgpd/rde_filter.c,v
> diff -u -p -r1.144 rde_filter.c
> --- usr.sbin/bgpd/rde_filter.c 11 Feb 2026 12:25:57 -0000 1.144
> +++ usr.sbin/bgpd/rde_filter.c 11 Feb 2026 22:03:30 -0000
> @@ -56,6 +56,20 @@ struct rde_filter_set {
> struct rde_filter_set_elm set[0];
> };
>
> +struct rde_filter_rule {
> + struct filter_match match;
> + struct rde_filter_set *rde_set;
> + enum filter_actions action;
> + uint8_t quick;
Nit: we usually indent with an extra space when there's no *
[...]
> +static int
> +rde_filtertable_equal(const struct rde_filter *arf,
> + const struct rde_filter *brf)
> +{
> + if (arf->len != brf->len)
> + return 0;
> + if (memcmp(arf->rules, brf->rules,
> + arf->len * sizeof(arf->rules[0])) != 0)
> + return 0;
> + return 1;
Nit: I'd write this as
return memcmp(...) == 0;
bgpd: rework rde out filters