Provide a helper to lookup neigh_parms associated with a given (neigh_table, net_device) pair. The existing lookup_neigh_parms() helper is internal to the neighbour subsystem and cannot be used by other subsystems. Some stacked/virtual devices like bond require access to the underlying device's neigh_parms. neigh_parms_lookup_dev() is designed to be a wrapper around lookup_neigh_parms(). The function provides controlled access to per device neigh_parms. The caller is expected to hold rcu_read_lock(). This does not break any existing functionality. Signed-off-by: Paritosh Potukuchi --- include/net/neighbour.h | 2 ++ net/core/neighbour.c | 8 ++++++++ 2 files changed, 10 insertions(+) diff --git a/include/net/neighbour.h b/include/net/neighbour.h index 8860cc2175fc..1b3b06eda886 100644 --- a/include/net/neighbour.h +++ b/include/net/neighbour.h @@ -438,6 +438,8 @@ int neigh_sysctl_register(struct net_device *dev, struct neigh_parms *p, proc_handler *proc_handler); void neigh_sysctl_unregister(struct neigh_parms *p); +struct neigh_parms *neigh_parms_lookup_dev(struct neigh_table *tbl, struct net_device *dev); + static inline void __neigh_parms_put(struct neigh_parms *parms) { refcount_dec(&parms->refcnt); diff --git a/net/core/neighbour.c b/net/core/neighbour.c index 1349c0eedb64..6d32c2668af3 100644 --- a/net/core/neighbour.c +++ b/net/core/neighbour.c @@ -1757,6 +1757,14 @@ static inline struct neigh_parms *lookup_neigh_parms(struct neigh_table *tbl, return NULL; } +/* Caller must hold rcu_read_lock()*/ + +struct neigh_parms *neigh_parms_lookup_dev(struct neigh_table *tbl, struct net_device *dev) +{ + return lookup_neigh_parms(tbl, dev_net(dev), dev->ifindex); +} +EXPORT_SYMBOL(neigh_parms_lookup_dev); + struct neigh_parms *neigh_parms_alloc(struct net_device *dev, struct neigh_table *tbl) { -- 2.43.0