Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

vlan: Don't propagate flag changes on down interfaces.

When (de)configuring a vlan interface, the IFF_ALLMULTI ans IFF_PROMISC
flags are cleared or set on the underlying interface. So, if these flags
are changed on a vlan interface that is not up, the flags underlying
interface might be set or cleared twice.

Only propagating flag changes when a device is up makes sure this does
not happen. It also makes sure that an underlying device is not set to
promiscuous or allmulti mode for a vlan device that is down.

Signed-off-by: Matthijs Kooijman <matthijs@stdin.nl>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Matthijs Kooijman and committed by
David S. Miller
deede2fa 045f7b3b

+6 -4
+6 -4
net/8021q/vlan_dev.c
··· 470 470 { 471 471 struct net_device *real_dev = vlan_dev_info(dev)->real_dev; 472 472 473 - if (change & IFF_ALLMULTI) 474 - dev_set_allmulti(real_dev, dev->flags & IFF_ALLMULTI ? 1 : -1); 475 - if (change & IFF_PROMISC) 476 - dev_set_promiscuity(real_dev, dev->flags & IFF_PROMISC ? 1 : -1); 473 + if (dev->flags & IFF_UP) { 474 + if (change & IFF_ALLMULTI) 475 + dev_set_allmulti(real_dev, dev->flags & IFF_ALLMULTI ? 1 : -1); 476 + if (change & IFF_PROMISC) 477 + dev_set_promiscuity(real_dev, dev->flags & IFF_PROMISC ? 1 : -1); 478 + } 477 479 } 478 480 479 481 static void vlan_dev_set_rx_mode(struct net_device *vlan_dev)