net: Introduce new api for walking upper and lower devices
This patch introduces netdev_walk_all_upper_dev_rcu, netdev_walk_all_lower_dev and netdev_walk_all_lower_dev_rcu. These functions recursively walk the adj_list of devices to determine all upper and lower devices. The functions take a callback function that is invoked for each device in the list. If the callback returns non-0, the walk is terminated and the functions return that code back to callers. v3 - simplified netdev_has_upper_dev_all_rcu and __netdev_has_upper_dev and removed typecast as suggested by Stephen v2 - fixed definition of netdev_next_lower_dev_rcu to mirror the upper_dev version. Signed-off-by: David Ahern <dsa@cumulusnetworks.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
790510d99f
commit
1a3f060c1a
@@ -3778,6 +3778,14 @@ struct net_device *netdev_all_upper_get_next_dev_rcu(struct net_device *dev,
|
||||
updev; \
|
||||
updev = netdev_all_upper_get_next_dev_rcu(dev, &(iter)))
|
||||
|
||||
int netdev_walk_all_upper_dev_rcu(struct net_device *dev,
|
||||
int (*fn)(struct net_device *upper_dev,
|
||||
void *data),
|
||||
void *data);
|
||||
|
||||
bool netdev_has_upper_dev_all_rcu(struct net_device *dev,
|
||||
struct net_device *upper_dev);
|
||||
|
||||
void *netdev_lower_get_next_private(struct net_device *dev,
|
||||
struct list_head **iter);
|
||||
void *netdev_lower_get_next_private_rcu(struct net_device *dev,
|
||||
@@ -3821,6 +3829,15 @@ struct net_device *netdev_all_lower_get_next_rcu(struct net_device *dev,
|
||||
ldev; \
|
||||
ldev = netdev_all_lower_get_next_rcu(dev, &(iter)))
|
||||
|
||||
int netdev_walk_all_lower_dev(struct net_device *dev,
|
||||
int (*fn)(struct net_device *lower_dev,
|
||||
void *data),
|
||||
void *data);
|
||||
int netdev_walk_all_lower_dev_rcu(struct net_device *dev,
|
||||
int (*fn)(struct net_device *lower_dev,
|
||||
void *data),
|
||||
void *data);
|
||||
|
||||
void *netdev_adjacent_get_private(struct list_head *adj_list);
|
||||
void *netdev_lower_get_first_private_rcu(struct net_device *dev);
|
||||
struct net_device *netdev_master_upper_dev_get(struct net_device *dev);
|
||||
|
Reference in New Issue
Block a user