diff options
author | Stephen Hemminger <stephen.hemminger@vyatta.com> | 2008-04-24 12:06:13 -0700 |
---|---|---|
committer | Stephen Hemminger <stephen.hemminger@vyatta.com> | 2008-04-24 12:06:13 -0700 |
commit | e82a974a6636ebadfad4d31384760acbec41ed27 (patch) | |
tree | 6964e2dcf666fc2c36dfb6ceca1907d99bb3ea9b /zebra | |
parent | b903133eb2b4ccc4dfd1d5a2532306fd6ce21bd6 (diff) | |
download | quagga-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.c | 25 |
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)) |