Skip to content

Commit

Permalink
macvlan: Propagate promiscuity setting to lower devices.
Browse files Browse the repository at this point in the history
When a macvlan device is placed in promiscuous mode, it currently
just sets it's multicast mask to permissive, but doesn't change
the state of the lower device.  As a result, not all multicast
traffic can be received on such device.  Additionally, none of
a vlan traffic can be received on such device as well.
This patch propagates the promiscuous mode setting to lower device
so that lower device may receive all packets that macvlan may
be interested in.

Signed-off-by: Vladislav Yasevich <vyasevic@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Vlad Yasevich authored and David S. Miller committed May 4, 2015
1 parent 2e70aed commit efdbd2b
Showing 1 changed file with 15 additions and 0 deletions.
15 changes: 15 additions & 0 deletions drivers/net/macvlan.c
Original file line number Diff line number Diff line change
Expand Up @@ -599,10 +599,18 @@ static int macvlan_open(struct net_device *dev)
goto del_unicast;
}

if (dev->flags & IFF_PROMISC) {
err = dev_set_promiscuity(lowerdev, 1);
if (err < 0)
goto clear_multi;
}

hash_add:
macvlan_hash_add(vlan);
return 0;

clear_multi:
dev_set_allmulti(lowerdev, -1);
del_unicast:
dev_uc_del(lowerdev, dev->dev_addr);
out:
Expand Down Expand Up @@ -638,6 +646,9 @@ static int macvlan_stop(struct net_device *dev)
if (dev->flags & IFF_ALLMULTI)
dev_set_allmulti(lowerdev, -1);

if (dev->flags & IFF_PROMISC)
dev_set_promiscuity(lowerdev, -1);

dev_uc_del(lowerdev, dev->dev_addr);

hash_del:
Expand Down Expand Up @@ -696,6 +707,10 @@ static void macvlan_change_rx_flags(struct net_device *dev, int change)
if (dev->flags & IFF_UP) {
if (change & IFF_ALLMULTI)
dev_set_allmulti(lowerdev, dev->flags & IFF_ALLMULTI ? 1 : -1);
if (change & IFF_PROMISC)
dev_set_promiscuity(lowerdev,
dev->flags & IFF_PROMISC ? 1 : -1);

}
}

Expand Down

0 comments on commit efdbd2b

Please sign in to comment.