diff options
-rw-r--r-- | drivers/net/macvlan.c | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/drivers/net/macvlan.c b/drivers/net/macvlan.c index b227a13f6473..9f59f17dc317 100644 --- a/drivers/net/macvlan.c +++ b/drivers/net/macvlan.c | |||
@@ -599,10 +599,18 @@ static int macvlan_open(struct net_device *dev) | |||
599 | goto del_unicast; | 599 | goto del_unicast; |
600 | } | 600 | } |
601 | 601 | ||
602 | if (dev->flags & IFF_PROMISC) { | ||
603 | err = dev_set_promiscuity(lowerdev, 1); | ||
604 | if (err < 0) | ||
605 | goto clear_multi; | ||
606 | } | ||
607 | |||
602 | hash_add: | 608 | hash_add: |
603 | macvlan_hash_add(vlan); | 609 | macvlan_hash_add(vlan); |
604 | return 0; | 610 | return 0; |
605 | 611 | ||
612 | clear_multi: | ||
613 | dev_set_allmulti(lowerdev, -1); | ||
606 | del_unicast: | 614 | del_unicast: |
607 | dev_uc_del(lowerdev, dev->dev_addr); | 615 | dev_uc_del(lowerdev, dev->dev_addr); |
608 | out: | 616 | out: |
@@ -638,6 +646,9 @@ static int macvlan_stop(struct net_device *dev) | |||
638 | if (dev->flags & IFF_ALLMULTI) | 646 | if (dev->flags & IFF_ALLMULTI) |
639 | dev_set_allmulti(lowerdev, -1); | 647 | dev_set_allmulti(lowerdev, -1); |
640 | 648 | ||
649 | if (dev->flags & IFF_PROMISC) | ||
650 | dev_set_promiscuity(lowerdev, -1); | ||
651 | |||
641 | dev_uc_del(lowerdev, dev->dev_addr); | 652 | dev_uc_del(lowerdev, dev->dev_addr); |
642 | 653 | ||
643 | hash_del: | 654 | hash_del: |
@@ -696,6 +707,10 @@ static void macvlan_change_rx_flags(struct net_device *dev, int change) | |||
696 | if (dev->flags & IFF_UP) { | 707 | if (dev->flags & IFF_UP) { |
697 | if (change & IFF_ALLMULTI) | 708 | if (change & IFF_ALLMULTI) |
698 | dev_set_allmulti(lowerdev, dev->flags & IFF_ALLMULTI ? 1 : -1); | 709 | dev_set_allmulti(lowerdev, dev->flags & IFF_ALLMULTI ? 1 : -1); |
710 | if (change & IFF_PROMISC) | ||
711 | dev_set_promiscuity(lowerdev, | ||
712 | dev->flags & IFF_PROMISC ? 1 : -1); | ||
713 | |||
699 | } | 714 | } |
700 | } | 715 | } |
701 | 716 | ||