KRT: Fix IPv6 route learn
Internal table used for route learn was created with non-matching net type for IPv6 kernel proto. Thanks to Toke Hoiland-Jorgensen for the bugreport
This commit is contained in:
parent
85ad5855a0
commit
28b3b55122
4 changed files with 20 additions and 16 deletions
|
@ -22,13 +22,14 @@ protocol direct {
|
||||||
|
|
||||||
# Feed routes to kernel FIB
|
# Feed routes to kernel FIB
|
||||||
protocol kernel {
|
protocol kernel {
|
||||||
ipv4 { export all; };
|
ipv4 { export all; import all; };
|
||||||
# learn; # Learn all routes from the kernel
|
learn; # Learn all routes from the kernel
|
||||||
# scan time 10; # Scan kernel tables every 10 seconds
|
# scan time 10; # Scan kernel tables every 10 seconds
|
||||||
}
|
}
|
||||||
|
|
||||||
protocol kernel {
|
protocol kernel {
|
||||||
ipv6;
|
ipv6 { import all; };
|
||||||
|
learn;
|
||||||
}
|
}
|
||||||
|
|
||||||
# Static route feed
|
# Static route feed
|
||||||
|
|
|
@ -282,7 +282,7 @@ void rt_preconfig(struct config *);
|
||||||
void rt_commit(struct config *new, struct config *old);
|
void rt_commit(struct config *new, struct config *old);
|
||||||
void rt_lock_table(rtable *);
|
void rt_lock_table(rtable *);
|
||||||
void rt_unlock_table(rtable *);
|
void rt_unlock_table(rtable *);
|
||||||
void rt_setup(pool *, rtable *, char *, struct rtable_config *);
|
void rt_setup(pool *, rtable *, struct rtable_config *);
|
||||||
static inline net *net_find(rtable *tab, const net_addr *addr) { return (net *) fib_find(&tab->fib, addr); }
|
static inline net *net_find(rtable *tab, const net_addr *addr) { return (net *) fib_find(&tab->fib, addr); }
|
||||||
static inline net *net_find_valid(rtable *tab, const net_addr *addr)
|
static inline net *net_find_valid(rtable *tab, const net_addr *addr)
|
||||||
{ net *n = net_find(tab, addr); return (n && rte_is_valid(n->routes)) ? n : NULL; }
|
{ net *n = net_find(tab, addr); return (n && rte_is_valid(n->routes)) ? n : NULL; }
|
||||||
|
|
|
@ -1599,22 +1599,19 @@ rt_event(void *ptr)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
rt_setup(pool *p, rtable *t, char *name, struct rtable_config *cf)
|
rt_setup(pool *p, rtable *t, struct rtable_config *cf)
|
||||||
{
|
{
|
||||||
bzero(t, sizeof(*t));
|
bzero(t, sizeof(*t));
|
||||||
t->name = name;
|
t->name = cf->name;
|
||||||
t->config = cf;
|
t->config = cf;
|
||||||
t->addr_type = cf ? cf->addr_type : NET_IP4;
|
t->addr_type = cf->addr_type;
|
||||||
fib_init(&t->fib, p, t->addr_type, sizeof(net), OFFSETOF(net, n), 0, NULL);
|
fib_init(&t->fib, p, t->addr_type, sizeof(net), OFFSETOF(net, n), 0, NULL);
|
||||||
init_list(&t->channels);
|
init_list(&t->channels);
|
||||||
|
|
||||||
if (cf)
|
t->rt_event = ev_new(p);
|
||||||
{
|
t->rt_event->hook = rt_event;
|
||||||
t->rt_event = ev_new(p);
|
t->rt_event->data = t;
|
||||||
t->rt_event->hook = rt_event;
|
t->gc_time = current_time();
|
||||||
t->rt_event->data = t;
|
|
||||||
t->gc_time = current_time();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -2090,7 +2087,7 @@ rt_commit(struct config *new, struct config *old)
|
||||||
{
|
{
|
||||||
rtable *t = mb_alloc(rt_table_pool, sizeof(struct rtable));
|
rtable *t = mb_alloc(rt_table_pool, sizeof(struct rtable));
|
||||||
DBG("\t%s: created\n", r->name);
|
DBG("\t%s: created\n", r->name);
|
||||||
rt_setup(rt_table_pool, t, r->name, r);
|
rt_setup(rt_table_pool, t, r);
|
||||||
add_tail(&routing_tables, &t->n);
|
add_tail(&routing_tables, &t->n);
|
||||||
r->table = t;
|
r->table = t;
|
||||||
}
|
}
|
||||||
|
|
|
@ -506,7 +506,13 @@ static void
|
||||||
krt_learn_init(struct krt_proto *p)
|
krt_learn_init(struct krt_proto *p)
|
||||||
{
|
{
|
||||||
if (KRT_CF->learn)
|
if (KRT_CF->learn)
|
||||||
rt_setup(p->p.pool, &p->krt_table, "Inherited", NULL);
|
{
|
||||||
|
struct rtable_config *cf = mb_allocz(p->p.pool, sizeof(struct rtable_config));
|
||||||
|
cf->name = "Inherited";
|
||||||
|
cf->addr_type = p->p.net_type;
|
||||||
|
|
||||||
|
rt_setup(p->p.pool, &p->krt_table, cf);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
Loading…
Reference in a new issue