On Mon, Mar 21, 2022 at 05:16:53PM +0100, Claudio Jeker wrote:
> In struct rib_entry bgpd keeps the 'best' or active prefix cached.
> Now to support more than one one prefix per path (for ECMP and add-path)
> I need the ability to access the previous element. The currently used
> LIST macros do not support that. So I want to switch that to TAILQ but
> the TAILQ head is 2 pointers not 1 and so I need to free a pointer from
> struct rib_entry. Also this active cache makes less sense with multiple
> paths.
>
> Access to the active prefix is replaced with the better named
> prefix_best() which returns the LIST_FIRST entry if that one is eligible.
Missed one bit in prefix_evaluate_all():
/usr/src/usr.sbin/bgpd/rde_rib.c:1526:17: error: no member named 'active' in
'struct rib_entry'
p == re->active)
~~ ^
With that fixed, ok
tiny nit below:
> Index: rde_decide.c
> ===================================================================
> RCS file: /cvs/src/usr.sbin/bgpd/rde_decide.c,v
> retrieving revision 1.89
> diff -u -p -r1.89 rde_decide.c
> --- rde_decide.c 3 Mar 2022 13:06:15 -0000 1.89
> +++ rde_decide.c 21 Mar 2022 16:03:05 -0000
> @@ -443,6 +443,23 @@ prefix_eligible(struct prefix *p)
> return 1;
> }
>
> +struct prefix *
> +prefix_best(struct rib_entry *re)
> +{
> + struct prefix *xp;
> + struct rib *rib;
> +
> + rib = re_rib(re);
> + if (rib->flags & F_RIB_NOEVALUATE)
> + /* decision process is turned off */
> + return NULL;
> +
> + xp = LIST_FIRST(&re->prefix_h);
Use tab instead of 8 spaces for indent
> + if (xp != NULL && !prefix_eligible(xp))
> + xp = NULL;
> + return xp;
> +}
> +