diff options
author | Maria Matejka <mq@ucw.cz> | 2023-12-08 08:30:30 +0100 |
---|---|---|
committer | Maria Matejka <mq@ucw.cz> | 2023-12-08 08:30:30 +0100 |
commit | 4aac1b259fa94b99427f837564876baa2183ccb1 (patch) | |
tree | a81fa905eb8bd6beec1b9e057b2199b0865b46dc /nest | |
parent | bcf2327425d4dd96f381b87501cccf943bed606e (diff) | |
parent | 54ddf90f6370f06efc71c3ffd6e02d031a86866f (diff) |
Merge commit '54ddf90f'
Diffstat (limited to 'nest')
-rw-r--r-- | nest/config.Y | 4 | ||||
-rw-r--r-- | nest/route.h | 2 | ||||
-rw-r--r-- | nest/rt-table.c | 203 |
3 files changed, 54 insertions, 155 deletions
diff --git a/nest/config.Y b/nest/config.Y index 6832a57a..63888a04 100644 --- a/nest/config.Y +++ b/nest/config.Y @@ -114,7 +114,7 @@ proto_postconfig(void) CF_DECLS CF_KEYWORDS(ROUTER, ID, HOSTNAME, PROTOCOL, TEMPLATE, PREFERENCE, DISABLED, DEBUG, ALL, OFF, DIRECT) -CF_KEYWORDS(INTERFACE, IMPORT, EXPORT, FILTER, NONE, VRF, DEFAULT, TABLE, STATES, ROUTES, FILTERS) +CF_KEYWORDS(INTERFACE, IMPORT, EXPORT, FILTER, NONE, VRF, DEFAULT, TABLE, TABLES, STATES, ROUTES, FILTERS) CF_KEYWORDS(IPV4, IPV6, VPN4, VPN6, ROA4, ROA6, FLOW4, FLOW6, SADR, MPLS) CF_KEYWORDS(RECEIVE, LIMIT, ACTION, WARN, BLOCK, RESTART, DISABLE, KEEP, FILTERED, RPKI) CF_KEYWORDS(PASSWORD, KEY, FROM, PASSIVE, TO, ID, EVENTS, PACKETS, PROTOCOLS, CHANNELS, INTERFACES) @@ -230,6 +230,7 @@ table_sorted: table_opt: SORTED bool { this_table->sorted = $2; } + | DEBUG debug_mask { this_table->debug = $2; } | TRIE bool { if (!net_val_match(this_table->addr_type, NB_IP | NB_VPN | NB_ROA | NB_IP6_SADR)) cf_error("Trie option not supported for %s table", net_label[this_table->addr_type]); @@ -380,6 +381,7 @@ conf: debug_default ; debug_default: DEBUG PROTOCOLS debug_mask { new_config->proto_default_debug = $3; } | DEBUG CHANNELS debug_mask { new_config->channel_default_debug = $3; } + | DEBUG TABLES debug_mask { new_config->table_default_debug = $3; } | DEBUG COMMANDS expr { new_config->cli_debug = $3; } ; diff --git a/nest/route.h b/nest/route.h index 085c45b9..3e1340fa 100644 --- a/nest/route.h +++ b/nest/route.h @@ -150,6 +150,7 @@ struct rtable_config { uint addr_type; /* Type of address data stored in table (NET_*) */ uint gc_threshold; /* Maximum number of operations before GC is run */ uint gc_period; /* Approximate time between two consecutive GC runs */ + u32 debug; /* Debugging flags (D_*) */ byte sorted; /* Routes of network are sorted according to rte_better() */ byte internal; /* Internal table of a protocol */ byte trie_used; /* Rtable has attached trie */ @@ -166,6 +167,7 @@ typedef struct rtable { char *name; /* Name of this table */ list channels; /* List of attached channels (struct channel) */ uint addr_type; /* Type of address data stored in table (NET_*) */ + u32 debug; /* Debugging flags (D_*) */ int pipe_busy; /* Pipe loop detection */ int use_count; /* Number of protocols using this table */ u32 rt_count; /* Number of routes in the table */ diff --git a/nest/rt-table.c b/nest/rt-table.c index 0ac18cf5..2ca2ff34 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); - - default: - return NULL; - } + 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); + + 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; + } } @@ -1748,6 +1634,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 +1658,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) @@ -2148,6 +2040,7 @@ rt_setup(pool *pp, struct rtable_config *cf) t->name = cf->name; t->config = cf; t->addr_type = cf->addr_type; + t->debug = cf->debug; fib_init(&t->fib, p, t->addr_type, sizeof(net), OFFSETOF(net, n), 0, NULL); @@ -2860,6 +2753,7 @@ rt_new_table(struct symbol *s, uint addr_type) c->gc_period = (uint) -1; /* set in rt_postconfig() */ c->min_settle_time = 1 S; c->max_settle_time = 20 S; + c->debug = new_config->table_default_debug; add_tail(&new_config->tables, &c->n); @@ -2917,6 +2811,7 @@ rt_reconfigure(rtable *tab, struct rtable_config *new, struct rtable_config *old new->table = tab; tab->name = new->name; tab->config = new; + tab->debug = new->debug; return 1; } |