diff options
author | David Ahern <dsahern@gmail.com> | 2019-03-27 20:53:47 -0700 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2019-03-29 10:48:03 -0700 |
commit | 331c7a402358de6206232f6aab7aa48ec6c1088a (patch) | |
tree | df3c9ac99ca90245fa32e9f5cd115f665eb2f117 /include/linux/inetdevice.h | |
parent | 8373c6c84e6748e1dd8b82c43af37572ab040233 (diff) | |
download | linux-331c7a402358de6206232f6aab7aa48ec6c1088a.tar.gz linux-331c7a402358de6206232f6aab7aa48ec6c1088a.tar.bz2 linux-331c7a402358de6206232f6aab7aa48ec6c1088a.zip |
ipv4: Move IN_DEV_IGNORE_ROUTES_WITH_LINKDOWN to helper
in_dev lookup followed by IN_DEV_IGNORE_ROUTES_WITH_LINKDOWN check
is called in several places, some with the rcu lock and others with the
rtnl held.
Move the check to a helper similar to what IPv6 has. Since the helper
can be invoked from either context use rcu_dereference_rtnl to
dereference ip_ptr.
Signed-off-by: David Ahern <dsahern@gmail.com>
Reviewed-by: Ido Schimmel <idosch@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include/linux/inetdevice.h')
-rw-r--r-- | include/linux/inetdevice.h | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/include/linux/inetdevice.h b/include/linux/inetdevice.h index a64f21a97369..367dc2a0f84a 100644 --- a/include/linux/inetdevice.h +++ b/include/linux/inetdevice.h @@ -237,6 +237,20 @@ static inline struct in_device *__in_dev_get_rtnl(const struct net_device *dev) return rtnl_dereference(dev->ip_ptr); } +/* called with rcu_read_lock or rtnl held */ +static inline bool ip_ignore_linkdown(const struct net_device *dev) +{ + struct in_device *in_dev; + bool rc = false; + + in_dev = rcu_dereference_rtnl(dev->ip_ptr); + if (in_dev && + IN_DEV_IGNORE_ROUTES_WITH_LINKDOWN(in_dev)) + rc = true; + + return rc; +} + static inline struct neigh_parms *__in_dev_arp_parms_get_rcu(const struct net_device *dev) { struct in_device *in_dev = __in_dev_get_rcu(dev); |