reads ok. unrelated to this diff: I wonder if the manpage (of both ospfd and pspf6d) should mention that changing fib-priority with a reload is equivalent toa uncouple/couple?
Denis Fondras([email protected]) on 2019.12.15 09:56:15 +0100: > > 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)); >
