Patch "ipv4: fix to not remove local route on link down" has been added to the 4.2-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
ipv4: fix to not remove local route on link down
to the 4.2-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
ipv4-fix-to-not-remove-local-route-on-link-down.patch
and it can be found in the queue-4.2 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From foo@baz Tue Nov 17 14:34:38 PST 2015
From: Julian Anastasov <[email protected]>
Date: Fri, 30 Oct 2015 10:23:33 +0200
Subject: ipv4: fix to not remove local route on link down
From: Julian Anastasov <[email protected]>
[ Upstream commit 4f823defdd5b106a5e89745ee8b163c71855de1e ]
When fib_netdev_event calls fib_disable_ip on NETDEV_DOWN event we should not delete the local routes if the local address is still present. The confusion comes from the fact that both fib_netdev_event and fib_inetaddr_event use the NETDEV_DOWN constant. Fix it by returning back the variable 'force'.
Steps to reproduce:
modprobe dummy
ifconfig dummy0 192.168.168.1 up
ifconfig dummy0 down
ip route list table local | grep dummy | grep host
local 192.168.168.1 dev dummy0 proto kernel scope host src 192.168.168.1
--- include/net/ip_fib.h | 2 +- net/ipv4/fib_frontend.c | 13 +++++++------ net/ipv4/fib_semantics.c | 11 ++++++++--- 3 files changed, 16 insertions(+), 10 deletions(-)
include/net/ip_fib.h +1 -1
@@ -306,7 +306,7 @@ void fib_flush_external(struct net *net)/* Exported by fib_semantics.c */ int ip_fib_check_default (__be32 gw,struct net_device *dev); -int fib_sync_down_dev (struct net_device *dev,unsigned long event); +int fib_sync_down_dev (struct net_device *dev,unsigned long event,bool force);int fib_sync_down_addr (struct net *net,__be32 local);int fib_sync_up (struct net_device *dev,unsigned int nh_flags);void fib_select_multipath (struct fib_result *res);
net/ipv4/fib_frontend.c +7 -6
@@ -1063,9 +1063,10 @@ static void nl_fib_lookup_exit(struct ne net->ipv4.fibnl =NULL ; } -static void fib_disable_ip (struct net_device *dev,unsigned long event) +static void fib_disable_ip (struct net_device *dev,unsigned long event, +bool force) { -if (fib_sync_down_dev (dev, event)) +if (fib_sync_down_dev (dev, event, force))fib_flush (dev_net (dev));rt_cache_flush (dev_net (dev));arp_ifdown (dev);
@@ -1093,7 +1094,7 @@ static int fib_inetaddr_event(struct not/* Last address was deleted from this interface. * Disable IP. */ -fib_disable_ip (dev, event); +fib_disable_ip (dev, event, true); }else {rt_cache_flush (dev_net (dev)); }
@@ -1110,7 +1111,7 @@ static int fib_netdev_event(struct notifunsigned int flags;if (event ==NETDEV_UNREGISTER ) { -fib_disable_ip (dev, event); +fib_disable_ip (dev, event, true);rt_flush_dev (dev);return NOTIFY_DONE ; }
@@ -1131,14 +1132,14 @@ static int fib_netdev_event(struct notifrt_cache_flush (net);break ;case NETDEV_DOWN : -fib_disable_ip (dev, event); +fib_disable_ip (dev, event, false);break ;case NETDEV_CHANGE : flags =dev_get_flags (dev);if (flags & (IFF_RUNNING |IFF_LOWER_UP ))fib_sync_up (dev,RTNH_F_LINKDOWN );else -fib_sync_down_dev (dev, event); +fib_sync_down_dev (dev, event, false);/* fall through */ case NETDEV_CHANGEMTU :rt_cache_flush (net);
net/ipv4/fib_semantics.c +8 -3
@@ -1132,7 +1132,13 @@ int fib_sync_down_addr(struct net *net,return ret; } -int fib_sync_down_dev (struct net_device *dev,unsigned long event) +/* Event force Flags Description +* NETDEV_CHANGE 0 LINKDOWN Carrier OFF, not for scope host +* NETDEV_DOWN 0 LINKDOWN|DEAD Link down, not for scope host +* NETDEV_DOWN 1 LINKDOWN|DEAD Last address removed +* NETDEV_UNREGISTER 1 LINKDOWN|DEAD Device removed +*/ +int fib_sync_down_dev (struct net_device *dev,unsigned long event,bool force) {int ret =0 ;int scope =RT_SCOPE_NOWHERE ;
@@ -1141,8 +1147,7 @@ int fib_sync_down_dev(struct net_devicestruct hlist_head *head = &fib_info_devhash[hash];struct fib_nh *nh; -if (event ==NETDEV_UNREGISTER || - event ==NETDEV_DOWN ) +if (force) scope =-1 ;hlist_for_each_entry (nh, head, nh_hash) {
Patches currently in stable-queue which might be from [email protected] are
queue-4.2/ipv4-update-rtnh_f_linkdown-flag-on-up-event.patch queue-4.2/ipv4-fix-to-not-remove-local-route-on-link-down.patch