diff options
author | Julian Anastasov <ja@ssi.bg> | 2011-03-19 08:13:49 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-03-22 04:06:32 -0400 |
commit | e6abbaa2725a43cf5d26c4c2a5dc6c0f6029ea19 (patch) | |
tree | 65d9d9deb7259322e83fc750b98f4ad9f7a51f56 /include/net | |
parent | 74cb3c108bc0f599a4eb40980db8580cfba725c9 (diff) |
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')
-rw-r--r-- | include/net/route.h | 1 |
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); | |||
207 | 207 | ||
208 | struct in_ifaddr; | 208 | struct in_ifaddr; |
209 | extern void fib_add_ifaddr(struct in_ifaddr *); | 209 | extern void fib_add_ifaddr(struct in_ifaddr *); |
210 | extern void fib_del_ifaddr(struct in_ifaddr *, struct in_ifaddr *); | ||
210 | 211 | ||
211 | static inline void ip_rt_put(struct rtable * rt) | 212 | static inline void ip_rt_put(struct rtable * rt) |
212 | { | 213 | { |