Skip to content

Commit a1a22c1

Browse files
David Aherndavem330
authored andcommitted
net: ipv6: Keep nexthop of multipath route on admin down
IPv6 deletes route entries associated with multipath routes on an admin down where IPv4 does not. For example: $ ip ro ls vrf red unreachable default metric 8192 1.1.1.0/24 metric 64 nexthop via 10.100.1.254 dev eth1 weight 1 nexthop via 10.100.2.254 dev eth2 weight 1 10.100.1.0/24 dev eth1 proto kernel scope link src 10.100.1.4 10.100.2.0/24 dev eth2 proto kernel scope link src 10.100.2.4 $ ip -6 ro ls vrf red 2001:db8:1::/120 dev eth1 proto kernel metric 256 pref medium 2001:db8:2:: dev red proto none metric 0 pref medium 2001:db8:2::/120 dev eth2 proto kernel metric 256 pref medium 2001:db8:11::/120 via 2001:db8:1::16 dev eth1 metric 1024 pref medium 2001:db8:11::/120 via 2001:db8:2::17 dev eth2 metric 1024 pref medium ... Set link down: $ ip li set eth1 down IPv4 retains the multihop route but flags eth1 route as dead: $ ip ro ls vrf red unreachable default metric 8192 1.1.1.0/24 nexthop via 10.100.1.16 dev eth1 weight 1 dead linkdown nexthop via 10.100.2.16 dev eth2 weight 1 10.100.2.0/24 dev eth2 proto kernel scope link src 10.100.2.4 and IPv6 deletes the route as part of flushing all routes for the device: $ ip -6 ro ls vrf red 2001:db8:2:: dev red proto none metric 0 pref medium 2001:db8:2::/120 dev eth2 proto kernel metric 256 pref medium 2001:db8:11::/120 via 2001:db8:2::17 dev eth2 metric 1024 pref medium ... Worse, on admin up of the device the multipath route has to be deleted to get this leg of the route re-added. This patch keeps routes that are part of a multipath route if ignore_routes_with_linkdown is set with the dead and linkdown flags enabling consistency between IPv4 and IPv6: $ ip -6 ro ls vrf red 2001:db8:2:: dev red proto none metric 0 pref medium 2001:db8:2::/120 dev eth2 proto kernel metric 256 pref medium 2001:db8:11::/120 via 2001:db8:1::16 dev eth1 metric 1024 dead linkdown pref medium 2001:db8:11::/120 via 2001:db8:2::17 dev eth2 metric 1024 pref medium ... Signed-off-by: David Ahern <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent dceeab0 commit a1a22c1

File tree

1 file changed

+5
-2
lines changed

1 file changed

+5
-2
lines changed

net/ipv6/route.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2711,13 +2711,16 @@ struct arg_dev_net {
27112711
struct net *net;
27122712
};
27132713

2714+
/* called with write lock held for table with rt */
27142715
static int fib6_ifdown(struct rt6_info *rt, void *arg)
27152716
{
27162717
const struct arg_dev_net *adn = arg;
27172718
const struct net_device *dev = adn->dev;
27182719

27192720
if ((rt->dst.dev == dev || !dev) &&
2720-
rt != adn->net->ipv6.ip6_null_entry)
2721+
rt != adn->net->ipv6.ip6_null_entry &&
2722+
(rt->rt6i_nsiblings == 0 ||
2723+
!rt->rt6i_idev->cnf.ignore_routes_with_linkdown))
27212724
return -1;
27222725

27232726
return 0;
@@ -3216,7 +3219,7 @@ static int rt6_fill_node(struct net *net,
32163219
else
32173220
rtm->rtm_type = RTN_UNICAST;
32183221
rtm->rtm_flags = 0;
3219-
if (!netif_carrier_ok(rt->dst.dev)) {
3222+
if (!netif_running(rt->dst.dev) || !netif_carrier_ok(rt->dst.dev)) {
32203223
rtm->rtm_flags |= RTNH_F_LINKDOWN;
32213224
if (rt->rt6i_idev->cnf.ignore_routes_with_linkdown)
32223225
rtm->rtm_flags |= RTNH_F_DEAD;

0 commit comments

Comments
 (0)