summaryrefslogtreecommitdiffstats
path: root/zebra
diff options
context:
space:
mode:
authorStephen Hemminger <stephen.hemminger@vyatta.com>2008-04-24 12:06:13 -0700
committerStephen Hemminger <stephen.hemminger@vyatta.com>2008-04-24 12:06:13 -0700
commite82a974a6636ebadfad4d31384760acbec41ed27 (patch)
tree6964e2dcf666fc2c36dfb6ceca1907d99bb3ea9b /zebra
parentb903133eb2b4ccc4dfd1d5a2532306fd6ce21bd6 (diff)
downloadquagga-e82a974a6636ebadfad4d31384760acbec41ed27.tar.bz2
quagga-e82a974a6636ebadfad4d31384760acbec41ed27.tar.xz
mark static routes as inactive when link is down
When link becomes unavailable, unselect any routes that use that link as the next hop. This keeps routing protocols from propogating routes these routes and greating black holes.
Diffstat (limited to 'zebra')
-rw-r--r--zebra/zebra_rib.c25
1 files changed, 23 insertions, 2 deletions
diff --git a/zebra/zebra_rib.c b/zebra/zebra_rib.c
index 80a7279f..77406b0c 100644
--- a/zebra/zebra_rib.c
+++ b/zebra/zebra_rib.c
@@ -342,6 +342,7 @@ static int
nexthop_active_ipv4 (struct rib *rib, struct nexthop *nexthop, int set,
struct route_node *top)
{
+ struct interface *ifp;
struct prefix_ipv4 p;
struct route_table *table;
struct route_node *rn;
@@ -398,7 +399,16 @@ nexthop_active_ipv4 (struct rib *rib, struct nexthop *nexthop, int set,
newhop = match->nexthop;
if (newhop && nexthop->type == NEXTHOP_TYPE_IPV4)
nexthop->ifindex = newhop->ifindex;
-
+ else if (newhop && newhop->type == NEXTHOP_TYPE_IFINDEX)
+ {
+ ifp = if_lookup_by_index (newhop->ifindex);
+ return (ifp && if_is_operative (ifp));
+ }
+ else if (newhop && newhop->type == NEXTHOP_TYPE_IFNAME)
+ {
+ ifp = if_lookup_by_name(newhop->ifname);
+ return (ifp && if_is_operative (ifp));
+ }
return 1;
}
else if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_INTERNAL))
@@ -439,6 +449,7 @@ static int
nexthop_active_ipv6 (struct rib *rib, struct nexthop *nexthop, int set,
struct route_node *top)
{
+ struct interface *ifp;
struct prefix_ipv6 p;
struct route_table *table;
struct route_node *rn;
@@ -496,7 +507,17 @@ nexthop_active_ipv6 (struct rib *rib, struct nexthop *nexthop, int set,
if (newhop && nexthop->type == NEXTHOP_TYPE_IPV6)
nexthop->ifindex = newhop->ifindex;
-
+ else if (newhop && newhop->type == NEXTHOP_TYPE_IFINDEX)
+ {
+ ifp = if_lookup_by_index (newhop->ifindex);
+ return (ifp && if_is_operative (ifp));
+ }
+ else if (newhop && newhop->type == NEXTHOP_TYPE_IFNAME)
+ {
+ ifp = if_lookup_by_name(newhop->ifname);
+ return (ifp && if_is_operative (ifp));
+ }
+
return 1;
}
else if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_INTERNAL))