diff options
| author | David S. Miller <davem@davemloft.net> | 2014-05-16 22:29:17 -0400 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2014-05-16 22:29:17 -0400 |
| commit | a8d0d8417c0bdc870d28afb83bc12e61a818efa3 (patch) | |
| tree | c9c13fc99aaa8f2c62d21b5ffbb1ece6d1a2c00b /include/linux/netdevice.h | |
| parent | 6bd64ac0f9c264082241da0db0dcc72a13e672a8 (diff) | |
| parent | f60c3704e87d39356d00c71bf51e55c2c55ad4f5 (diff) | |
Merge branch 'bond_stacked_vlans'
Vlad Yasevich says:
====================
Fixed stacked vlan usage on top of bonds
Bonding device driver now support q-in-q on top for bonds. There are
a few issues here though.
First, when arp monitoring is used, bonding driver will not correctly
tag traffic if the source of the arp device was configured on top of
q-in-q. It may also incorrectly pick the wrong vlan id if the ordering
of that upper devices isn't as expected (there is no guarntee on ordering).
Second, the alb/tlb may use what would be considered 'inner' vlans in
its learning announcements, as it simply announces all vlans configured
on top of the bond without regard for encapsulation/stacking.
This series fixes the above 2 issues. This series also depends on the
functionality introduced in
http://patchwork.ozlabs.org/patch/349766/
Since v1:
- Changed how patch1 verifies the device path. We no longer use the
_all_upper version of the function. We find the path and if it was
found, then collect the vlan information.
- Use the constant to devine maximum vlan nest level support on top
of bonding. This can be changed if 2 is too low.
- Inlude patch2 into the series.
====================
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include/linux/netdevice.h')
| -rw-r--r-- | include/linux/netdevice.h | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index 9d4b1f1b6b75..b42d07b0390b 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h | |||
| @@ -3056,10 +3056,19 @@ extern int weight_p; | |||
| 3056 | extern int bpf_jit_enable; | 3056 | extern int bpf_jit_enable; |
| 3057 | 3057 | ||
| 3058 | bool netdev_has_upper_dev(struct net_device *dev, struct net_device *upper_dev); | 3058 | bool netdev_has_upper_dev(struct net_device *dev, struct net_device *upper_dev); |
| 3059 | struct net_device *netdev_upper_get_next_dev_rcu(struct net_device *dev, | ||
| 3060 | struct list_head **iter); | ||
| 3059 | struct net_device *netdev_all_upper_get_next_dev_rcu(struct net_device *dev, | 3061 | struct net_device *netdev_all_upper_get_next_dev_rcu(struct net_device *dev, |
| 3060 | struct list_head **iter); | 3062 | struct list_head **iter); |
| 3061 | 3063 | ||
| 3062 | /* iterate through upper list, must be called under RCU read lock */ | 3064 | /* iterate through upper list, must be called under RCU read lock */ |
| 3065 | #define netdev_for_each_upper_dev_rcu(dev, updev, iter) \ | ||
| 3066 | for (iter = &(dev)->adj_list.upper, \ | ||
| 3067 | updev = netdev_upper_get_next_dev_rcu(dev, &(iter)); \ | ||
| 3068 | updev; \ | ||
| 3069 | updev = netdev_upper_get_next_dev_rcu(dev, &(iter))) | ||
| 3070 | |||
| 3071 | /* iterate through upper list, must be called under RCU read lock */ | ||
| 3063 | #define netdev_for_each_all_upper_dev_rcu(dev, updev, iter) \ | 3072 | #define netdev_for_each_all_upper_dev_rcu(dev, updev, iter) \ |
| 3064 | for (iter = &(dev)->all_adj_list.upper, \ | 3073 | for (iter = &(dev)->all_adj_list.upper, \ |
| 3065 | updev = netdev_all_upper_get_next_dev_rcu(dev, &(iter)); \ | 3074 | updev = netdev_all_upper_get_next_dev_rcu(dev, &(iter)); \ |
