Commit 28b3b551 authored by Ondrej Zajicek (work)'s avatar Ondrej Zajicek (work)
Browse files

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
parent 85ad5855
Loading
Loading
Loading
Loading
+4 −3
Original line number Diff line number Diff line
@@ -22,13 +22,14 @@ protocol direct {

# Feed routes to kernel FIB
protocol kernel {
	ipv4 { export all; };
#	learn;			# Learn all routes from the kernel
	ipv4 { export all; import all; };
	learn;			# Learn all routes from the kernel
#	scan time 10;		# Scan kernel tables every 10 seconds
}

protocol kernel {
	ipv6;
	ipv6 { import all; };
	learn;
}

# Static route feed
+1 −1
Original line number Diff line number Diff line
@@ -282,7 +282,7 @@ void rt_preconfig(struct config *);
void rt_commit(struct config *new, struct config *old);
void rt_lock_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_valid(rtable *tab, const net_addr *addr)
{ net *n = net_find(tab, addr); return (n && rte_is_valid(n->routes)) ? n : NULL; }
+8 −11
Original line number Diff line number Diff line
@@ -1599,23 +1599,20 @@ rt_event(void *ptr)
}

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));
  t->name = name;
  t->name = cf->name;
  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);
  init_list(&t->channels);

  if (cf)
    {
  t->rt_event = ev_new(p);
  t->rt_event->hook = rt_event;
  t->rt_event->data = t;
  t->gc_time = current_time();
}
}

/**
 * rt_init - initialize routing tables
@@ -2090,7 +2087,7 @@ rt_commit(struct config *new, struct config *old)
      {
	rtable *t = mb_alloc(rt_table_pool, sizeof(struct rtable));
	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);
	r->table = t;
      }
+7 −1
Original line number Diff line number Diff line
@@ -506,7 +506,13 @@ static void
krt_learn_init(struct krt_proto *p)
{
  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