vlan: do not transfer link state in vlan bridge binding mode
In vlan bridge binding mode, the link state is no longer transferred from the lower device. Instead it is set by the bridge module according to the state of bridge ports that are members of the vlan. Signed-off-by: Mike Manning <mmanning@vyatta.att-mail.com> Acked-by: Nikolay Aleksandrov <nikolay@cumulusnetworks.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
8c8b3458d0
commit
76052d8c4f
@@ -297,7 +297,8 @@ static int vlan_dev_open(struct net_device *dev)
|
||||
if (vlan->flags & VLAN_FLAG_MVRP)
|
||||
vlan_mvrp_request_join(dev);
|
||||
|
||||
if (netif_carrier_ok(real_dev))
|
||||
if (netif_carrier_ok(real_dev) &&
|
||||
!(vlan->flags & VLAN_FLAG_BRIDGE_BINDING))
|
||||
netif_carrier_on(dev);
|
||||
return 0;
|
||||
|
||||
@@ -327,7 +328,8 @@ static int vlan_dev_stop(struct net_device *dev)
|
||||
if (!ether_addr_equal(dev->dev_addr, real_dev->dev_addr))
|
||||
dev_uc_del(real_dev, dev->dev_addr);
|
||||
|
||||
netif_carrier_off(dev);
|
||||
if (!(vlan->flags & VLAN_FLAG_BRIDGE_BINDING))
|
||||
netif_carrier_off(dev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -551,7 +553,8 @@ static const struct net_device_ops vlan_netdev_ops;
|
||||
|
||||
static int vlan_dev_init(struct net_device *dev)
|
||||
{
|
||||
struct net_device *real_dev = vlan_dev_priv(dev)->real_dev;
|
||||
struct vlan_dev_priv *vlan = vlan_dev_priv(dev);
|
||||
struct net_device *real_dev = vlan->real_dev;
|
||||
|
||||
netif_carrier_off(dev);
|
||||
|
||||
@@ -562,6 +565,9 @@ static int vlan_dev_init(struct net_device *dev)
|
||||
(1<<__LINK_STATE_DORMANT))) |
|
||||
(1<<__LINK_STATE_PRESENT);
|
||||
|
||||
if (vlan->flags & VLAN_FLAG_BRIDGE_BINDING)
|
||||
dev->state |= (1 << __LINK_STATE_NOCARRIER);
|
||||
|
||||
dev->hw_features = NETIF_F_HW_CSUM | NETIF_F_SG |
|
||||
NETIF_F_FRAGLIST | NETIF_F_GSO_SOFTWARE |
|
||||
NETIF_F_GSO_ENCAP_ALL |
|
||||
@@ -592,8 +598,7 @@ static int vlan_dev_init(struct net_device *dev)
|
||||
#endif
|
||||
|
||||
dev->needed_headroom = real_dev->needed_headroom;
|
||||
if (vlan_hw_offload_capable(real_dev->features,
|
||||
vlan_dev_priv(dev)->vlan_proto)) {
|
||||
if (vlan_hw_offload_capable(real_dev->features, vlan->vlan_proto)) {
|
||||
dev->header_ops = &vlan_passthru_header_ops;
|
||||
dev->hard_header_len = real_dev->hard_header_len;
|
||||
} else {
|
||||
@@ -607,8 +612,8 @@ static int vlan_dev_init(struct net_device *dev)
|
||||
|
||||
vlan_dev_set_lockdep_class(dev, vlan_dev_get_lock_subclass(dev));
|
||||
|
||||
vlan_dev_priv(dev)->vlan_pcpu_stats = netdev_alloc_pcpu_stats(struct vlan_pcpu_stats);
|
||||
if (!vlan_dev_priv(dev)->vlan_pcpu_stats)
|
||||
vlan->vlan_pcpu_stats = netdev_alloc_pcpu_stats(struct vlan_pcpu_stats);
|
||||
if (!vlan->vlan_pcpu_stats)
|
||||
return -ENOMEM;
|
||||
|
||||
return 0;
|
||||
|
Reference in New Issue
Block a user