]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Direct: Fixes behavior for the same routes on different interfaces
authorOndrej Zajicek <santiago@crfreenet.org>
Sat, 18 Jul 2015 11:05:05 +0000 (13:05 +0200)
committerOndrej Zajicek <santiago@crfreenet.org>
Sat, 18 Jul 2015 11:05:05 +0000 (13:05 +0200)
Thanks to Andrew (seti.kr.ua) for the bug report.

nest/rt-dev.c

index 87ffc5ecb3a0674ed78217f069cc9714f4fb2196..f6bc1432b7da24dbf00adac5334860811d02bb5c 100644 (file)
@@ -51,7 +51,10 @@ dev_ifa_notify(struct proto *p, unsigned c, struct ifa *ad)
          DBG("dev_if_notify: device shutdown: prefix not found\n");
          return;
        }
-      rte_update(p, n, NULL);
+
+      /* Use iface ID as local source ID */
+      struct rte_src *src = rt_get_source(p, ad->iface->index);
+      rte_update2(p->main_ahook, n, NULL, src);
     }
   else if (c & IF_CHANGE_UP)
     {
@@ -61,8 +64,11 @@ dev_ifa_notify(struct proto *p, unsigned c, struct ifa *ad)
 
       DBG("dev_if_notify: %s:%I going up\n", ad->iface->name, ad->ip);
 
+      /* Use iface ID as local source ID */
+      struct rte_src *src = rt_get_source(p, ad->iface->index);
+
       rta a0 = {
-       .src = p->main_source,
+       .src = src,
        .source = RTS_DEVICE,
        .scope = SCOPE_UNIVERSE,
        .cast = RTC_UNICAST,
@@ -75,7 +81,7 @@ dev_ifa_notify(struct proto *p, unsigned c, struct ifa *ad)
       e = rte_get_temp(a);
       e->net = n;
       e->pflags = 0;
-      rte_update(p, n, e);
+      rte_update2(p->main_ahook, n, e, src);
     }
 }