diff options
author | Patrick McHardy <kaber@trash.net> | 2008-05-20 17:54:50 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-05-20 17:54:50 -0400 |
commit | 5fb13570543f4ae022996c9d7c0c099c8abf22dd (patch) | |
tree | bf0f837d4b2dd778c32cf8fcf719913203f1cd39 /net/8021q/vlan.c | |
parent | 7ff6e6f779960e1078a78b60a881571c04f52b9b (diff) |
[VLAN]: Propagate selected feature bits to VLAN devices
Propagate feature bits from the NETDEV_FEAT_CHANGE notifier. For now
only TSO is propagated for devices that announce their ability to
support TSO in combination with VLAN accel by setting the NETIF_F_VLAN_TSO
flag.
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.c | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/net/8021q/vlan.c b/net/8021q/vlan.c index b934159a6f07..51961300b586 100644 --- a/net/8021q/vlan.c +++ b/net/8021q/vlan.c | |||
@@ -382,6 +382,24 @@ static void vlan_sync_address(struct net_device *dev, | |||
382 | memcpy(vlan->real_dev_addr, dev->dev_addr, ETH_ALEN); | 382 | memcpy(vlan->real_dev_addr, dev->dev_addr, ETH_ALEN); |
383 | } | 383 | } |
384 | 384 | ||
385 | static void vlan_transfer_features(struct net_device *dev, | ||
386 | struct net_device *vlandev) | ||
387 | { | ||
388 | unsigned long old_features = vlandev->features; | ||
389 | |||
390 | if (dev->features & NETIF_F_VLAN_TSO) { | ||
391 | vlandev->features &= ~VLAN_TSO_FEATURES; | ||
392 | vlandev->features |= dev->features & VLAN_TSO_FEATURES; | ||
393 | } | ||
394 | if (dev->features & NETIF_F_VLAN_CSUM) { | ||
395 | vlandev->features &= ~NETIF_F_ALL_CSUM; | ||
396 | vlandev->features |= dev->features & NETIF_F_ALL_CSUM; | ||
397 | } | ||
398 | |||
399 | if (old_features != vlandev->features) | ||
400 | netdev_features_change(vlandev); | ||
401 | } | ||
402 | |||
385 | static void __vlan_device_event(struct net_device *dev, unsigned long event) | 403 | static void __vlan_device_event(struct net_device *dev, unsigned long event) |
386 | { | 404 | { |
387 | switch (event) { | 405 | switch (event) { |
@@ -448,6 +466,18 @@ static int vlan_device_event(struct notifier_block *unused, unsigned long event, | |||
448 | } | 466 | } |
449 | break; | 467 | break; |
450 | 468 | ||
469 | case NETDEV_FEAT_CHANGE: | ||
470 | /* Propagate device features to underlying device */ | ||
471 | for (i = 0; i < VLAN_GROUP_ARRAY_LEN; i++) { | ||
472 | vlandev = vlan_group_get_device(grp, i); | ||
473 | if (!vlandev) | ||
474 | continue; | ||
475 | |||
476 | vlan_transfer_features(dev, vlandev); | ||
477 | } | ||
478 | |||
479 | break; | ||
480 | |||
451 | case NETDEV_DOWN: | 481 | case NETDEV_DOWN: |
452 | /* Put all VLANs for this dev in the down state too. */ | 482 | /* Put all VLANs for this dev in the down state too. */ |
453 | for (i = 0; i < VLAN_GROUP_ARRAY_LEN; i++) { | 483 | for (i = 0; i < VLAN_GROUP_ARRAY_LEN; i++) { |