On Sat, Jul 23, 2022 at 11:14:35AM +0200, Claudio Jeker wrote:
> Change the logic and name of bgpd_filternexthop(). This function applies
> the 'nexthop qualify via' config setting. Instead of telling if the route
> is filtered (true) or not (false) flip the logic around and rename the
> function to bgpd_oknexthop(). Also flip the internal logic around to
> simplify the logic in bgpd_oknexthop().
> 
> Adjust the kroute_match() code accordingly (which makes that code easier
> to understand).
> 
> This is just a refactor and should not change behaviour.
> -- 
> :wq Claudio
> 
> Index: bgpd.c
> ===================================================================
> RCS file: /cvs/src/usr.sbin/bgpd/bgpd.c,v
> retrieving revision 1.251
> diff -u -p -r1.251 bgpd.c
> --- bgpd.c    22 Jul 2022 17:26:58 -0000      1.251
> +++ bgpd.c    23 Jul 2022 08:53:58 -0000
> @@ -1115,23 +1115,27 @@ send_network(int type, struct network_co
>       return (0);
>  }
>  
> +/*
> + * Return true if a route can be used for nexthop resolution.
> + */
>  int
> -bgpd_filternexthop(struct kroute_full *kf)
> +bgpd_oknexthop(struct kroute_full *kf)
>  {
> -     /* kernel routes are never filtered */
> -     if (kf->flags & F_KERNEL && kf->prefixlen != 0)
> -             return (0);
> -
> -     if (cflags & BGPD_FLAG_NEXTHOP_BGP) {
> -             if (kf->flags & F_BGPD)
> +     if (kf->flags & F_BGPD) {
> +             if (cflags & BGPD_FLAG_NEXTHOP_BGP)
> +                     return (1);
> +             else
>                       return (0);
>       }
>  
> -     if (cflags & BGPD_FLAG_NEXTHOP_DEFAULT) {
> -             if (kf->prefixlen == 0)
> +     if (kf->prefixlen == 0) {
> +             if (cflags & BGPD_FLAG_NEXTHOP_DEFAULT)
> +                     return (1);
> +             else
>                       return (0);
>       }

Your version is ok. I'd do away with the inner ifs and write this as:

        if (kf->flags & F_BGPD)
                return ((cflags & BGPD_FLAG_NEXTHOP_BGP) != 0);

        if (kf->prefixlen == 0)
                return ((cflags & BGPD_FLAG_NEXTHOP_DEFAULT) != 0);

>  
> +     /* any other route is fine */
>       return (1);
>  }
>  
> Index: bgpd.h
> ===================================================================
> RCS file: /cvs/src/usr.sbin/bgpd/bgpd.h,v
> retrieving revision 1.444
> diff -u -p -r1.444 bgpd.h
> --- bgpd.h    22 Jul 2022 17:26:58 -0000      1.444
> +++ bgpd.h    23 Jul 2022 08:54:09 -0000
> @@ -1265,7 +1265,7 @@ void             send_nexthop_update(struct kroute
>  void          send_imsg_session(int, pid_t, void *, uint16_t);
>  int           send_network(int, struct network_config *,
>                    struct filter_set_head *);
> -int           bgpd_filternexthop(struct kroute_full *);
> +int           bgpd_oknexthop(struct kroute_full *);
>  void          set_pollfd(struct pollfd *, struct imsgbuf *);
>  int           handle_pollfd(struct pollfd *, struct imsgbuf *);
>  
> Index: kroute.c
> ===================================================================
> RCS file: /cvs/src/usr.sbin/bgpd/kroute.c,v
> retrieving revision 1.278
> diff -u -p -r1.278 kroute.c
> --- kroute.c  22 Jul 2022 17:26:58 -0000      1.278
> +++ kroute.c  23 Jul 2022 08:55:27 -0000
> @@ -2444,7 +2444,7 @@ knexthop_send_update(struct knexthop *kn
>  }
>  
>  struct kroute *
> -kroute_match(struct ktable *kt, struct bgpd_addr *key, int matchall)
> +kroute_match(struct ktable *kt, struct bgpd_addr *key, int matchany)
>  {
>       int                      i;
>       struct kroute           *kr;
> @@ -2453,8 +2453,7 @@ kroute_match(struct ktable *kt, struct b
>       for (i = 32; i >= 0; i--) {
>               applymask(&masked, key, i);
>               if ((kr = kroute_find(kt, &masked, i, RTP_ANY)) != NULL)
> -                     if (matchall ||
> -                         bgpd_filternexthop(kr_tofull(kr)) == 0)
> +                     if (matchany || bgpd_oknexthop(kr_tofull(kr)))
>                               return (kr);
>       }
>  
> @@ -2462,7 +2461,7 @@ kroute_match(struct ktable *kt, struct b
>  }
>  
>  struct kroute6 *
> -kroute6_match(struct ktable *kt, struct bgpd_addr *key, int matchall)
> +kroute6_match(struct ktable *kt, struct bgpd_addr *key, int matchany)
>  {
>       int                      i;
>       struct kroute6          *kr6;
> @@ -2471,8 +2470,7 @@ kroute6_match(struct ktable *kt, struct 
>       for (i = 128; i >= 0; i--) {
>               applymask(&masked, key, i);
>               if ((kr6 = kroute6_find(kt, &masked, i, RTP_ANY)) != NULL)
> -                     if (matchall ||
> -                         bgpd_filternexthop(kr6_tofull(kr6)) == 0)
> +                     if (matchany || bgpd_oknexthop(kr6_tofull(kr6)))
>                               return (kr6);
>       }
>  
> 

Reply via email to