From mboxrd@z Thu Jan 1 00:00:00 1970 From: Veaceslav Falico Subject: [PATCH net-next 21/26] net: add a function to get the next private Date: Mon, 9 Sep 2013 22:16:39 +0200 Message-ID: <1378757804-3159-22-git-send-email-vfalico@redhat.com> References: <1378757804-3159-1-git-send-email-vfalico@redhat.com> Cc: jiri@resnulli.us, Veaceslav Falico , "David S. Miller" , Eric Dumazet , Alexander Duyck To: netdev@vger.kernel.org Return-path: Received: from mx1.redhat.com ([209.132.183.28]:3705 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756024Ab3IIURG (ORCPT ); Mon, 9 Sep 2013 16:17:06 -0400 In-Reply-To: <1378757804-3159-1-git-send-email-vfalico@redhat.com> Sender: netdev-owner@vger.kernel.org List-ID: It searches for the provided private and returns the next one. If private is not found or next list element is list head - returns NULL. CC: "David S. Miller" CC: Eric Dumazet CC: Jiri Pirko CC: Alexander Duyck Signed-off-by: Veaceslav Falico --- include/linux/netdevice.h | 2 ++ net/core/dev.c | 27 +++++++++++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index 72d1631..b487302 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h @@ -2866,6 +2866,8 @@ extern void *netdev_lower_dev_get_private_rcu(struct net_device *dev, struct net_device *lower_dev); extern void *netdev_lower_dev_get_private(struct net_device *dev, struct net_device *lower_dev); +extern void *netdev_lower_dev_get_next_private(struct net_device *dev, + void *private); extern int skb_checksum_help(struct sk_buff *skb); extern struct sk_buff *__skb_gso_segment(struct sk_buff *skb, netdev_features_t features, bool tx_path); diff --git a/net/core/dev.c b/net/core/dev.c index adcc163..8d5473d 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -5041,6 +5041,33 @@ void *netdev_lower_dev_get_private(struct net_device *dev, } EXPORT_SYMBOL(netdev_lower_dev_get_private); +/* netdev_lower_dev_get_next_private - return the ->private of the list + * element whos ->private == private. + * @dev - device to search + * @private - private pointer to search for. + * + * Returns the next ->private pointer, if ->next is not head and private is + * found. + */ +extern void *netdev_lower_dev_get_next_private(struct net_device *dev, + void *private) +{ + struct netdev_adjacent *lower; + + list_for_each_entry(lower, &dev->adj_list.lower, list) { + if (lower->private == private) { + lower = list_entry(lower->list.next, + struct netdev_adjacent, list); + if (&lower->list == &dev->adj_list.lower) + return NULL; + return lower->private; + } + } + + return NULL; +} +EXPORT_SYMBOL(netdev_lower_dev_get_next_private); + static void dev_change_rx_flags(struct net_device *dev, int flags) { const struct net_device_ops *ops = dev->netdev_ops; -- 1.8.4