From 3b48dc9bce12b00aa2a212495b19c925e0fda249 Mon Sep 17 00:00:00 2001 From: Maria Matejka Date: Thu, 7 Dec 2023 13:54:41 +0100 Subject: [PATCH 1/3] Table: Adding route refresh begin and end debug messages --- nest/rt-table.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/nest/rt-table.c b/nest/rt-table.c index e497524f..e8676822 100644 --- a/nest/rt-table.c +++ b/nest/rt-table.c @@ -1748,6 +1748,9 @@ rt_examine(rtable *t, net_addr *a, struct channel *c, const struct filter *filte void rt_refresh_begin(rtable *t, struct channel *c) { + if (c->debug & D_EVENTS) + log(L_TRACE "%s.%s: Route refresh begin", c->proto->name, c->name); + FIB_WALK(&t->fib, net, n) { rte *e; @@ -1769,6 +1772,9 @@ rt_refresh_begin(rtable *t, struct channel *c) void rt_refresh_end(rtable *t, struct channel *c) { + if (c->debug & D_EVENTS) + log(L_TRACE "%s.%s: Route refresh end", c->proto->name, c->name); + int prune = 0; FIB_WALK(&t->fib, net, n) From 9a91ea52db32ec2fda830afd1c88f0f83e6c0df4 Mon Sep 17 00:00:00 2001 From: Maria Matejka Date: Thu, 7 Dec 2023 14:10:11 +0100 Subject: [PATCH 2/3] Refactoring of net_route --- nest/rt-table.c | 192 ++++++++++-------------------------------------- 1 file changed, 39 insertions(+), 153 deletions(-) diff --git a/nest/rt-table.c b/nest/rt-table.c index e8676822..985b68e1 100644 --- a/nest/rt-table.c +++ b/nest/rt-table.c @@ -145,66 +145,6 @@ net_init_with_trie(struct fib *f, void *N) trie_add_prefix(tab->trie_new, n->n.addr, n->n.addr->pxlen, n->n.addr->pxlen); } -static inline net * -net_route_ip4_trie(rtable *t, const net_addr_ip4 *n0) -{ - TRIE_WALK_TO_ROOT_IP4(t->trie, n0, n) - { - net *r; - if (r = net_find_valid(t, (net_addr *) &n)) - return r; - } - TRIE_WALK_TO_ROOT_END; - - return NULL; -} - -static inline net * -net_route_vpn4_trie(rtable *t, const net_addr_vpn4 *n0) -{ - TRIE_WALK_TO_ROOT_IP4(t->trie, (const net_addr_ip4 *) n0, px) - { - net_addr_vpn4 n = NET_ADDR_VPN4(px.prefix, px.pxlen, n0->rd); - - net *r; - if (r = net_find_valid(t, (net_addr *) &n)) - return r; - } - TRIE_WALK_TO_ROOT_END; - - return NULL; -} - -static inline net * -net_route_ip6_trie(rtable *t, const net_addr_ip6 *n0) -{ - TRIE_WALK_TO_ROOT_IP6(t->trie, n0, n) - { - net *r; - if (r = net_find_valid(t, (net_addr *) &n)) - return r; - } - TRIE_WALK_TO_ROOT_END; - - return NULL; -} - -static inline net * -net_route_vpn6_trie(rtable *t, const net_addr_vpn6 *n0) -{ - TRIE_WALK_TO_ROOT_IP6(t->trie, (const net_addr_ip6 *) n0, px) - { - net_addr_vpn6 n = NET_ADDR_VPN6(px.prefix, px.pxlen, n0->rd); - - net *r; - if (r = net_find_valid(t, (net_addr *) &n)) - return r; - } - TRIE_WALK_TO_ROOT_END; - - return NULL; -} - static inline void * net_route_ip6_sadr_trie(rtable *t, const net_addr_ip6_sadr *n0) { @@ -238,69 +178,6 @@ net_route_ip6_sadr_trie(rtable *t, const net_addr_ip6_sadr *n0) return NULL; } -static inline net * -net_route_ip4_fib(rtable *t, const net_addr_ip4 *n0) -{ - net_addr_ip4 n; - net_copy_ip4(&n, n0); - - net *r; - while (r = net_find_valid(t, (net_addr *) &n), (!r) && (n.pxlen > 0)) - { - n.pxlen--; - ip4_clrbit(&n.prefix, n.pxlen); - } - - return r; -} - -static inline net * -net_route_vpn4_fib(rtable *t, const net_addr_vpn4 *n0) -{ - net_addr_vpn4 n; - net_copy_vpn4(&n, n0); - - net *r; - while (r = net_find_valid(t, (net_addr *) &n), (!r) && (n.pxlen > 0)) - { - n.pxlen--; - ip4_clrbit(&n.prefix, n.pxlen); - } - - return r; -} - -static inline net * -net_route_ip6_fib(rtable *t, const net_addr_ip6 *n0) -{ - net_addr_ip6 n; - net_copy_ip6(&n, n0); - - net *r; - while (r = net_find_valid(t, (net_addr *) &n), (!r) && (n.pxlen > 0)) - { - n.pxlen--; - ip6_clrbit(&n.prefix, n.pxlen); - } - - return r; -} - -static inline net * -net_route_vpn6_fib(rtable *t, const net_addr_vpn6 *n0) -{ - net_addr_vpn6 n; - net_copy_vpn6(&n, n0); - - net *r; - while (r = net_find_valid(t, (net_addr *) &n), (!r) && (n.pxlen > 0)) - { - n.pxlen--; - ip6_clrbit(&n.prefix, n.pxlen); - } - - return r; -} static inline void * net_route_ip6_sadr_fib(rtable *t, const net_addr_ip6_sadr *n0) @@ -346,42 +223,51 @@ net * net_route(rtable *tab, const net_addr *n) { ASSERT(tab->addr_type == n->type); + net_addr_union *nu = SKIP_BACK(net_addr_union, n, n); - switch (n->type) - { - case NET_IP4: - if (tab->trie) - return net_route_ip4_trie(tab, (net_addr_ip4 *) n); - else - return net_route_ip4_fib (tab, (net_addr_ip4 *) n); +#define TW(ipv, what) \ + TRIE_WALK_TO_ROOT_IP##ipv(tab->trie, &(nu->ip##ipv), var) \ + { what(ipv, var); } \ + TRIE_WALK_TO_ROOT_END; return NULL; - case NET_VPN4: - if (tab->trie) - return net_route_vpn4_trie(tab, (net_addr_vpn4 *) n); - else - return net_route_vpn4_fib (tab, (net_addr_vpn4 *) n); +#define FW(ipv, what) do { \ + net_addr_union nuc; net_copy(&nuc.n, n); \ + while (1) { \ + what(ipv, nuc.ip##ipv); if (!nuc.n.pxlen) return NULL; \ + nuc.n.pxlen--; ip##ipv##_clrbit(&nuc.ip##ipv.prefix, nuc.ip##ipv.pxlen); \ + } \ +} while(0); return NULL; - case NET_IP6: - if (tab->trie) - return net_route_ip6_trie(tab, (net_addr_ip6 *) n); - else - return net_route_ip6_fib (tab, (net_addr_ip6 *) n); +#define FVR_IP(ipv, var) \ + net *r; if (r = net_find_valid(tab, (net_addr *) &var)) return r; - case NET_VPN6: - if (tab->trie) - return net_route_vpn6_trie(tab, (net_addr_vpn6 *) n); - else - return net_route_vpn6_fib (tab, (net_addr_vpn6 *) n); +#define FVR_VPN(ipv, var) \ + net_addr_vpn##ipv _var0 = NET_ADDR_VPN##ipv(var.prefix, var.pxlen, nu->vpn##ipv.rd); FVR_IP(ipv, _var0); - case NET_IP6_SADR: - if (tab->trie) - return net_route_ip6_sadr_trie(tab, (net_addr_ip6_sadr *) n); - else - return net_route_ip6_sadr_fib (tab, (net_addr_ip6_sadr *) n); + if (tab->trie) + switch (n->type) { + case NET_IP4: TW(4, FVR_IP); + case NET_VPN4: TW(4, FVR_VPN); + case NET_IP6: TW(6, FVR_IP); + case NET_VPN6: TW(6, FVR_VPN); - default: - return NULL; - } + case NET_IP6_SADR: + return net_route_ip6_sadr_trie(tab, (net_addr_ip6_sadr *) n); + default: + return NULL; + } + else + switch (n->type) { + case NET_IP4: FW(4, FVR_IP); + case NET_VPN4: FW(4, FVR_VPN); + case NET_IP6: FW(6, FVR_IP); + case NET_VPN6: FW(6, FVR_VPN); + + case NET_IP6_SADR: + return net_route_ip6_sadr_fib (tab, (net_addr_ip6_sadr *) n); + default: + return NULL; + } } From 54ddf90f6370f06efc71c3ffd6e02d031a86866f Mon Sep 17 00:00:00 2001 From: Maria Matejka Date: Thu, 7 Dec 2023 14:38:05 +0100 Subject: [PATCH 3/3] Conf: debug tables For now just a dummy config but it is needed for forward compatibility with v3. --- conf/conf.h | 1 + doc/bird.sgml | 11 +++++++++++ nest/config.Y | 4 +++- nest/route.h | 2 ++ nest/rt-table.c | 3 +++ 5 files changed, 20 insertions(+), 1 deletion(-) diff --git a/conf/conf.h b/conf/conf.h index 8fd6713e..c0a897fc 100644 --- a/conf/conf.h +++ b/conf/conf.h @@ -35,6 +35,7 @@ struct config { u32 proto_default_debug; /* Default protocol debug mask */ u32 proto_default_mrtdump; /* Default protocol mrtdump mask */ u32 channel_default_debug; /* Default channel debug mask */ + u32 table_default_debug; /* Default table debug mask */ struct timeformat tf_route; /* Time format for 'show route' */ struct timeformat tf_proto; /* Time format for 'show protocol' */ struct timeformat tf_log; /* Time format for the logfile */ diff --git a/doc/bird.sgml b/doc/bird.sgml index 09da89df..394ca86c 100644 --- a/doc/bird.sgml +++ b/doc/bird.sgml @@ -505,6 +505,11 @@ include "tablename.conf";; See in the channel section. Default: off. +