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) | |||
263 | const struct macvlan_dev *vlan = netdev_priv(dev); | 263 | const struct macvlan_dev *vlan = netdev_priv(dev); |
264 | const struct macvlan_port *port = vlan->port; | 264 | const struct macvlan_port *port = vlan->port; |
265 | const struct macvlan_dev *dest; | 265 | const struct macvlan_dev *dest; |
266 | __u8 ip_summed = skb->ip_summed; | ||
267 | 266 | ||
268 | if (vlan->mode == MACVLAN_MODE_BRIDGE) { | 267 | if (vlan->mode == MACVLAN_MODE_BRIDGE) { |
269 | const struct ethhdr *eth = (void *)skb->data; | 268 | const struct ethhdr *eth = (void *)skb->data; |
270 | skb->ip_summed = CHECKSUM_UNNECESSARY; | ||
271 | 269 | ||
272 | /* send to other bridge ports directly */ | 270 | /* send to other bridge ports directly */ |
273 | if (is_multicast_ether_addr(eth->h_dest)) { | 271 | 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) | |||
285 | } | 283 | } |
286 | 284 | ||
287 | xmit_world: | 285 | xmit_world: |
288 | skb->ip_summed = ip_summed; | ||
289 | skb->dev = vlan->lowerdev; | 286 | skb->dev = vlan->lowerdev; |
290 | return dev_queue_xmit(skb); | 287 | return dev_queue_xmit(skb); |
291 | } | 288 | } |
@@ -461,8 +458,10 @@ static void macvlan_change_rx_flags(struct net_device *dev, int change) | |||
461 | struct macvlan_dev *vlan = netdev_priv(dev); | 458 | struct macvlan_dev *vlan = netdev_priv(dev); |
462 | struct net_device *lowerdev = vlan->lowerdev; | 459 | struct net_device *lowerdev = vlan->lowerdev; |
463 | 460 | ||
464 | if (change & IFF_ALLMULTI) | 461 | if (dev->flags & IFF_UP) { |
465 | dev_set_allmulti(lowerdev, dev->flags & IFF_ALLMULTI ? 1 : -1); | 462 | if (change & IFF_ALLMULTI) |
463 | dev_set_allmulti(lowerdev, dev->flags & IFF_ALLMULTI ? 1 : -1); | ||
464 | } | ||
466 | } | 465 | } |
467 | 466 | ||
468 | static void macvlan_set_mac_lists(struct net_device *dev) | 467 | static void macvlan_set_mac_lists(struct net_device *dev) |
@@ -518,6 +517,11 @@ static struct lock_class_key macvlan_netdev_addr_lock_key; | |||
518 | #define MACVLAN_STATE_MASK \ | 517 | #define MACVLAN_STATE_MASK \ |
519 | ((1<<__LINK_STATE_NOCARRIER) | (1<<__LINK_STATE_DORMANT)) | 518 | ((1<<__LINK_STATE_NOCARRIER) | (1<<__LINK_STATE_DORMANT)) |
520 | 519 | ||
520 | static int macvlan_get_nest_level(struct net_device *dev) | ||
521 | { | ||
522 | return ((struct macvlan_dev *)netdev_priv(dev))->nest_level; | ||
523 | } | ||
524 | |||
521 | static void macvlan_set_lockdep_class_one(struct net_device *dev, | 525 | static void macvlan_set_lockdep_class_one(struct net_device *dev, |
522 | struct netdev_queue *txq, | 526 | struct netdev_queue *txq, |
523 | void *_unused) | 527 | void *_unused) |
@@ -528,8 +532,9 @@ static void macvlan_set_lockdep_class_one(struct net_device *dev, | |||
528 | 532 | ||
529 | static void macvlan_set_lockdep_class(struct net_device *dev) | 533 | static void macvlan_set_lockdep_class(struct net_device *dev) |
530 | { | 534 | { |
531 | lockdep_set_class(&dev->addr_list_lock, | 535 | lockdep_set_class_and_subclass(&dev->addr_list_lock, |
532 | &macvlan_netdev_addr_lock_key); | 536 | &macvlan_netdev_addr_lock_key, |
537 | macvlan_get_nest_level(dev)); | ||
533 | netdev_for_each_tx_queue(dev, macvlan_set_lockdep_class_one, NULL); | 538 | netdev_for_each_tx_queue(dev, macvlan_set_lockdep_class_one, NULL); |
534 | } | 539 | } |
535 | 540 | ||
@@ -724,6 +729,7 @@ static const struct net_device_ops macvlan_netdev_ops = { | |||
724 | .ndo_fdb_add = macvlan_fdb_add, | 729 | .ndo_fdb_add = macvlan_fdb_add, |
725 | .ndo_fdb_del = macvlan_fdb_del, | 730 | .ndo_fdb_del = macvlan_fdb_del, |
726 | .ndo_fdb_dump = ndo_dflt_fdb_dump, | 731 | .ndo_fdb_dump = ndo_dflt_fdb_dump, |
732 | .ndo_get_lock_subclass = macvlan_get_nest_level, | ||
727 | }; | 733 | }; |
728 | 734 | ||
729 | void macvlan_common_setup(struct net_device *dev) | 735 | void macvlan_common_setup(struct net_device *dev) |
@@ -852,6 +858,7 @@ int macvlan_common_newlink(struct net *src_net, struct net_device *dev, | |||
852 | vlan->dev = dev; | 858 | vlan->dev = dev; |
853 | vlan->port = port; | 859 | vlan->port = port; |
854 | vlan->set_features = MACVLAN_FEATURES; | 860 | vlan->set_features = MACVLAN_FEATURES; |
861 | vlan->nest_level = dev_get_nest_level(lowerdev, netif_is_macvlan) + 1; | ||
855 | 862 | ||
856 | vlan->mode = MACVLAN_MODE_VEPA; | 863 | vlan->mode = MACVLAN_MODE_VEPA; |
857 | if (data && data[IFLA_MACVLAN_MODE]) | 864 | if (data && data[IFLA_MACVLAN_MODE]) |