diff options
Diffstat (limited to 'drivers/net/macvlan.c')
| -rw-r--r-- | drivers/net/macvlan.c | 21 | 
1 files changed, 14 insertions, 7 deletions
| diff --git a/drivers/net/macvlan.c b/drivers/net/macvlan.c index 753a8c23d15d..d53e299ae1d9 100644 --- a/drivers/net/macvlan.c +++ b/drivers/net/macvlan.c @@ -263,11 +263,9 @@ static int macvlan_queue_xmit(struct sk_buff *skb, struct net_device *dev)  	const struct macvlan_dev *vlan = netdev_priv(dev);  	const struct macvlan_port *port = vlan->port;  	const struct macvlan_dev *dest; -	__u8 ip_summed = skb->ip_summed;  	if (vlan->mode == MACVLAN_MODE_BRIDGE) {  		const struct ethhdr *eth = (void *)skb->data; -		skb->ip_summed = CHECKSUM_UNNECESSARY;  		/* send to other bridge ports directly */  		if (is_multicast_ether_addr(eth->h_dest)) { @@ -285,7 +283,6 @@ static int macvlan_queue_xmit(struct sk_buff *skb, struct net_device *dev)  	}  xmit_world: -	skb->ip_summed = ip_summed;  	skb->dev = vlan->lowerdev;  	return dev_queue_xmit(skb);  } @@ -461,8 +458,10 @@ static void macvlan_change_rx_flags(struct net_device *dev, int change)  	struct macvlan_dev *vlan = netdev_priv(dev);  	struct net_device *lowerdev = vlan->lowerdev; -	if (change & IFF_ALLMULTI) -		dev_set_allmulti(lowerdev, dev->flags & IFF_ALLMULTI ? 1 : -1); +	if (dev->flags & IFF_UP) { +		if (change & IFF_ALLMULTI) +			dev_set_allmulti(lowerdev, dev->flags & IFF_ALLMULTI ? 1 : -1); +	}  }  static void macvlan_set_mac_lists(struct net_device *dev) @@ -518,6 +517,11 @@ static struct lock_class_key macvlan_netdev_addr_lock_key;  #define MACVLAN_STATE_MASK \  	((1<<__LINK_STATE_NOCARRIER) | (1<<__LINK_STATE_DORMANT)) +static int macvlan_get_nest_level(struct net_device *dev) +{ +	return ((struct macvlan_dev *)netdev_priv(dev))->nest_level; +} +  static void macvlan_set_lockdep_class_one(struct net_device *dev,  					  struct netdev_queue *txq,  					  void *_unused) @@ -528,8 +532,9 @@ static void macvlan_set_lockdep_class_one(struct net_device *dev,  static void macvlan_set_lockdep_class(struct net_device *dev)  { -	lockdep_set_class(&dev->addr_list_lock, -			  &macvlan_netdev_addr_lock_key); +	lockdep_set_class_and_subclass(&dev->addr_list_lock, +				       &macvlan_netdev_addr_lock_key, +				       macvlan_get_nest_level(dev));  	netdev_for_each_tx_queue(dev, macvlan_set_lockdep_class_one, NULL);  } @@ -724,6 +729,7 @@ static const struct net_device_ops macvlan_netdev_ops = {  	.ndo_fdb_add		= macvlan_fdb_add,  	.ndo_fdb_del		= macvlan_fdb_del,  	.ndo_fdb_dump		= ndo_dflt_fdb_dump, +	.ndo_get_lock_subclass  = macvlan_get_nest_level,  };  void macvlan_common_setup(struct net_device *dev) @@ -852,6 +858,7 @@ int macvlan_common_newlink(struct net *src_net, struct net_device *dev,  	vlan->dev      = dev;  	vlan->port     = port;  	vlan->set_features = MACVLAN_FEATURES; +	vlan->nest_level = dev_get_nest_level(lowerdev, netif_is_macvlan) + 1;  	vlan->mode     = MACVLAN_MODE_VEPA;  	if (data && data[IFLA_MACVLAN_MODE]) | 

