summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sysdep/linux/netlink.c3
-rw-r--r--sysdep/unix/krt.c15
2 files changed, 11 insertions, 7 deletions
diff --git a/sysdep/linux/netlink.c b/sysdep/linux/netlink.c
index d802d3e0..656202ac 100644
--- a/sysdep/linux/netlink.c
+++ b/sysdep/linux/netlink.c
@@ -2042,11 +2042,10 @@ nl_parse_route(struct nl_parse_state *s, struct nlmsghdr *h)
s->net = lp_alloc(s->pool, net->length);
net_copy(s->net, net);
- s->attrs = ra;
-
ea_set_attr_data(&ra, &ea_gen_nexthop, 0,
nhad.ad.data, nhad.ad.length);
+ s->attrs = ra;
s->proto = p;
s->new = new;
s->krt_src = krt_src;
diff --git a/sysdep/unix/krt.c b/sysdep/unix/krt.c
index a37d3186..4539feee 100644
--- a/sysdep/unix/krt.c
+++ b/sysdep/unix/krt.c
@@ -319,14 +319,21 @@ krt_learn_announce_delete(struct krt_proto *p, net_addr *n)
rte_update(p->p.main_channel, n, NULL, p->p.main_source);
}
+static struct rte_storage *
+krt_store_async(struct krt_proto *p, net *n, rte *e)
+{
+ ea_set_attr_u32(&e->attrs, &ea_gen_preference, 0, p->p.main_channel->preference);
+ e->src = p->p.main_source;
+ return rte_store(e, n, p->krt_table);
+}
+
/* Called when alien route is discovered during scan */
static void
krt_learn_scan(struct krt_proto *p, rte *e)
{
net *n = net_get(p->krt_table, e->net);
struct rte_storage *m, **mm;
-
- struct rte_storage *ee = rte_store(e, n, p->krt_table);
+ struct rte_storage *ee = krt_store_async(p, n, e);
for(mm = &n->routes; m = *mm; mm = &m->next)
if (krt_same_key(&m->rte, e))
@@ -437,9 +444,7 @@ krt_learn_async(struct krt_proto *p, rte *e, int new)
{
net *n = net_get(p->krt_table, e->net);
struct rte_storage *g, **gg, *best, **bestp, *old_best;
-
- ea_set_attr_u32(&e->attrs, &ea_gen_preference, 0, p->p.main_channel->preference);
- struct rte_storage *ee = rte_store(e, n, p->krt_table);
+ struct rte_storage *ee = krt_store_async(p, n, e);
old_best = n->routes;
for(gg=&n->routes; g = *gg; gg = &g->next)