summaryrefslogtreecommitdiff
path: root/zebra/zebra_rib.c
diff options
context:
space:
mode:
authorpaul <paul>2003-01-22 19:45:50 +0000
committerpaul <paul>2003-01-22 19:45:50 +0000
commitd753e9eec96f03aa02a7648e4279c524c376908d (patch)
tree5434dea114f81d8596fc87a619f65c36629b4300 /zebra/zebra_rib.c
parentd4f5031c5c2ca3953d071cfce0a3faa34f9b073d (diff)
Matthew Grant <grantma@anathoth.gen.nz>
Subject: [zebra 17290] [PATCHES] - Fixes for problems in 0.93b Added ifupstaticfix
Diffstat (limited to 'zebra/zebra_rib.c')
-rw-r--r--zebra/zebra_rib.c20
1 files changed, 19 insertions, 1 deletions
diff --git a/zebra/zebra_rib.c b/zebra/zebra_rib.c
index ec07e2e3..0f7ccebc 100644
--- a/zebra/zebra_rib.c
+++ b/zebra/zebra_rib.c
@@ -855,11 +855,13 @@ rib_process (struct route_node *rn, struct rib *del)
struct rib *next;
struct rib *fib = NULL;
struct rib *select = NULL;
+ int installed = 0;
+ struct nexthop *nexthop = NULL;
for (rib = rn->info; rib; rib = next)
{
next = rib->next;
-
+
/* Currently installed rib. */
if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_SELECTED))
fib = rib;
@@ -898,6 +900,22 @@ rib_process (struct route_node *rn, struct rib *del)
rib_install_kernel (rn, select);
redistribute_add (&rn->p, select);
}
+ else if (! RIB_SYSTEM_ROUTE (select))
+ {
+ /* Housekeeping code to deal with
+ race conditions in kernel with linux
+ netlink reporting interface up before IPv4 or IPv6 protocol
+ is ready to add routes.
+ This makes sure the routes are IN the kernel.
+ */
+
+ for (nexthop = select->nexthop; nexthop; nexthop = nexthop->next)
+ {
+ if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB))
+ installed = 1;
+ }
+ if (! installed) rib_install_kernel (rn, select);
+ }
return;
}