reads good to me (but I did not test).

On Sun, Dec 15, 2019 at 09:56:15AM +0100, Denis Fondras wrote:
> 
> Index: kroute.c
> ===================================================================
> RCS file: /cvs/src/usr.sbin/ospf6d/kroute.c,v
> retrieving revision 1.61
> diff -u -p -r1.61 kroute.c
> --- kroute.c  12 Dec 2019 08:21:34 -0000      1.61
> +++ kroute.c  15 Dec 2019 08:42:10 -0000
> @@ -97,10 +97,11 @@ RB_PROTOTYPE(kroute_tree, kroute_node, e
>  RB_GENERATE(kroute_tree, kroute_node, entry, kroute_compare)
>  
>  int
> -kr_init(int fs, u_int rdomain, u_int8_t fib_prio)
> +kr_init(int fs, u_int rdomain, int redis_label_or_prefix, u_int8_t fib_prio)
>  {
>       int             opt = 0, rcvbuf, default_rcvbuf;
>       socklen_t       optlen;
> +     int             filter_prio = fib_prio;
>  
>       kr_state.fib_sync = fs;
>       kr_state.rdomain = rdomain;
> @@ -117,6 +118,18 @@ kr_init(int fs, u_int rdomain, u_int8_t 
>           &opt, sizeof(opt)) == -1)
>               log_warn("kr_init: setsockopt");        /* not fatal */
>  
> +     if (redis_label_or_prefix) {
> +             filter_prio = 0;
> +             log_info("%s: priority filter disabled", __func__);
> +     } else
> +             log_debug("%s: priority filter enabled", __func__);
> +
> +     if (setsockopt(kr_state.fd, AF_ROUTE, ROUTE_PRIOFILTER, &filter_prio,
> +         sizeof(filter_prio)) == -1) {
> +             log_warn("%s: setsockopt AF_ROUTE ROUTE_PRIOFILTER", __func__);
> +             /* not fatal */
> +     }
> +
>       /* grow receive buffer, don't wanna miss messages */
>       optlen = sizeof(default_rcvbuf);
>       if (getsockopt(kr_state.fd, SOL_SOCKET, SO_RCVBUF,
> @@ -353,6 +366,21 @@ kr_fib_decouple(void)
>       log_info("kernel routing table decoupled");
>  }
>  
> +void
> +kr_fib_update_prio(u_int8_t fib_prio)
> +{
> +     struct kroute_node      *kr;
> +
> +     RB_FOREACH(kr, kroute_tree, &krt)
> +             if ((kr->r.flags & F_OSPFD_INSERTED))
> +                     kr->r.priority = fib_prio;
> +
> +     log_info("fib priority changed from %hhu to %hhu", kr_state.fib_prio,
> +         fib_prio);
> +
> +     kr_state.fib_prio = fib_prio;
> +}
> +
>  /* ARGSUSED */
>  void
>  kr_dispatch_msg(int fd, short event, void *bula)
> @@ -522,11 +550,25 @@ kr_redistribute(struct kroute_node *kh)
>  }
>  
>  void
> -kr_reload(void)
> +kr_reload(int redis_label_or_prefix)
>  {
>       struct kroute_node      *kr, *kn;
>       u_int32_t                dummy;
>       int                      r;
> +     int                      filter_prio = kr_state.fib_prio;
> +
> +     /* update the priority filter */
> +     if (redis_label_or_prefix) {
> +             filter_prio = 0;
> +             log_info("%s: priority filter disabled", __func__);
> +     } else
> +             log_debug("%s: priority filter enabled", __func__);
> +
> +     if (setsockopt(kr_state.fd, AF_ROUTE, ROUTE_PRIOFILTER, &filter_prio,
> +         sizeof(filter_prio)) == -1) {
> +             log_warn("%s: setsockopt AF_ROUTE ROUTE_PRIOFILTER", __func__);
> +             /* not fatal */
> +     }
>  
>       RB_FOREACH(kr, kroute_tree, &krt) {
>               for (kn = kr; kn; kn = kn->next) {
> Index: ospf6d.c
> ===================================================================
> RCS file: /cvs/src/usr.sbin/ospf6d/ospf6d.c,v
> retrieving revision 1.44
> diff -u -p -r1.44 ospf6d.c
> --- ospf6d.c  25 Mar 2019 20:53:33 -0000      1.44
> +++ ospf6d.c  15 Dec 2019 08:42:10 -0000
> @@ -280,7 +280,8 @@ main(int argc, char *argv[])
>               fatal("unveil");
>  
>       if (kr_init(!(ospfd_conf->flags & OSPFD_FLAG_NO_FIB_UPDATE),
> -         ospfd_conf->rdomain, ospfd_conf->fib_priority) == -1)
> +         ospfd_conf->rdomain, ospfd_conf->redist_label_or_prefix,
> +         ospfd_conf->fib_priority) == -1)
>               fatalx("kr_init failed");
>  
>       event_dispatch();
> @@ -631,7 +632,7 @@ ospf_reload(void)
>  
>       merge_config(ospfd_conf, xconf);
>       /* update redistribute lists */
> -     kr_reload();
> +     kr_reload(ospfd_conf->redist_label_or_prefix);
>       return (0);
>  #else
>       return (-1);
> @@ -654,12 +655,16 @@ merge_config(struct ospfd_conf *conf, st
>       struct area             *a, *xa, *na;
>       struct iface            *iface;
>       struct redistribute     *r;
> +     int                      rchange = 0;
>  
>       /* change of rtr_id needs a restart */
>       conf->flags = xconf->flags;
>       conf->spf_delay = xconf->spf_delay;
>       conf->spf_hold_time = xconf->spf_hold_time;
> -     conf->redistribute = xconf->redistribute;
> +     if (SIMPLEQ_EMPTY(&conf->redist_list) !=
> +         SIMPLEQ_EMPTY(&xconf->redist_list))
> +             rchange = 1;
> +     conf->redist_label_or_prefix = xconf->redist_label_or_prefix;
>  
>       if (ospfd_process == PROC_MAIN) {
>               /* main process does neither use areas nor interfaces */
> @@ -671,6 +676,15 @@ merge_config(struct ospfd_conf *conf, st
>                       SIMPLEQ_REMOVE_HEAD(&xconf->redist_list, entry);
>                       SIMPLEQ_INSERT_TAIL(&conf->redist_list, r, entry);
>               }
> +
> +             /* adjust FIB priority if changed */
> +             if (conf->fib_priority != xconf->fib_priority) {
> +                     kr_fib_decouple();
> +                     kr_fib_update_prio(xconf->fib_priority);
> +                     conf->fib_priority = xconf->fib_priority;
> +                     kr_fib_couple();
> +             }
> +
>               goto done;
>       }
>  
> @@ -792,6 +806,8 @@ merge_interfaces(struct area *a, struct 
>                       dirty = 1;
>               i->metric = xi->metric;
>               i->priority = xi->priority;
> +             if (i->self)
> +                     i->self->priority = i->priority;
>               i->flags = xi->flags; /* needed? */
>               i->type = xi->type; /* needed? */
>               i->if_type = xi->if_type; /* needed? */
> Index: ospf6d.h
> ===================================================================
> RCS file: /cvs/src/usr.sbin/ospf6d/ospf6d.h,v
> retrieving revision 1.40
> diff -u -p -r1.40 ospf6d.h
> --- ospf6d.h  11 Jun 2019 05:00:09 -0000      1.40
> +++ ospf6d.h  15 Dec 2019 08:42:10 -0000
> @@ -385,6 +385,7 @@ struct ospfd_conf {
>       int                     spf_state;
>       int                     ospf_socket;
>       int                     flags;
> +     int                     redist_label_or_prefix;
>       u_int8_t                border;
>       u_int8_t                redistribute;
>       u_int8_t                fib_priority;
> @@ -540,15 +541,16 @@ u_int16_t        in_cksum(void *, size_t);
>  u_int16_t     iso_cksum(void *, u_int16_t, u_int16_t);
>  
>  /* kroute.c */
> -int           kr_init(int, u_int, u_int8_t);
> +int           kr_init(int, u_int, int, u_int8_t);
>  int           kr_change(struct kroute *, int);
>  int           kr_delete(struct kroute *);
>  void          kr_shutdown(void);
>  void          kr_fib_couple(void);
>  void          kr_fib_decouple(void);
> +void          kr_fib_update_prio(u_int8_t);
>  void          kr_dispatch_msg(int, short, void *);
>  void          kr_show_route(struct imsg *);
> -void          kr_reload(void);
> +void          kr_reload(int);
>  
>  void          embedscope(struct sockaddr_in6 *);
>  void          recoverscope(struct sockaddr_in6 *);
> Index: parse.y
> ===================================================================
> RCS file: /cvs/src/usr.sbin/ospf6d/parse.y,v
> retrieving revision 1.45
> diff -u -p -r1.45 parse.y
> --- parse.y   11 Jun 2019 05:00:09 -0000      1.45
> +++ parse.y   15 Dec 2019 08:42:10 -0000
> @@ -289,8 +289,10 @@ redistribute     : no REDISTRIBUTE STRING op
>                               r->type = REDIST_STATIC;
>                       else if (!strcmp($3, "connected"))
>                               r->type = REDIST_CONNECTED;
> -                     else if (prefix($3, &r->addr, &r->prefixlen))
> +                     else if (prefix($3, &r->addr, &r->prefixlen)) {
>                               r->type = REDIST_ADDR;
> +                             conf->redist_label_or_prefix = !$1;
> +                     }
>                       else {
>                               yyerror("unknown redistribute type");
>                               free($3);
> @@ -318,6 +320,8 @@ redistribute      : no REDISTRIBUTE STRING op
>                       r->label = rtlabel_name2id($4);
>                       if ($1)
>                               r->type |= REDIST_NO;
> +                     else
> +                             conf->redist_label_or_prefix = 1;
>                       r->metric = $5;
>                       if ($6)
>                               strlcpy(r->dependon, $6, sizeof(r->dependon));
> 

Reply via email to