aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/inetdevice.h
diff options
context:
space:
mode:
authorFlorian Westphal <fw@strlen.de>2019-05-31 12:27:04 -0400
committerDavid S. Miller <davem@davemloft.net>2019-06-02 21:06:26 -0400
commitef11db3310e272d3d8dbe8739e0770820dd20e52 (patch)
tree9b03e99d63d2ce8b04a8b489a52aac3d1c47e8f7 /include/linux/inetdevice.h
parent35ebfc22fe991cf5a01680a43ee238dfc16fe4c1 (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/inetdevice.h')
-rw-r--r--include/linux/inetdevice.h10
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,
186struct in_ifaddr *inet_ifa_byprefix(struct in_device *in_dev, __be32 prefix, 186struct in_ifaddr *inet_ifa_byprefix(struct in_device *in_dev, __be32 prefix,
187 __be32 mask); 187 __be32 mask);
188struct in_ifaddr *inet_lookup_ifaddr_rcu(struct net *net, __be32 addr); 188struct in_ifaddr *inet_lookup_ifaddr_rcu(struct net *net, __be32 addr);
189static __inline__ bool inet_ifa_match(__be32 addr, struct in_ifaddr *ifa) 189static 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
218static inline struct in_device *__in_dev_get_rcu(const struct net_device *dev) 226static 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);