summaryrefslogtreecommitdiffstats
path: root/zebra/interface.c
diff options
context:
space:
mode:
authorStephen Hemminger <stephen.hemminger@vyatta.com>2008-04-29 11:08:15 -0700
committerStephen Hemminger <stephen.hemminger@vyatta.com>2008-04-29 11:08:15 -0700
commitd3ea74a99a3d2bcc66e45bef716ba0a66e24020e (patch)
treea74c218bc870d06ad27fc3d112e57c567e72b59c /zebra/interface.c
parentccbba60205d0cf64fe12611e057d4581d40e4e22 (diff)
downloadquagga-d3ea74a99a3d2bcc66e45bef716ba0a66e24020e.tar.bz2
quagga-d3ea74a99a3d2bcc66e45bef716ba0a66e24020e.tar.xz
Two passes on update (ipv4 and ipv6)
When interface comes down, need two passes over the rib to correctly process rib updates. If interface has both ipv6 and ipv4 routes and comes down, need to do it as a two step process. Not sure exactly why, but suspect it has to do with the the work queue and the flagging of activity to the head of the list.
Diffstat (limited to 'zebra/interface.c')
-rw-r--r--zebra/interface.c16
1 files changed, 13 insertions, 3 deletions
diff --git a/zebra/interface.c b/zebra/interface.c
index 7dc1b68d..cfcd5120 100644
--- a/zebra/interface.c
+++ b/zebra/interface.c
@@ -538,15 +538,25 @@ if_down (struct interface *ifp)
if (p->family == AF_INET)
connected_down_ipv4 (ifp, ifc);
+ }
+ }
+
+ /* Examine all static routes which direct to the interface. */
+ rib_update ();
+
#ifdef HAVE_IPV6
- else if (p->family == AF_INET6)
+ if (ifp->connected)
+ {
+ for (ALL_LIST_ELEMENTS (ifp->connected, node, next, ifc))
+ {
+ p = ifc->address;
+ if (p->family == AF_INET6)
connected_down_ipv6 (ifp, ifc);
-#endif /* HAVE_IPV6 */
}
}
- /* Examine all static routes which direct to the interface. */
rib_update ();
+#endif /* HAVE_IPV6 */
}
void