On Sun, Feb 11, 2018 at 02:17:38AM +0100, Sebastian Benoit wrote:
> 
> Hi,
> 
> here is the ospfd part again, now the socket option is set on reload as
> well.
> 
> ok?
> 
> (benno_route_priofilter_2_ospfd.diff)
> 
> diff --git usr.sbin/ospfd/kroute.c usr.sbin/ospfd/kroute.c
> index 17febefbdcb..4f6dc933a42 100644
> --- usr.sbin/ospfd/kroute.c
> +++ usr.sbin/ospfd/kroute.c
> @@ -127,10 +127,11 @@ kif_init(void)
>  }
>  
>  int
> -kr_init(int fs, u_int rdomain)
> +kr_init(int fs, u_int rdomain, int redis_label_or_prefix)
>  {
>       int             opt = 0, rcvbuf, default_rcvbuf;
>       socklen_t       optlen;
> +     int             filter_prio = RTP_OSPF;
>  
>       kr_state.fib_sync = fs;
>       kr_state.rdomain = rdomain;
> @@ -146,6 +147,18 @@ kr_init(int fs, u_int rdomain)
>           &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,
> @@ -600,12 +613,27 @@ 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 = RTP_OSPF;
> +
> +     /* 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 */
> +     }
>  
> +     /* update redistribute lists */
>       RB_FOREACH(kr, kroute_tree, &krt) {
>               for (kn = kr; kn; kn = kn->next) {
>                       r = ospf_redistribute(&kn->r, &dummy);
> diff --git usr.sbin/ospfd/ospfd.c usr.sbin/ospfd/ospfd.c
> index 3c5057ae04e..01fd6bbafb9 100644
> --- usr.sbin/ospfd/ospfd.c
> +++ usr.sbin/ospfd/ospfd.c
> @@ -265,7 +265,7 @@ main(int argc, char *argv[])
>       event_add(&iev_rde->ev, NULL);
>  
>       if (kr_init(!(ospfd_conf->flags & OSPFD_FLAG_NO_FIB_UPDATE),
> -         ospfd_conf->rdomain) == -1)
> +         ospfd_conf->rdomain, ospfd_conf->redist_label_or_prefix) == -1)
>               fatalx("kr_init failed");
>  
>       /* remove unneeded stuff from config */
> @@ -637,7 +637,7 @@ ospf_reload(void)
>  
>       merge_config(ospfd_conf, xconf);
>       /* update redistribute lists */
> -     kr_reload();
> +     kr_reload(ospfd_conf->redist_label_or_prefix);
>       return (0);
>  }
>  
> @@ -667,6 +667,7 @@ merge_config(struct ospfd_conf *conf, struct ospfd_conf 
> *xconf)
>           SIMPLEQ_EMPTY(&xconf->redist_list))
>               rchange = 1;
>       conf->rfc1583compat = xconf->rfc1583compat;
> +     conf->redist_label_or_prefix = xconf->redist_label_or_prefix;
>  
>       if (ospfd_process == PROC_MAIN) {
>               /* main process does neither use areas nor interfaces */
> diff --git usr.sbin/ospfd/ospfd.h usr.sbin/ospfd/ospfd.h
> index af082b1079c..1a5d20e0068 100644
> --- usr.sbin/ospfd/ospfd.h
> +++ usr.sbin/ospfd/ospfd.h
> @@ -394,6 +394,7 @@ struct ospfd_conf {
>       int                     spf_state;
>       int                     ospf_socket;
>       int                     flags;
> +     int                     redist_label_or_prefix;
>       u_int8_t                rfc1583compat;
>       u_int8_t                border;
>       u_int8_t                redistribute;
> @@ -567,7 +568,7 @@ u_int16_t  iso_cksum(void *, u_int16_t, u_int16_t);
>  /* kroute.c */
>  int           kif_init(void);
>  void          kif_clear(void);
> -int           kr_init(int, u_int);
> +int           kr_init(int, u_int, int);
>  int           kr_change(struct kroute *, int);
>  int           kr_delete(struct kroute *);
>  void          kr_shutdown(void);
> @@ -578,7 +579,7 @@ void               kr_dispatch_msg(int, short, void *);
>  void          kr_show_route(struct imsg *);
>  void          kr_ifinfo(char *, pid_t);
>  struct kif   *kif_findname(char *, struct in_addr, struct kif_addr **);
> -void          kr_reload(void);
> +void          kr_reload(int);
>  
>  u_int8_t     mask2prefixlen(in_addr_t);
>  in_addr_t    prefixlen2mask(u_int8_t);
> diff --git usr.sbin/ospfd/parse.y usr.sbin/ospfd/parse.y
> index 4bf64d5d7e3..6f1cf5b7b19 100644
> --- usr.sbin/ospfd/parse.y
> +++ usr.sbin/ospfd/parse.y
> @@ -295,6 +295,8 @@ redistribute      : no REDISTRIBUTE NUMBER '/' NUMBER 
> optlist dependon {
>  
>                       if ($1)
>                               r->type |= REDIST_NO;
> +                     else
> +                             conf->redist_label_or_prefix = 1;
>                       r->metric = $6;
>                       if ($7)
>                               strlcpy(r->dependon, $7, sizeof(r->dependon));
> @@ -314,9 +316,10 @@ redistribute     : no REDISTRIBUTE NUMBER '/' NUMBER 
> optlist dependon {
>                               r->type = REDIST_STATIC;
>                       else if (!strcmp($3, "connected"))
>                               r->type = REDIST_CONNECTED;
> -                     else if (host($3, &r->addr, &r->mask))
> +                     else if (host($3, &r->addr, &r->mask)) {
>                               r->type = REDIST_ADDR;
> -                     else {
> +                             conf->redist_label_or_prefix = (! $1);

I think I prefer `conf->redist_label_or_prefix = !$1;` here at least that
is more KNF.

> +                     } else {
>                               yyerror("unknown redistribute type");
>                               free($3);
>                               free(r);
> @@ -343,6 +346,8 @@ redistribute      : no REDISTRIBUTE NUMBER '/' NUMBER 
> optlist dependon {
>                       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));
> 

Apart from that OK

-- 
:wq Claudio

Reply via email to