diff options
Diffstat (limited to 'sysdep')
-rw-r--r-- | sysdep/linux/netlink.c | 3 | ||||
-rw-r--r-- | sysdep/unix/krt.c | 15 |
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) |