ipv4: update RTNH_F_LINKDOWN flag on UP event
authorJulian Anastasov <ja@ssi.bg>
Fri, 30 Oct 2015 08:23:34 +0000 (10:23 +0200)
committerDavid S. Miller <davem@davemloft.net>
Sun, 1 Nov 2015 21:57:39 +0000 (16:57 -0500)
commitc9b3292eeb52c6834e972eb5b8fe38914771ed12
tree793899c92207ec937d1e44bf63e69853c79673d5
parent4f823defdd5b106a5e89745ee8b163c71855de1e
ipv4: update RTNH_F_LINKDOWN flag on UP event

When nexthop is part of multipath route we should clear the
LINKDOWN flag when link goes UP or when first address is added.
This is needed because we always set LINKDOWN flag when DEAD flag
was set but now on UP the nexthop is not dead anymore. Examples when
LINKDOWN bit can be forgotten when no NETDEV_CHANGE is delivered:

- link goes down (LINKDOWN is set), then link goes UP and device
shows carrier OK but LINKDOWN remains set

- last address is deleted (LINKDOWN is set), then address is
added and device shows carrier OK but LINKDOWN remains set

Steps to reproduce:
modprobe dummy
ifconfig dummy0 192.168.168.1 up

here add a multipath route where one nexthop is for dummy0:

ip route add 1.2.3.4 nexthop dummy0 nexthop SOME_OTHER_DEVICE
ifconfig dummy0 down
ifconfig dummy0 up

now ip route shows nexthop that is not dead. Now set the sysctl var:

echo 1 > /proc/sys/net/ipv4/conf/dummy0/ignore_routes_with_linkdown

now ip route will show a dead nexthop because the forgotten
RTNH_F_LINKDOWN is propagated as RTNH_F_DEAD.

Fixes: 8a3d03166f19 ("net: track link-status of ipv4 nexthops")
Signed-off-by: Julian Anastasov <ja@ssi.bg>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/ipv4/fib_semantics.c