fib_priority was slapped into the code by passing it around all the time.
It is much smarter to use a global value in kr_state for the fib_prio and
then tag F_BGP_INSERTED routes with RTP_MINE (0xff) which is an impossible
RTP value. With that changing the prio requires "only" a fib decouple,
change global state, fib couple.
It will also allow for better support of blackhole routes and makes the
code a fair bit simpler.
--
:wq Claudio
Index: bgpd.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/bgpd.c,v
retrieving revision 1.243
diff -u -p -r1.243 bgpd.c
--- bgpd.c 2 Jun 2022 08:46:25 -0000 1.243
+++ bgpd.c 3 Jun 2022 13:27:20 -0000
@@ -273,7 +273,7 @@ main(int argc, char *argv[])
imsg_init(ibuf_rde, pipe_m2r[0]);
imsg_init(ibuf_rtr, pipe_m2roa[0]);
mrt_init(ibuf_rde, ibuf_se);
- if (kr_init(&rfd) == -1)
+ if (kr_init(&rfd, conf->fib_priority) == -1)
quit = 1;
keyfd = pfkey_init();
@@ -460,7 +460,7 @@ BROKEN if (pledge("stdio rpath wpath cpa
/* cleanup kernel data structures */
carp_demote_shutdown();
- kr_shutdown(conf->fib_priority, conf->default_tableid);
+ kr_shutdown(conf->default_tableid);
pftable_clear_all();
RB_FOREACH(p, peer_head, &conf->peers)
@@ -627,8 +627,7 @@ send_config(struct bgpd_config *conf)
/* RIBs for the RDE */
while ((rr = SIMPLEQ_FIRST(&ribnames))) {
SIMPLEQ_REMOVE_HEAD(&ribnames, entry);
- if (ktable_update(rr->rtableid, rr->name, rr->flags,
- conf->fib_priority) == -1) {
+ if (ktable_update(rr->rtableid, rr->name, rr->flags) == -1) {
log_warnx("failed to load routing table %d",
rr->rtableid);
return (-1);
@@ -745,8 +744,8 @@ send_config(struct bgpd_config *conf)
while ((vpn = SIMPLEQ_FIRST(&conf->l3vpns)) != NULL) {
SIMPLEQ_REMOVE_HEAD(&conf->l3vpns, entry);
- if (ktable_update(vpn->rtableid, vpn->descr, vpn->flags,
- conf->fib_priority) == -1) {
+ if (ktable_update(vpn->rtableid, vpn->descr, vpn->flags) ==
+ -1) {
log_warnx("failed to load routing table %d",
vpn->rtableid);
return (-1);
@@ -818,8 +817,7 @@ dispatch_imsg(struct imsgbuf *ibuf, int
else if (imsg.hdr.len != IMSG_HEADER_SIZE +
sizeof(struct kroute_full))
log_warnx("wrong imsg len");
- else if (kr_change(imsg.hdr.peerid, imsg.data,
- conf->fib_priority))
+ else if (kr_change(imsg.hdr.peerid, imsg.data))
rv = -1;
break;
case IMSG_KROUTE_DELETE:
@@ -828,8 +826,7 @@ dispatch_imsg(struct imsgbuf *ibuf, int
else if (imsg.hdr.len != IMSG_HEADER_SIZE +
sizeof(struct kroute_full))
log_warnx("wrong imsg len");
- else if (kr_delete(imsg.hdr.peerid, imsg.data,
- conf->fib_priority))
+ else if (kr_delete(imsg.hdr.peerid, imsg.data))
rv = -1;
break;
case IMSG_KROUTE_FLUSH:
@@ -916,15 +913,13 @@ dispatch_imsg(struct imsgbuf *ibuf, int
if (idx != PFD_PIPE_SESSION)
log_warnx("couple request not from SE");
else
- kr_fib_couple(imsg.hdr.peerid,
- conf->fib_priority);
+ kr_fib_couple(imsg.hdr.peerid);
break;
case IMSG_CTL_FIB_DECOUPLE:
if (idx != PFD_PIPE_SESSION)
log_warnx("decouple request not from SE");
else
- kr_fib_decouple(imsg.hdr.peerid,
- conf->fib_priority);
+ kr_fib_decouple(imsg.hdr.peerid);
break;
case IMSG_CTL_KROUTE:
case IMSG_CTL_KROUTE_ADDR:
@@ -975,7 +970,7 @@ dispatch_imsg(struct imsgbuf *ibuf, int
0, -1, NULL, 0);
/* finally fix kroute information */
- ktable_postload(conf->fib_priority);
+ ktable_postload();
/* redistribute list needs to be reloaded too */
kr_reload();
Index: bgpd.h
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/bgpd.h,v
retrieving revision 1.425
diff -u -p -r1.425 bgpd.h
--- bgpd.h 31 May 2022 09:45:33 -0000 1.425
+++ bgpd.h 3 Jun 2022 13:27:07 -0000
@@ -1284,20 +1284,20 @@ int roa_cmp(struct roa *, struct roa *)
RB_PROTOTYPE(roa_tree, roa, entry, roa_cmp);
/* kroute.c */
-int kr_init(int *);
-int ktable_update(u_int, char *, int, uint8_t);
+int kr_init(int *, uint8_t);
+int ktable_update(u_int, char *, int);
void ktable_preload(void);
-void ktable_postload(uint8_t);
+void ktable_postload(void);
int ktable_exists(u_int, u_int *);
-int kr_change(u_int, struct kroute_full *, uint8_t);
-int kr_delete(u_int, struct kroute_full *, uint8_t);
+int kr_change(u_int, struct kroute_full *);
+int kr_delete(u_int, struct kroute_full *);
int kr_flush(u_int);
-void kr_shutdown(uint8_t, u_int);
-void kr_fib_couple(u_int, uint8_t);
-void kr_fib_couple_all(uint8_t);
-void kr_fib_decouple(u_int, uint8_t);
-void kr_fib_decouple_all(uint8_t);
-void kr_fib_update_prio_all(uint8_t);
+void kr_shutdown(u_int);
+void kr_fib_couple(u_int);
+void kr_fib_couple_all(void);
+void kr_fib_decouple(u_int);
+void kr_fib_decouple_all(void);
+void kr_fib_prio_set(uint8_t);
int kr_dispatch_msg(u_int rdomain);
int kr_nexthop_add(uint32_t, struct bgpd_addr *,
struct bgpd_config *);
Index: config.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/config.c,v
retrieving revision 1.101
diff -u -p -r1.101 config.c
--- config.c 23 Feb 2022 11:20:35 -0000 1.101
+++ config.c 3 Jun 2022 13:18:09 -0000
@@ -229,9 +229,9 @@ merge_config(struct bgpd_config *xconf,
/* adjust FIB priority if changed */
/* if xconf is uninitialized we get RTP_NONE */
if (xconf->fib_priority != conf->fib_priority) {
- kr_fib_decouple_all(xconf->fib_priority);
- kr_fib_update_prio_all(conf->fib_priority);
- kr_fib_couple_all(conf->fib_priority);
+ kr_fib_decouple_all();
+ kr_fib_prio_set(conf->fib_priority);
+ kr_fib_couple_all();
}
/* take over the easy config changes */
Index: kroute.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/kroute.c,v
retrieving revision 1.247
diff -u -p -r1.247 kroute.c
--- kroute.c 2 Jun 2022 09:29:34 -0000 1.247
+++ kroute.c 3 Jun 2022 13:27:40 -0000
@@ -41,6 +41,8 @@
#include "bgpd.h"
#include "log.h"
+#define RTP_MINE 0xff
+
struct ktable **krt;
u_int krt_size;
@@ -48,6 +50,7 @@ struct {
uint32_t rtseq;
pid_t pid;
int fd;
+ uint8_t fib_prio;
} kr_state;
struct kroute_node {
@@ -96,19 +99,19 @@ struct kif_node {
struct kif_kr6_head kroute6_l;
};
-int ktable_new(u_int, u_int, char *, int, uint8_t);
-void ktable_free(u_int, uint8_t);
-void ktable_destroy(struct ktable *, uint8_t);
+int ktable_new(u_int, u_int, char *, int);
+void ktable_free(u_int);
+void ktable_destroy(struct ktable *);
struct ktable *ktable_get(u_int);
-int kr4_change(struct ktable *, struct kroute_full *, uint8_t);
-int kr6_change(struct ktable *, struct kroute_full *, uint8_t);
-int krVPN4_change(struct ktable *, struct kroute_full *, uint8_t);
-int krVPN6_change(struct ktable *, struct kroute_full *, uint8_t);
-int kr4_delete(struct ktable *, struct kroute_full *, uint8_t);
-int kr6_delete(struct ktable *, struct kroute_full *, uint8_t);
-int krVPN4_delete(struct ktable *, struct kroute_full *, uint8_t);
-int krVPN6_delete(struct ktable *, struct kroute_full *, uint8_t);
+int kr4_change(struct ktable *, struct kroute_full *);
+int kr6_change(struct ktable *, struct kroute_full *);
+int krVPN4_change(struct ktable *, struct kroute_full *);
+int krVPN6_change(struct ktable *, struct kroute_full *);
+int kr4_delete(struct ktable *, struct kroute_full *);
+int kr6_delete(struct ktable *, struct kroute_full *);
+int krVPN4_delete(struct ktable *, struct kroute_full *);
+int krVPN6_delete(struct ktable *, struct kroute_full *);
void kr_net_delete(struct network *);
int kr_net_match(struct ktable *, struct network_config *, uint16_t, int);
struct network *kr_net_find(struct ktable *, struct network *);
@@ -180,12 +183,10 @@ void get_rtaddrs(int, struct sockaddr *
void if_change(u_short, int, struct if_data *, u_int);
void if_announce(void *, u_int);
-int send_rtmsg(int, int, struct ktable *, struct kroute *,
- uint8_t);
-int send_rt6msg(int, int, struct ktable *, struct kroute6 *,
- uint8_t);
+int send_rtmsg(int, int, struct ktable *, struct kroute *);
+int send_rt6msg(int, int, struct ktable *, struct kroute6 *);
int dispatch_rtmsg(u_int);
-int fetchtable(struct ktable *, uint8_t);
+int fetchtable(struct ktable *);
int fetchifs(int);
int dispatch_rtmsg_addr(struct rt_msghdr *,
struct sockaddr *[RTAX_MAX], struct ktable *);
@@ -213,7 +214,7 @@ RB_GENERATE(kif_tree, kif_node, entry, k
*/
int
-kr_init(int *fd)
+kr_init(int *fd, uint8_t fib_prio)
{
int opt = 0, rcvbuf, default_rcvbuf;
unsigned int tid = RTABLE_ANY;
@@ -251,6 +252,7 @@ kr_init(int *fd)
kr_state.pid = getpid();
kr_state.rtseq = 1;
+ kr_state.fib_prio = fib_prio;
RB_INIT(&kit);
@@ -262,7 +264,7 @@ kr_init(int *fd)
}
int
-ktable_new(u_int rtableid, u_int rdomid, char *name, int fs, uint8_t fib_prio)
+ktable_new(u_int rtableid, u_int rdomid, char *name, int fs)
{
struct ktable **xkrt;
struct ktable *kt;
@@ -305,7 +307,7 @@ ktable_new(u_int rtableid, u_int rdomid,
ktable_get(kt->nhtableid)->nhrefcnt++;
/* ... and load it */
- if (fetchtable(kt, fib_prio) == -1)
+ if (fetchtable(kt) == -1)
return (-1);
if (protect_lo(kt) == -1)
return (-1);
@@ -318,7 +320,7 @@ ktable_new(u_int rtableid, u_int rdomid,
}
void
-ktable_free(u_int rtableid, uint8_t fib_prio)
+ktable_free(u_int rtableid)
{
struct ktable *kt, *nkt;
@@ -326,7 +328,7 @@ ktable_free(u_int rtableid, uint8_t fib_
return;
/* decouple from kernel, no new routes will be entered from here */
- kr_fib_decouple(kt->rtableid, fib_prio);
+ kr_fib_decouple(kt->rtableid);
/* first unhook from the nexthop table */
nkt = ktable_get(kt->nhtableid);
@@ -340,16 +342,16 @@ ktable_free(u_int rtableid, uint8_t fib_
* free so check that kt != nkt).
*/
if (kt != nkt && nkt->nhrefcnt <= 0)
- ktable_destroy(nkt, fib_prio);
+ ktable_destroy(nkt);
if (kt->nhrefcnt <= 0)
- ktable_destroy(kt, fib_prio);
+ ktable_destroy(kt);
}
void
-ktable_destroy(struct ktable *kt, uint8_t fib_prio)
+ktable_destroy(struct ktable *kt)
{
/* decouple just to be sure, does not hurt */
- kr_fib_decouple(kt->rtableid, fib_prio);
+ kr_fib_decouple(kt->rtableid);
log_debug("%s: freeing ktable %s rtableid %u", __func__, kt->descr,
kt->rtableid);
@@ -373,7 +375,7 @@ ktable_get(u_int rtableid)
}
int
-ktable_update(u_int rtableid, char *name, int flags, uint8_t fib_prio)
+ktable_update(u_int rtableid, char *name, int flags)
{
struct ktable *kt, *rkt;
u_int rdomid;
@@ -386,7 +388,7 @@ ktable_update(u_int rtableid, char *name
if (rkt == NULL) {
char buf[32];
snprintf(buf, sizeof(buf), "rdomain_%d", rdomid);
- if (ktable_new(rdomid, rdomid, buf, 0, fib_prio))
+ if (ktable_new(rdomid, rdomid, buf, 0))
return (-1);
} else {
/* there is no need for full fib synchronisation if
@@ -406,7 +408,7 @@ ktable_update(u_int rtableid, char *name
kt = ktable_get(rtableid);
if (kt == NULL) {
if (ktable_new(rtableid, rdomid, name,
- !(flags & F_RIB_NOFIBSYNC), fib_prio))
+ !(flags & F_RIB_NOFIBSYNC)))
return (-1);
} else {
/* fib sync has higher preference then no sync */
@@ -450,7 +452,7 @@ ktable_exists(u_int rtableid, u_int *rdo
}
int
-kr_change(u_int rtableid, struct kroute_full *kl, uint8_t fib_prio)
+kr_change(u_int rtableid, struct kroute_full *kl)
{
struct ktable *kt;
@@ -459,20 +461,20 @@ kr_change(u_int rtableid, struct kroute_
return (0);
switch (kl->prefix.aid) {
case AID_INET:
- return (kr4_change(kt, kl, fib_prio));
+ return (kr4_change(kt, kl));
case AID_INET6:
- return (kr6_change(kt, kl, fib_prio));
+ return (kr6_change(kt, kl));
case AID_VPN_IPv4:
- return (krVPN4_change(kt, kl, fib_prio));
+ return (krVPN4_change(kt, kl));
case AID_VPN_IPv6:
- return (krVPN6_change(kt, kl, fib_prio));
+ return (krVPN6_change(kt, kl));
}
log_warnx("%s: not handled AID", __func__);
return (-1);
}
int
-kr4_change(struct ktable *kt, struct kroute_full *kl, uint8_t fib_prio)
+kr4_change(struct ktable *kt, struct kroute_full *kl)
{
struct kroute_node *kr;
int action = RTM_ADD;
@@ -489,7 +491,7 @@ kr4_change(struct ktable *kt, struct kro
labelid = rtlabel_name2id(kl->label);
if ((kr = kroute_find(kt, kl->prefix.v4.s_addr, kl->prefixlen,
- fib_prio)) != NULL)
+ RTP_MINE)) != NULL)
action = RTM_CHANGE;
if (action == RTM_ADD) {
@@ -501,7 +503,7 @@ kr4_change(struct ktable *kt, struct kro
kr->r.prefixlen = kl->prefixlen;
kr->r.nexthop.s_addr = kl->nexthop.v4.s_addr;
kr->r.flags = kl->flags | F_BGPD_INSERTED;
- kr->r.priority = fib_prio;
+ kr->r.priority = RTP_MINE;
kr->r.labelid = labelid;
if (kroute_insert(kt, kr) == -1) {
@@ -522,14 +524,14 @@ kr4_change(struct ktable *kt, struct kro
kr->r.flags &= ~F_REJECT;
}
- if (send_rtmsg(kr_state.fd, action, kt, &kr->r, fib_prio) == -1)
+ if (send_rtmsg(kr_state.fd, action, kt, &kr->r) == -1)
return (-1);
return (0);
}
int
-kr6_change(struct ktable *kt, struct kroute_full *kl, uint8_t fib_prio)
+kr6_change(struct ktable *kt, struct kroute_full *kl)
{
struct kroute6_node *kr6;
struct in6_addr lo6 = IN6ADDR_LOOPBACK_INIT;
@@ -545,8 +547,8 @@ kr6_change(struct ktable *kt, struct kro
labelid = rtlabel_name2id(kl->label);
- if ((kr6 = kroute6_find(kt, &kl->prefix.v6, kl->prefixlen, fib_prio)) !=
- NULL)
+ if ((kr6 = kroute6_find(kt, &kl->prefix.v6, kl->prefixlen,
+ RTP_MINE)) != NULL)
action = RTM_CHANGE;
if (action == RTM_ADD) {
@@ -559,7 +561,7 @@ kr6_change(struct ktable *kt, struct kro
memcpy(&kr6->r.nexthop, &kl->nexthop.v6,
sizeof(struct in6_addr));
kr6->r.flags = kl->flags | F_BGPD_INSERTED;
- kr6->r.priority = fib_prio;
+ kr6->r.priority = RTP_MINE;
kr6->r.labelid = labelid;
if (kroute6_insert(kt, kr6) == -1) {
@@ -581,14 +583,14 @@ kr6_change(struct ktable *kt, struct kro
kr6->r.flags &= ~F_REJECT;
}
- if (send_rt6msg(kr_state.fd, action, kt, &kr6->r, fib_prio) == -1)
+ if (send_rt6msg(kr_state.fd, action, kt, &kr6->r) == -1)
return (-1);
return (0);
}
int
-krVPN4_change(struct ktable *kt, struct kroute_full *kl, uint8_t fib_prio)
+krVPN4_change(struct ktable *kt, struct kroute_full *kl)
{
struct kroute_node *kr;
int action = RTM_ADD;
@@ -618,7 +620,7 @@ krVPN4_change(struct ktable *kt, struct
kl->nexthop.v4.s_addr = htonl(INADDR_LOOPBACK);
if ((kr = kroute_find(kt, kl->prefix.v4.s_addr, kl->prefixlen,
- fib_prio)) != NULL)
+ RTP_MINE)) != NULL)
action = RTM_CHANGE;
if (action == RTM_ADD) {
@@ -630,7 +632,7 @@ krVPN4_change(struct ktable *kt, struct
kr->r.prefixlen = kl->prefixlen;
kr->r.nexthop.s_addr = kl->nexthop.v4.s_addr;
kr->r.flags = kl->flags | F_BGPD_INSERTED | F_MPLS;
- kr->r.priority = fib_prio;
+ kr->r.priority = RTP_MINE;
kr->r.labelid = labelid;
kr->r.mplslabel = mplslabel;
kr->r.ifindex = kl->ifindex;
@@ -655,14 +657,14 @@ krVPN4_change(struct ktable *kt, struct
kr->r.flags &= ~F_REJECT;
}
- if (send_rtmsg(kr_state.fd, action, kt, &kr->r, fib_prio) == -1)
+ if (send_rtmsg(kr_state.fd, action, kt, &kr->r) == -1)
return (-1);
return (0);
}
int
-krVPN6_change(struct ktable *kt, struct kroute_full *kl, uint8_t fib_prio)
+krVPN6_change(struct ktable *kt, struct kroute_full *kl)
{
struct kroute6_node *kr6;
struct in6_addr lo6 = IN6ADDR_LOOPBACK_INIT;
@@ -692,7 +694,7 @@ krVPN6_change(struct ktable *kt, struct
labelid = rtlabel_name2id(kl->label);
if ((kr6 = kroute6_find(kt, &kl->prefix.v6, kl->prefixlen,
- fib_prio)) != NULL)
+ RTP_MINE)) != NULL)
action = RTM_CHANGE;
if (action == RTM_ADD) {
@@ -705,7 +707,7 @@ krVPN6_change(struct ktable *kt, struct
memcpy(&kr6->r.nexthop, &kl->nexthop.v6,
sizeof(struct in6_addr));
kr6->r.flags = kl->flags | F_BGPD_INSERTED | F_MPLS;
- kr6->r.priority = fib_prio;
+ kr6->r.priority = RTP_MINE;
kr6->r.labelid = labelid;
kr6->r.mplslabel = mplslabel;
kr6->r.ifindex = kl->ifindex;
@@ -731,14 +733,14 @@ krVPN6_change(struct ktable *kt, struct
kr6->r.flags &= ~F_REJECT;
}
- if (send_rt6msg(kr_state.fd, action, kt, &kr6->r, fib_prio) == -1)
+ if (send_rt6msg(kr_state.fd, action, kt, &kr6->r) == -1)
return (-1);
return (0);
}
int
-kr_delete(u_int rtableid, struct kroute_full *kl, uint8_t fib_prio)
+kr_delete(u_int rtableid, struct kroute_full *kl)
{
struct ktable *kt;
@@ -748,13 +750,13 @@ kr_delete(u_int rtableid, struct kroute_
switch (kl->prefix.aid) {
case AID_INET:
- return (kr4_delete(kt, kl, fib_prio));
+ return (kr4_delete(kt, kl));
case AID_INET6:
- return (kr6_delete(kt, kl, fib_prio));
+ return (kr6_delete(kt, kl));
case AID_VPN_IPv4:
- return (krVPN4_delete(kt, kl, fib_prio));
+ return (krVPN4_delete(kt, kl));
case AID_VPN_IPv6:
- return (krVPN6_delete(kt, kl, fib_prio));
+ return (krVPN6_delete(kt, kl));
}
log_warnx("%s: not handled AID", __func__);
return (-1);
@@ -774,8 +776,7 @@ kr_flush(u_int rtableid)
RB_FOREACH_SAFE(kr, kroute_tree, &kt->krt, next)
if ((kr->r.flags & F_BGPD_INSERTED)) {
if (kt->fib_sync) /* coupled */
- send_rtmsg(kr_state.fd, RTM_DELETE, kt,
- &kr->r, kr->r.priority);
+ send_rtmsg(kr_state.fd, RTM_DELETE, kt, &kr->r);
rtlabel_unref(kr->r.labelid);
if (kroute_remove(kt, kr) == -1)
@@ -785,7 +786,7 @@ kr_flush(u_int rtableid)
if ((kr6->r.flags & F_BGPD_INSERTED)) {
if (kt->fib_sync) /* coupled */
send_rt6msg(kr_state.fd, RTM_DELETE, kt,
- &kr6->r, kr6->r.priority);
+ &kr6->r);
rtlabel_unref(kr6->r.labelid);
if (kroute6_remove(kt, kr6) == -1)
@@ -797,18 +798,18 @@ kr_flush(u_int rtableid)
}
int
-kr4_delete(struct ktable *kt, struct kroute_full *kl, uint8_t fib_prio)
+kr4_delete(struct ktable *kt, struct kroute_full *kl)
{
struct kroute_node *kr;
if ((kr = kroute_find(kt, kl->prefix.v4.s_addr, kl->prefixlen,
- fib_prio)) == NULL)
+ RTP_MINE)) == NULL)
return (0);
if (!(kr->r.flags & F_BGPD_INSERTED))
return (0);
- if (send_rtmsg(kr_state.fd, RTM_DELETE, kt, &kr->r, fib_prio) == -1)
+ if (send_rtmsg(kr_state.fd, RTM_DELETE, kt, &kr->r) == -1)
return (-1);
rtlabel_unref(kr->r.labelid);
@@ -820,18 +821,18 @@ kr4_delete(struct ktable *kt, struct kro
}
int
-kr6_delete(struct ktable *kt, struct kroute_full *kl, uint8_t fib_prio)
+kr6_delete(struct ktable *kt, struct kroute_full *kl)
{
struct kroute6_node *kr6;
- if ((kr6 = kroute6_find(kt, &kl->prefix.v6, kl->prefixlen, fib_prio)) ==
- NULL)
+ if ((kr6 = kroute6_find(kt, &kl->prefix.v6, kl->prefixlen,
+ RTP_MINE)) == NULL)
return (0);
if (!(kr6->r.flags & F_BGPD_INSERTED))
return (0);
- if (send_rt6msg(kr_state.fd, RTM_DELETE, kt, &kr6->r, fib_prio) == -1)
+ if (send_rt6msg(kr_state.fd, RTM_DELETE, kt, &kr6->r) == -1)
return (-1);
rtlabel_unref(kr6->r.labelid);
@@ -843,18 +844,18 @@ kr6_delete(struct ktable *kt, struct kro
}
int
-krVPN4_delete(struct ktable *kt, struct kroute_full *kl, uint8_t fib_prio)
+krVPN4_delete(struct ktable *kt, struct kroute_full *kl)
{
struct kroute_node *kr;
if ((kr = kroute_find(kt, kl->prefix.v4.s_addr, kl->prefixlen,
- fib_prio)) == NULL)
+ RTP_MINE)) == NULL)
return (0);
if (!(kr->r.flags & F_BGPD_INSERTED))
return (0);
- if (send_rtmsg(kr_state.fd, RTM_DELETE, kt, &kr->r, fib_prio) == -1)
+ if (send_rtmsg(kr_state.fd, RTM_DELETE, kt, &kr->r) == -1)
return (-1);
rtlabel_unref(kr->r.labelid);
@@ -866,18 +867,18 @@ krVPN4_delete(struct ktable *kt, struct
}
int
-krVPN6_delete(struct ktable *kt, struct kroute_full *kl, uint8_t fib_prio)
+krVPN6_delete(struct ktable *kt, struct kroute_full *kl)
{
struct kroute6_node *kr6;
if ((kr6 = kroute6_find(kt, &kl->prefix.v6, kl->prefixlen,
- fib_prio)) == NULL)
+ RTP_MINE)) == NULL)
return (0);
if (!(kr6->r.flags & F_BGPD_INSERTED))
return (0);
- if (send_rt6msg(kr_state.fd, RTM_DELETE, kt, &kr6->r, fib_prio) == -1)
+ if (send_rt6msg(kr_state.fd, RTM_DELETE, kt, &kr6->r) == -1)
return (-1);
rtlabel_unref(kr6->r.labelid);
@@ -889,18 +890,18 @@ krVPN6_delete(struct ktable *kt, struct
}
void
-kr_shutdown(uint8_t fib_prio, u_int rdomain)
+kr_shutdown(u_int rdomain)
{
u_int i;
for (i = krt_size; i > 0; i--)
- ktable_free(i - 1, fib_prio);
+ ktable_free(i - 1);
kif_clear(rdomain);
free(krt);
}
void
-kr_fib_couple(u_int rtableid, uint8_t fib_prio)
+kr_fib_couple(u_int rtableid)
{
struct ktable *kt;
struct kroute_node *kr;
@@ -916,27 +917,26 @@ kr_fib_couple(u_int rtableid, uint8_t fi
RB_FOREACH(kr, kroute_tree, &kt->krt)
if ((kr->r.flags & F_BGPD_INSERTED))
- send_rtmsg(kr_state.fd, RTM_ADD, kt, &kr->r, fib_prio);
+ send_rtmsg(kr_state.fd, RTM_ADD, kt, &kr->r);
RB_FOREACH(kr6, kroute6_tree, &kt->krt6)
if ((kr6->r.flags & F_BGPD_INSERTED))
- send_rt6msg(kr_state.fd, RTM_ADD, kt, &kr6->r,
- fib_prio);
+ send_rt6msg(kr_state.fd, RTM_ADD, kt, &kr6->r);
log_info("kernel routing table %u (%s) coupled", kt->rtableid,
kt->descr);
}
void
-kr_fib_couple_all(uint8_t fib_prio)
+kr_fib_couple_all(void)
{
u_int i;
for (i = krt_size; i > 0; i--)
- kr_fib_couple(i - 1, fib_prio);
+ kr_fib_couple(i - 1);
}
void
-kr_fib_decouple(u_int rtableid, uint8_t fib_prio)
+kr_fib_decouple(u_int rtableid)
{
struct ktable *kt;
struct kroute_node *kr;
@@ -950,54 +950,30 @@ kr_fib_decouple(u_int rtableid, uint8_t
RB_FOREACH(kr, kroute_tree, &kt->krt)
if ((kr->r.flags & F_BGPD_INSERTED))
- send_rtmsg(kr_state.fd, RTM_DELETE, kt, &kr->r,
- fib_prio);
+ send_rtmsg(kr_state.fd, RTM_DELETE, kt, &kr->r);
RB_FOREACH(kr6, kroute6_tree, &kt->krt6)
if ((kr6->r.flags & F_BGPD_INSERTED))
- send_rt6msg(kr_state.fd, RTM_DELETE, kt, &kr6->r,
- fib_prio);
+ send_rt6msg(kr_state.fd, RTM_DELETE, kt, &kr6->r);
kt->fib_sync = 0;
log_info("kernel routing table %u (%s) decoupled", kt->rtableid,
- kt->descr);
-}
+ kt->descr);
+ }
void
-kr_fib_decouple_all(uint8_t fib_prio)
+kr_fib_decouple_all(void)
{
u_int i;
for (i = krt_size; i > 0; i--)
- kr_fib_decouple(i - 1, fib_prio);
+ kr_fib_decouple(i - 1);
}
void
-kr_fib_update_prio(u_int rtableid, uint8_t fib_prio)
+kr_fib_prio_set(u_int8_t prio)
{
- struct ktable *kt;
- struct kroute_node *kr;
- struct kroute6_node *kr6;
-
- if ((kt = ktable_get(rtableid)) == NULL) /* table does not exist */
- return;
-
- RB_FOREACH(kr, kroute_tree, &kt->krt)
- if ((kr->r.flags & F_BGPD_INSERTED))
- kr->r.priority = fib_prio;
-
- RB_FOREACH(kr6, kroute6_tree, &kt->krt6)
- if ((kr6->r.flags & F_BGPD_INSERTED))
- kr6->r.priority = fib_prio;
-}
-
-void
-kr_fib_update_prio_all(uint8_t fib_prio)
-{
- u_int i;
-
- for (i = krt_size; i > 0; i--)
- kr_fib_update_prio(i - 1, fib_prio);
+ kr_state.fib_prio = prio;
}
int
@@ -1546,7 +1522,7 @@ ktable_preload(void)
}
void
-ktable_postload(uint8_t fib_prio)
+ktable_postload(void)
{
struct ktable *kt;
struct network *n, *xn;
@@ -1556,7 +1532,7 @@ ktable_postload(uint8_t fib_prio)
if ((kt = ktable_get(i - 1)) == NULL)
continue;
if (kt->state == RECONF_DELETE) {
- ktable_free(i - 1, fib_prio);
+ ktable_free(i - 1);
continue;
} else if (kt->state == RECONF_REINIT)
kt->fib_sync = kt->fib_conf;
@@ -2923,8 +2899,7 @@ get_mpe_config(const char *name, u_int *
*/
int
-send_rtmsg(int fd, int action, struct ktable *kt, struct kroute *kroute,
- uint8_t fib_prio)
+send_rtmsg(int fd, int action, struct ktable *kt, struct kroute *kroute)
{
struct iovec iov[7];
struct rt_msghdr hdr;
@@ -2947,7 +2922,7 @@ send_rtmsg(int fd, int action, struct kt
hdr.rtm_version = RTM_VERSION;
hdr.rtm_type = action;
hdr.rtm_tableid = kt->rtableid;
- hdr.rtm_priority = fib_prio;
+ hdr.rtm_priority = kr_state.fib_prio;
if (kroute->flags & F_BLACKHOLE)
hdr.rtm_flags |= RTF_BLACKHOLE;
if (kroute->flags & F_REJECT)
@@ -3060,8 +3035,7 @@ retry:
}
int
-send_rt6msg(int fd, int action, struct ktable *kt, struct kroute6 *kroute,
- uint8_t fib_prio)
+send_rt6msg(int fd, int action, struct ktable *kt, struct kroute6 *kroute)
{
struct iovec iov[7];
struct rt_msghdr hdr;
@@ -3085,7 +3059,7 @@ send_rt6msg(int fd, int action, struct k
hdr.rtm_version = RTM_VERSION;
hdr.rtm_type = action;
hdr.rtm_tableid = kt->rtableid;
- hdr.rtm_priority = fib_prio;
+ hdr.rtm_priority = kr_state.fib_prio;
if (kroute->flags & F_BLACKHOLE)
hdr.rtm_flags |= RTF_BLACKHOLE;
if (kroute->flags & F_REJECT)
@@ -3202,7 +3176,7 @@ retry:
}
int
-fetchtable(struct ktable *kt, uint8_t fib_prio)
+fetchtable(struct ktable *kt)
{
size_t len;
int mib[7];
@@ -3384,16 +3358,15 @@ fetchtable(struct ktable *kt, uint8_t fi
}
if (sa->sa_family == AF_INET) {
- if (rtm->rtm_priority == fib_prio) {
- send_rtmsg(kr_state.fd, RTM_DELETE, kt, &kr->r,
- fib_prio);
+ if (rtm->rtm_priority == kr_state.fib_prio) {
+ send_rtmsg(kr_state.fd, RTM_DELETE, kt, &kr->r);
free(kr);
} else
kroute_insert(kt, kr);
} else if (sa->sa_family == AF_INET6) {
- if (rtm->rtm_priority == fib_prio) {
+ if (rtm->rtm_priority == kr_state.fib_prio) {
send_rt6msg(kr_state.fd, RTM_DELETE, kt,
- &kr6->r, fib_prio);
+ &kr6->r);
free(kr6);
} else
kroute6_insert(kt, kr6);