I agree with this.

ok benno@

Claudio Jeker([email protected]) on 2020.12.23 15:37:02 +0100:
> In bgpd statements like
>       network inet static
> or
>       network rtlabel "exportme"
> will skip routes that use 127.0.0.1 as nexthop. This makes sense for
> network connected and network static but for rtlabel and even priority
> based selection this makes less sense.
> 
> Especially using rtlabel to export routes should give the admin also the
> option to export reject or blackhole routes (which have their nexthop set
> to 127.0.0.1).
> 
> This diff does this change but still skips networks like 224/4 for network
> inet static. I think this is a decent compromise.
> -- 
> :wq Claudio
> 
> Index: kroute.c
> ===================================================================
> RCS file: /cvs/src/usr.sbin/bgpd/kroute.c,v
> retrieving revision 1.239
> diff -u -p -r1.239 kroute.c
> --- kroute.c  1 Oct 2019 08:57:48 -0000       1.239
> +++ kroute.c  4 Dec 2020 11:31:09 -0000
> @@ -110,7 +110,7 @@ int       kr6_delete(struct ktable *, struct k
>  int  krVPN4_delete(struct ktable *, struct kroute_full *, u_int8_t);
>  int  krVPN6_delete(struct ktable *, struct kroute_full *, u_int8_t);
>  void kr_net_delete(struct network *);
> -int  kr_net_match(struct ktable *, struct network_config *, u_int16_t);
> +int  kr_net_match(struct ktable *, struct network_config *, u_int16_t, int);
>  struct network *kr_net_find(struct ktable *, struct network *);
>  void kr_net_clear(struct ktable *);
>  void kr_redistribute(int, struct ktable *, struct kroute *);
> @@ -1318,7 +1318,8 @@ kr_net_redist_del(struct ktable *kt, str
>  }
>  
>  int
> -kr_net_match(struct ktable *kt, struct network_config *net, u_int16_t flags)
> +kr_net_match(struct ktable *kt, struct network_config *net, u_int16_t flags,
> +    int loopback)
>  {
>       struct network          *xn;
>  
> @@ -1330,10 +1331,16 @@ kr_net_match(struct ktable *kt, struct n
>                       /* static match already redistributed */
>                       continue;
>               case NETWORK_STATIC:
> +                     /* Skip networks with nexthop on loopback. */
> +                     if (loopback)
> +                             continue;
>                       if (flags & F_STATIC)
>                               break;
>                       continue;
>               case NETWORK_CONNECTED:
> +                     /* Skip networks with nexthop on loopback. */
> +                     if (loopback)
> +                             continue;
>                       if (flags & F_CONNECTED)
>                               break;
>                       continue;
> @@ -1419,6 +1426,7 @@ kr_redistribute(int type, struct ktable 
>  {
>       struct network_config    net;
>       u_int32_t                a;
> +     int                      loflag = 0;
>  
>       bzero(&net, sizeof(net));
>       net.prefix.aid = AID_INET;
> @@ -1449,9 +1457,9 @@ kr_redistribute(int type, struct ktable 
>           (a >> IN_CLASSA_NSHIFT) == IN_LOOPBACKNET)
>               return;
>  
> -     /* Consider networks with nexthop loopback as not redistributable. */
> +     /* Check if the nexthop is the loopback addr. */
>       if (kr->nexthop.s_addr == htonl(INADDR_LOOPBACK))
> -             return;
> +             loflag = 1;
>  
>       /*
>        * never allow 0.0.0.0/0 the default route can only be redistributed
> @@ -1460,7 +1468,7 @@ kr_redistribute(int type, struct ktable 
>       if (kr->prefix.s_addr == INADDR_ANY && kr->prefixlen == 0)
>               return;
>  
> -     if (kr_net_match(kt, &net, kr->flags) == 0)
> +     if (kr_net_match(kt, &net, kr->flags, loflag) == 0)
>               /* no longer matches, if still present remove it */
>               kr_net_redist_del(kt, &net, 1);
>  }
> @@ -1468,7 +1476,8 @@ kr_redistribute(int type, struct ktable 
>  void
>  kr_redistribute6(int type, struct ktable *kt, struct kroute6 *kr6)
>  {
> -     struct network_config    net;
> +     struct network_config   net;
> +     int                     loflag = 0;
>  
>       bzero(&net, sizeof(net));
>       net.prefix.aid = AID_INET6;
> @@ -1503,11 +1512,9 @@ kr_redistribute6(int type, struct ktable
>           IN6_IS_ADDR_V4COMPAT(&kr6->prefix))
>               return;
>  
> -     /*
> -      * Consider networks with nexthop loopback as not redistributable.
> -      */
> +     /* Check if the nexthop is the loopback addr. */
>       if (IN6_IS_ADDR_LOOPBACK(&kr6->nexthop))
> -             return;
> +             loflag = 1;
>  
>       /*
>        * never allow ::/0 the default route can only be redistributed
> @@ -1517,7 +1524,7 @@ kr_redistribute6(int type, struct ktable
>           memcmp(&kr6->prefix, &in6addr_any, sizeof(struct in6_addr)) == 0)
>               return;
>  
> -     if (kr_net_match(kt, &net, kr6->flags) == 0)
> +     if (kr_net_match(kt, &net, kr6->flags, loflag) == 0)
>               /* no longer matches, if still present remove it */
>               kr_net_redist_del(kt, &net, 1);
>  }
> 

Reply via email to