diff options
Diffstat (limited to 'net/8021q/vlan_dev.c')
-rw-r--r-- | net/8021q/vlan_dev.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/net/8021q/vlan_dev.c b/net/8021q/vlan_dev.c index de0dc6bacbe8..b7889782047e 100644 --- a/net/8021q/vlan_dev.c +++ b/net/8021q/vlan_dev.c | |||
@@ -431,7 +431,8 @@ int vlan_dev_change_flags(const struct net_device *dev, u32 flags, u32 mask) | |||
431 | struct vlan_dev_info *vlan = vlan_dev_info(dev); | 431 | struct vlan_dev_info *vlan = vlan_dev_info(dev); |
432 | u32 old_flags = vlan->flags; | 432 | u32 old_flags = vlan->flags; |
433 | 433 | ||
434 | if (mask & ~(VLAN_FLAG_REORDER_HDR | VLAN_FLAG_GVRP)) | 434 | if (mask & ~(VLAN_FLAG_REORDER_HDR | VLAN_FLAG_GVRP | |
435 | VLAN_FLAG_LOOSE_BINDING)) | ||
435 | return -EINVAL; | 436 | return -EINVAL; |
436 | 437 | ||
437 | vlan->flags = (old_flags & ~mask) | (flags & mask); | 438 | vlan->flags = (old_flags & ~mask) | (flags & mask); |
@@ -456,7 +457,8 @@ static int vlan_dev_open(struct net_device *dev) | |||
456 | struct net_device *real_dev = vlan->real_dev; | 457 | struct net_device *real_dev = vlan->real_dev; |
457 | int err; | 458 | int err; |
458 | 459 | ||
459 | if (!(real_dev->flags & IFF_UP)) | 460 | if (!(real_dev->flags & IFF_UP) && |
461 | !(vlan->flags & VLAN_FLAG_LOOSE_BINDING)) | ||
460 | return -ENETDOWN; | 462 | return -ENETDOWN; |
461 | 463 | ||
462 | if (compare_ether_addr(dev->dev_addr, real_dev->dev_addr)) { | 464 | if (compare_ether_addr(dev->dev_addr, real_dev->dev_addr)) { |