diff options
author | nikolay@redhat.com <nikolay@redhat.com> | 2013-08-03 22:07:46 +0200 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2013-08-05 12:17:42 -0700 |
commit | 0369722f024cd374f74eac6d261014403aa27ea2 (patch) | |
tree | d73398ccd7bae3ad0a60405f71259f77c8eca430 | |
parent | d9af2d67e490b48f0d36f448d34e7bab9425f142 (diff) |
vlan: make vlan_dev_real_dev work over stacked vlans
Sometimes we might have stacked vlans on top of each other, and we're
interested in the first non-vlan real device on the path, so transform
vlan_dev_real_dev to go over the stacked vlans and extract the first
non-vlan device.
Signed-off-by: Nikolay Aleksandrov <nikolay@redhat.com>
Signed-off-by: Veaceslav Falico <vfalico@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | net/8021q/vlan_core.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/net/8021q/vlan_core.c b/net/8021q/vlan_core.c index 4a78c4de9f20..6ee48aac776f 100644 --- a/net/8021q/vlan_core.c +++ b/net/8021q/vlan_core.c @@ -91,7 +91,12 @@ EXPORT_SYMBOL(__vlan_find_dev_deep); struct net_device *vlan_dev_real_dev(const struct net_device *dev) { - return vlan_dev_priv(dev)->real_dev; + struct net_device *ret = vlan_dev_priv(dev)->real_dev; + + while (is_vlan_dev(ret)) + ret = vlan_dev_priv(ret)->real_dev; + + return ret; } EXPORT_SYMBOL(vlan_dev_real_dev); |