hv_netvsc: filter multicast/broadcast
authorStephen Hemminger <stephen@networkplumber.org>
Fri, 2 Mar 2018 21:49:08 +0000 (13:49 -0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 30 May 2018 05:52:11 +0000 (07:52 +0200)
[ Upstream commit 009f766ca2383d8788acd65c2c36c51bbfb19470 ]

The netvsc driver was always enabling all multicast and broadcast
even if netdevice flag had not enabled it.

Signed-off-by: Stephen Hemminger <sthemmin@microsoft.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/net/hyperv/rndis_filter.c

index 6dde92c1c113383a83b165c1a2d6c54b7bf4fc24..e1827e221c74ddb164be4e737bdeacbb08a47280 100644 (file)
@@ -850,15 +850,19 @@ static void rndis_set_multicast(struct work_struct *w)
 {
        struct rndis_device *rdev
                = container_of(w, struct rndis_device, mcast_work);
+       u32 filter = NDIS_PACKET_TYPE_DIRECTED;
+       unsigned int flags = rdev->ndev->flags;
 
-       if (rdev->ndev->flags & IFF_PROMISC)
-               rndis_filter_set_packet_filter(rdev,
-                                              NDIS_PACKET_TYPE_PROMISCUOUS);
-       else
-               rndis_filter_set_packet_filter(rdev,
-                                              NDIS_PACKET_TYPE_BROADCAST |
-                                              NDIS_PACKET_TYPE_ALL_MULTICAST |
-                                              NDIS_PACKET_TYPE_DIRECTED);
+       if (flags & IFF_PROMISC) {
+               filter = NDIS_PACKET_TYPE_PROMISCUOUS;
+       } else {
+               if (flags & IFF_ALLMULTI)
+                       flags |= NDIS_PACKET_TYPE_ALL_MULTICAST;
+               if (flags & IFF_BROADCAST)
+                       flags |= NDIS_PACKET_TYPE_BROADCAST;
+       }
+
+       rndis_filter_set_packet_filter(rdev, filter);
 }
 
 void rndis_filter_update(struct netvsc_device *nvdev)