diff options
author | Stephen Hemminger <stephen.hemminger@vyatta.com> | 2008-04-26 09:51:39 -0700 |
---|---|---|
committer | Stephen Hemminger <stephen.hemminger@vyatta.com> | 2008-04-26 09:51:39 -0700 |
commit | df7ff29201ccfeb39f0cf5112930aae2f30bb5ec (patch) | |
tree | cc731d80416e08e32636cb3799e241badb0ca4a6 /zebra/zebra_rib.c | |
parent | ae8b1454d3b3145ebbf47a0ee276db12d09e10a6 (diff) | |
download | quagga-df7ff29201ccfeb39f0cf5112930aae2f30bb5ec.tar.bz2 quagga-df7ff29201ccfeb39f0cf5112930aae2f30bb5ec.tar.xz |
Check nexthop for internal routes
Check if nexthop is active when doing RIB update.
This should fix issues with static routes staying active after
link going down.
Diffstat (limited to 'zebra/zebra_rib.c')
-rw-r--r-- | zebra/zebra_rib.c | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/zebra/zebra_rib.c b/zebra/zebra_rib.c index 77406b0c..5de320d9 100644 --- a/zebra/zebra_rib.c +++ b/zebra/zebra_rib.c @@ -428,6 +428,17 @@ nexthop_active_ipv4 (struct rib *rib, struct nexthop *nexthop, int set, || newhop->type == NEXTHOP_TYPE_IFNAME || newhop->type == NEXTHOP_TYPE_IPV4_IFINDEX) nexthop->rifindex = newhop->ifindex; + + if (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; } @@ -539,6 +550,17 @@ nexthop_active_ipv6 (struct rib *rib, struct nexthop *nexthop, int set, || newhop->type == NEXTHOP_TYPE_IPV6_IFINDEX || newhop->type == NEXTHOP_TYPE_IPV6_IFNAME) nexthop->rifindex = newhop->ifindex; + + 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; } |