[VLAN]: Fix link state propagation
When the queue of the underlying device is stopped at initialization time or the device is marked "not present", the state will be propagated to the vlan device and never change. Based on an analysis by Patrick McHardy. Signed-off-by: Stefan Rompf <stefan@loplof.de> ACKed-by: Patrick McHardy <kaber@trash.net> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
a922ba5510
commit
6c753c3d3b
1 changed files with 3 additions and 5 deletions
|
@ -67,10 +67,6 @@ static struct packet_type vlan_packet_type = {
|
||||||
.func = vlan_skb_recv, /* VLAN receive method */
|
.func = vlan_skb_recv, /* VLAN receive method */
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Bits of netdev state that are propagated from real device to virtual */
|
|
||||||
#define VLAN_LINK_STATE_MASK \
|
|
||||||
((1<<__LINK_STATE_PRESENT)|(1<<__LINK_STATE_NOCARRIER)|(1<<__LINK_STATE_DORMANT))
|
|
||||||
|
|
||||||
/* End of global variables definitions. */
|
/* End of global variables definitions. */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -479,7 +475,9 @@ static struct net_device *register_vlan_device(const char *eth_IF_name,
|
||||||
new_dev->flags = real_dev->flags;
|
new_dev->flags = real_dev->flags;
|
||||||
new_dev->flags &= ~IFF_UP;
|
new_dev->flags &= ~IFF_UP;
|
||||||
|
|
||||||
new_dev->state = real_dev->state & ~(1<<__LINK_STATE_START);
|
new_dev->state = (real_dev->state & ((1<<__LINK_STATE_NOCARRIER) |
|
||||||
|
(1<<__LINK_STATE_DORMANT))) |
|
||||||
|
(1<<__LINK_STATE_PRESENT);
|
||||||
|
|
||||||
/* need 4 bytes for extra VLAN header info,
|
/* need 4 bytes for extra VLAN header info,
|
||||||
* hope the underlying device can handle it.
|
* hope the underlying device can handle it.
|
||||||
|
|
Loading…
Reference in a new issue