macvlan: fix netdev feature propagation from lower device
authorFlorian Westphal <fw@strlen.de>
Thu, 26 Dec 2013 11:17:00 +0000 (12:17 +0100)
committerDavid S. Miller <davem@davemloft.net>
Thu, 26 Dec 2013 18:41:00 +0000 (13:41 -0500)
commit797f87f83b60685ff8a13fa0572d2f10393c50d3
tree3ccec3d1c8085f47cb064e0e47490e459c4248bc
parent61e7f09d0f437c9614029445754099383ec2eec4
macvlan: fix netdev feature propagation from lower device

There are inconsistencies wrt. feature propagation/inheritance between
macvlan and the underlying interface.

When a feature is turned off on the real device before a macvlan is
created on top, these will remain enabled on the macvlan device, whereas
turning off the feature on the lower device after macvlan creation the
kernel will propagate the changes to the macvlan.

The second issue is that, when propagating changes from underlying device
to the macvlan interface, macvlan can erronously lose its NETIF_F_LLTX flag,
as features are anded with the underlying device.

However, LLTX should be kept since it has no dependencies on physical
hardware (LLTX is set on macvlan creation regardless of the lower
device properties, see 8ffab51b3dfc54876f145f15b351c41f3f703195
(macvlan: lockless tx path).

The LLTX flag is now forced regardless of user settings in absence of
layer2 hw acceleration (a6cc0cfa72e0b6d9f2c8fd858aa,
net: Add layer 2 hardware acceleration operations for macvlan devices).

Use netdev_increment_features to rebuild the feature set on capability
changes on either the lower device or on the macvlan interface.

As pointed out by Ben Hutchings, use netdev_update_features on
NETDEV_FEAT_CHANGE event (it calls macvlan_fix_features/netdev_features_change
if needed).

Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/macvlan.c