diff options
Diffstat (limited to 'include/linux/netdevice.h')
| -rw-r--r-- | include/linux/netdevice.h | 55 |
1 files changed, 45 insertions, 10 deletions
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index 3de49aca4519..b4cfb63f264e 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h | |||
| @@ -1143,8 +1143,18 @@ struct net_device { | |||
| 1143 | struct list_head dev_list; | 1143 | struct list_head dev_list; |
| 1144 | struct list_head napi_list; | 1144 | struct list_head napi_list; |
| 1145 | struct list_head unreg_list; | 1145 | struct list_head unreg_list; |
| 1146 | struct list_head upper_dev_list; /* List of upper devices */ | 1146 | |
| 1147 | struct list_head lower_dev_list; | 1147 | /* directly linked devices, like slaves for bonding */ |
| 1148 | struct { | ||
| 1149 | struct list_head upper; | ||
| 1150 | struct list_head lower; | ||
| 1151 | } adj_list; | ||
| 1152 | |||
| 1153 | /* all linked devices, *including* neighbours */ | ||
| 1154 | struct { | ||
| 1155 | struct list_head upper; | ||
| 1156 | struct list_head lower; | ||
| 1157 | } all_adj_list; | ||
| 1148 | 1158 | ||
| 1149 | 1159 | ||
| 1150 | /* currently active device features */ | 1160 | /* currently active device features */ |
| @@ -2813,24 +2823,49 @@ extern int bpf_jit_enable; | |||
| 2813 | extern bool netdev_has_upper_dev(struct net_device *dev, | 2823 | extern bool netdev_has_upper_dev(struct net_device *dev, |
| 2814 | struct net_device *upper_dev); | 2824 | struct net_device *upper_dev); |
| 2815 | extern bool netdev_has_any_upper_dev(struct net_device *dev); | 2825 | extern bool netdev_has_any_upper_dev(struct net_device *dev); |
| 2816 | extern struct net_device *netdev_upper_get_next_dev_rcu(struct net_device *dev, | 2826 | extern struct net_device *netdev_all_upper_get_next_dev_rcu(struct net_device *dev, |
| 2817 | struct list_head **iter); | 2827 | struct list_head **iter); |
| 2818 | 2828 | ||
| 2819 | /* iterate through upper list, must be called under RCU read lock */ | 2829 | /* iterate through upper list, must be called under RCU read lock */ |
| 2820 | #define netdev_for_each_upper_dev_rcu(dev, upper, iter) \ | 2830 | #define netdev_for_each_all_upper_dev_rcu(dev, updev, iter) \ |
| 2821 | for (iter = &(dev)->upper_dev_list, \ | 2831 | for (iter = &(dev)->all_adj_list.upper, \ |
| 2822 | upper = netdev_upper_get_next_dev_rcu(dev, &(iter)); \ | 2832 | updev = netdev_all_upper_get_next_dev_rcu(dev, &(iter)); \ |
| 2823 | upper; \ | 2833 | updev; \ |
| 2824 | upper = netdev_upper_get_next_dev_rcu(dev, &(iter))) | 2834 | updev = netdev_all_upper_get_next_dev_rcu(dev, &(iter))) |
| 2825 | 2835 | ||
| 2836 | extern void *netdev_lower_get_next_private(struct net_device *dev, | ||
| 2837 | struct list_head **iter); | ||
| 2838 | extern void *netdev_lower_get_next_private_rcu(struct net_device *dev, | ||
| 2839 | struct list_head **iter); | ||
| 2840 | |||
| 2841 | #define netdev_for_each_lower_private(dev, priv, iter) \ | ||
| 2842 | for (iter = (dev)->adj_list.lower.next, \ | ||
| 2843 | priv = netdev_lower_get_next_private(dev, &(iter)); \ | ||
| 2844 | priv; \ | ||
| 2845 | priv = netdev_lower_get_next_private(dev, &(iter))) | ||
| 2846 | |||
| 2847 | #define netdev_for_each_lower_private_rcu(dev, priv, iter) \ | ||
| 2848 | for (iter = &(dev)->adj_list.lower, \ | ||
| 2849 | priv = netdev_lower_get_next_private_rcu(dev, &(iter)); \ | ||
| 2850 | priv; \ | ||
| 2851 | priv = netdev_lower_get_next_private_rcu(dev, &(iter))) | ||
| 2852 | |||
| 2853 | extern void *netdev_adjacent_get_private(struct list_head *adj_list); | ||
| 2826 | extern struct net_device *netdev_master_upper_dev_get(struct net_device *dev); | 2854 | extern struct net_device *netdev_master_upper_dev_get(struct net_device *dev); |
| 2827 | extern struct net_device *netdev_master_upper_dev_get_rcu(struct net_device *dev); | 2855 | extern struct net_device *netdev_master_upper_dev_get_rcu(struct net_device *dev); |
| 2828 | extern int netdev_upper_dev_link(struct net_device *dev, | 2856 | extern int netdev_upper_dev_link(struct net_device *dev, |
| 2829 | struct net_device *upper_dev); | 2857 | struct net_device *upper_dev); |
| 2830 | extern int netdev_master_upper_dev_link(struct net_device *dev, | 2858 | extern int netdev_master_upper_dev_link(struct net_device *dev, |
| 2831 | struct net_device *upper_dev); | 2859 | struct net_device *upper_dev); |
| 2860 | extern int netdev_master_upper_dev_link_private(struct net_device *dev, | ||
| 2861 | struct net_device *upper_dev, | ||
| 2862 | void *private); | ||
| 2832 | extern void netdev_upper_dev_unlink(struct net_device *dev, | 2863 | extern void netdev_upper_dev_unlink(struct net_device *dev, |
| 2833 | struct net_device *upper_dev); | 2864 | struct net_device *upper_dev); |
| 2865 | extern void *netdev_lower_dev_get_private_rcu(struct net_device *dev, | ||
| 2866 | struct net_device *lower_dev); | ||
| 2867 | extern void *netdev_lower_dev_get_private(struct net_device *dev, | ||
| 2868 | struct net_device *lower_dev); | ||
| 2834 | extern int skb_checksum_help(struct sk_buff *skb); | 2869 | extern int skb_checksum_help(struct sk_buff *skb); |
| 2835 | extern struct sk_buff *__skb_gso_segment(struct sk_buff *skb, | 2870 | extern struct sk_buff *__skb_gso_segment(struct sk_buff *skb, |
| 2836 | netdev_features_t features, bool tx_path); | 2871 | netdev_features_t features, bool tx_path); |
