aboutsummaryrefslogtreecommitdiffstats
path: root/net/8021q/vlan.c
diff options
context:
space:
mode:
authorPatrick McHardy <kaber@trash.net>2009-11-25 02:54:54 -0500
committerDavid S. Miller <davem@davemloft.net>2009-11-26 19:00:36 -0500
commit5e7565930524410f097f5b04f8aba663089a6ffc (patch)
tree7575fb4b06fdad1e2e9796e0dc99ca011e59980e /net/8021q/vlan.c
parentcc83f6d6922018a1b762f67af539867a6b05398e (diff)
vlan: support "loose binding" to the underlying network device
Currently the UP/DOWN state of VLANs is synchronized to the state of the underlying device, meaning all VLANs are set down once the underlying device is set down. This causes all routes to the VLAN devices to vanish. Add a flag to specify a "loose binding" mode, in which only the operstate is transfered, but the VLAN device state is independant. Signed-off-by: Patrick McHardy <kaber@trash.net> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/8021q/vlan.c')
-rw-r--r--net/8021q/vlan.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/net/8021q/vlan.c b/net/8021q/vlan.c
index 1483243edf14..225aa2fac0e3 100644
--- a/net/8021q/vlan.c
+++ b/net/8021q/vlan.c
@@ -431,6 +431,7 @@ static int vlan_device_event(struct notifier_block *unused, unsigned long event,
431 struct vlan_group *grp; 431 struct vlan_group *grp;
432 int i, flgs; 432 int i, flgs;
433 struct net_device *vlandev; 433 struct net_device *vlandev;
434 struct vlan_dev_info *vlan;
434 LIST_HEAD(list); 435 LIST_HEAD(list);
435 436
436 if (is_vlan_dev(dev)) 437 if (is_vlan_dev(dev))
@@ -507,7 +508,9 @@ static int vlan_device_event(struct notifier_block *unused, unsigned long event,
507 if (!(flgs & IFF_UP)) 508 if (!(flgs & IFF_UP))
508 continue; 509 continue;
509 510
510 dev_change_flags(vlandev, flgs & ~IFF_UP); 511 vlan = vlan_dev_info(vlandev);
512 if (!(vlan->flags & VLAN_FLAG_LOOSE_BINDING))
513 dev_change_flags(vlandev, flgs & ~IFF_UP);
511 vlan_transfer_operstate(dev, vlandev); 514 vlan_transfer_operstate(dev, vlandev);
512 } 515 }
513 break; 516 break;
@@ -523,7 +526,9 @@ static int vlan_device_event(struct notifier_block *unused, unsigned long event,
523 if (flgs & IFF_UP) 526 if (flgs & IFF_UP)
524 continue; 527 continue;
525 528
526 dev_change_flags(vlandev, flgs | IFF_UP); 529 vlan = vlan_dev_info(vlandev);
530 if (!(vlan->flags & VLAN_FLAG_LOOSE_BINDING))
531 dev_change_flags(vlandev, flgs | IFF_UP);
527 vlan_transfer_operstate(dev, vlandev); 532 vlan_transfer_operstate(dev, vlandev);
528 } 533 }
529 break; 534 break;