On Tue, Jun 16, 2015 at 03:20:25PM +0300, Andrew wrote:
> >
> >Thanks for the example, it is very descriptive. The problem here is that
> >'direct' protocol is a stateless translation of address announcements to
> >route announcements, but routing tables do not consider interface as part
> >of route key, therefore only one route for a prefix is remembered and
> >I will write a patch for this.
>
> Yes, it'll be great.

You could try attached patch

-- 
Elen sila lumenn' omentielvo

Ondrej 'Santiago' Zajicek (email: santi...@crfreenet.org)
OpenPGP encrypted e-mails preferred (KeyID 0x11DEADC3, wwwkeys.pgp.net)
"To err is human -- to blame it on a computer is even more so."
diff --git a/nest/rt-dev.c b/nest/rt-dev.c
index 87ffc5e..f6bc143 100644
--- a/nest/rt-dev.c
+++ b/nest/rt-dev.c
@@ -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);
     }
 }
 

Attachment: signature.asc
Description: Digital signature

Reply via email to