diff options
| author | Florian Westphal <fw@strlen.de> | 2019-05-31 12:27:04 -0400 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2019-06-02 21:06:26 -0400 |
| commit | ef11db3310e272d3d8dbe8739e0770820dd20e52 (patch) | |
| tree | 9b03e99d63d2ce8b04a8b489a52aac3d1c47e8f7 /include/linux | |
| parent | 35ebfc22fe991cf5a01680a43ee238dfc16fe4c1 (diff) | |
net: inetdevice: provide replacement iterators for in_ifaddr walk
The ifa_list is protected either by rcu or rtnl lock, but the
current iterators do not account for this.
This adds two iterators as replacement, a later patch in
the series will update them with the needed rcu/rtnl_dereference calls.
Its not done in this patch yet to avoid sparse warnings -- the fields
lack the proper __rcu annotation.
Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include/linux')
| -rw-r--r-- | include/linux/inetdevice.h | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/include/linux/inetdevice.h b/include/linux/inetdevice.h index 367dc2a0f84a..d5d05503a04b 100644 --- a/include/linux/inetdevice.h +++ b/include/linux/inetdevice.h | |||
| @@ -186,7 +186,7 @@ __be32 inet_confirm_addr(struct net *net, struct in_device *in_dev, __be32 dst, | |||
| 186 | struct in_ifaddr *inet_ifa_byprefix(struct in_device *in_dev, __be32 prefix, | 186 | struct in_ifaddr *inet_ifa_byprefix(struct in_device *in_dev, __be32 prefix, |
| 187 | __be32 mask); | 187 | __be32 mask); |
| 188 | struct in_ifaddr *inet_lookup_ifaddr_rcu(struct net *net, __be32 addr); | 188 | struct in_ifaddr *inet_lookup_ifaddr_rcu(struct net *net, __be32 addr); |
| 189 | static __inline__ bool inet_ifa_match(__be32 addr, struct in_ifaddr *ifa) | 189 | static inline bool inet_ifa_match(__be32 addr, const struct in_ifaddr *ifa) |
| 190 | { | 190 | { |
| 191 | return !((addr^ifa->ifa_address)&ifa->ifa_mask); | 191 | return !((addr^ifa->ifa_address)&ifa->ifa_mask); |
| 192 | } | 192 | } |
| @@ -215,6 +215,14 @@ static __inline__ bool bad_mask(__be32 mask, __be32 addr) | |||
| 215 | 215 | ||
| 216 | #define endfor_ifa(in_dev) } | 216 | #define endfor_ifa(in_dev) } |
| 217 | 217 | ||
| 218 | #define in_dev_for_each_ifa_rtnl(ifa, in_dev) \ | ||
| 219 | for (ifa = (in_dev)->ifa_list; ifa; \ | ||
| 220 | ifa = ifa->ifa_next) | ||
| 221 | |||
| 222 | #define in_dev_for_each_ifa_rcu(ifa, in_dev) \ | ||
| 223 | for (ifa = (in_dev)->ifa_list; ifa; \ | ||
| 224 | ifa = ifa->ifa_next) | ||
| 225 | |||
| 218 | static inline struct in_device *__in_dev_get_rcu(const struct net_device *dev) | 226 | static inline struct in_device *__in_dev_get_rcu(const struct net_device *dev) |
| 219 | { | 227 | { |
| 220 | return rcu_dereference(dev->ip_ptr); | 228 | return rcu_dereference(dev->ip_ptr); |
