summaryrefslogtreecommitdiffstats
path: root/include/net/route.h
diff options
context:
space:
mode:
authorJulian Anastasov <ja@ssi.bg>2011-03-19 12:13:49 +0000
committerDavid S. Miller <davem@davemloft.net>2011-03-22 01:06:32 -0700
commite6abbaa2725a43cf5d26c4c2a5dc6c0f6029ea19 (patch)
tree65d9d9deb7259322e83fc750b98f4ad9f7a51f56 /include/net/route.h
parent74cb3c108bc0f599a4eb40980db8580cfba725c9 (diff)
downloadlinux-e6abbaa2725a43cf5d26c4c2a5dc6c0f6029ea19.tar.gz
linux-e6abbaa2725a43cf5d26c4c2a5dc6c0f6029ea19.tar.bz2
linux-e6abbaa2725a43cf5d26c4c2a5dc6c0f6029ea19.zip
ipv4: fix route deletion for IPs on many subnets
Alex Sidorenko reported for problems with local routes left after IP addresses are deleted. It happens when same IPs are used in more than one subnet for the device. Fix fib_del_ifaddr to restrict the checks for duplicate local and broadcast addresses only to the IFAs that use our primary IFA or another primary IFA with same address. And we expect the prefsrc to be matched when the routes are deleted because it is possible they to differ only by prefsrc. This patch prevents local and broadcast routes to be leaked until their primary IP is deleted finally from the box. As the secondary address promotion needs to delete the routes for all secondaries that used the old primary IFA, add option to ignore these secondaries from the checks and to assume they are already deleted, so that we can safely delete the route while these IFAs are still on the device list. Reported-by: Alex Sidorenko <alexandre.sidorenko@hp.com> Signed-off-by: Julian Anastasov <ja@ssi.bg> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include/net/route.h')
-rw-r--r--include/net/route.h1
1 files changed, 1 insertions, 0 deletions
diff --git a/include/net/route.h b/include/net/route.h
index 30d6cae3841a..dc102445ec47 100644
--- a/include/net/route.h
+++ b/include/net/route.h
@@ -207,6 +207,7 @@ extern int ip_rt_dump(struct sk_buff *skb, struct netlink_callback *cb);
struct in_ifaddr;
extern void fib_add_ifaddr(struct in_ifaddr *);
+extern void fib_del_ifaddr(struct in_ifaddr *, struct in_ifaddr *);
static inline void ip_rt_put(struct rtable * rt)
{