aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichał Mirosław <mirq-linux@rere.qmqm.pl>2011-05-06 03:56:29 -0400
committerDavid S. Miller <davem@davemloft.net>2011-05-12 17:54:13 -0400
commitf0a619ccfb8a2ec8ff083a02299cfd076c362b27 (patch)
tree88b90e6fcec0947fc46eb178948ac78d1dc45134
parent864b5418ebc16893cfd27ff3cda254eff0f56d6f (diff)
net: Fix vlan_features propagation
Fix VLAN features propagation for devices which change vlan_features. For this to work, driver needs to make sure netdev_features_changed() gets called after the change (it is e.g. after ndo_set_features()). Side effect is that a user might request features that will never be enabled on a VLAN device. Signed-off-by: Michał Mirosław <mirq-linux@rere.qmqm.pl> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--net/8021q/vlan_dev.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/net/8021q/vlan_dev.c b/net/8021q/vlan_dev.c
index 58f8010e1aef..f247f5bff88d 100644
--- a/net/8021q/vlan_dev.c
+++ b/net/8021q/vlan_dev.c
@@ -528,7 +528,7 @@ static int vlan_dev_init(struct net_device *dev)
528 (1<<__LINK_STATE_DORMANT))) | 528 (1<<__LINK_STATE_DORMANT))) |
529 (1<<__LINK_STATE_PRESENT); 529 (1<<__LINK_STATE_PRESENT);
530 530
531 dev->hw_features = real_dev->vlan_features & NETIF_F_ALL_TX_OFFLOADS; 531 dev->hw_features = NETIF_F_ALL_TX_OFFLOADS;
532 dev->features |= real_dev->vlan_features | NETIF_F_LLTX; 532 dev->features |= real_dev->vlan_features | NETIF_F_LLTX;
533 dev->gso_max_size = real_dev->gso_max_size; 533 dev->gso_max_size = real_dev->gso_max_size;
534 534
@@ -587,9 +587,11 @@ static u32 vlan_dev_fix_features(struct net_device *dev, u32 features)
587{ 587{
588 struct net_device *real_dev = vlan_dev_info(dev)->real_dev; 588 struct net_device *real_dev = vlan_dev_info(dev)->real_dev;
589 589
590 features &= (real_dev->features | NETIF_F_LLTX); 590 features &= real_dev->features;
591 features &= real_dev->vlan_features;
591 if (dev_ethtool_get_rx_csum(real_dev)) 592 if (dev_ethtool_get_rx_csum(real_dev))
592 features |= NETIF_F_RXCSUM; 593 features |= NETIF_F_RXCSUM;
594 features |= NETIF_F_LLTX;
593 595
594 return features; 596 return features;
595} 597}