]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
KRT: Fix route learning
authorMaria Matejka <mq@ucw.cz>
Tue, 27 Sep 2022 10:17:05 +0000 (12:17 +0200)
committerMaria Matejka <mq@ucw.cz>
Tue, 27 Sep 2022 10:17:05 +0000 (12:17 +0200)
This is a reimplementation of commit 0f2be469f897b6d9f925563bbf522438c83522ea
by Alexander Zubkov. In the master branch, changes in commit eb937358
broke setting of channel preference for alien routes learned during
scan. The preference was set only for async routes.

The original solution is extended here to accomodate for v3 specifics.

sysdep/unix/krt.c

index 0a746631c1fadeab4c69a94649e7882df8e965ad..360a288812e6b1d9f018170fc6a90159174f4047 100644 (file)
@@ -313,14 +313,22 @@ 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)
+{
+  ASSERT(!e->attrs->cached);
+  e->attrs->pref = 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))
@@ -431,11 +439,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;
-
-  ASSERT(!e->attrs->cached);
-  e->attrs->pref = 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)