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