ixgbevf: fix skb->pkt_type checks
authorFlorian Fainelli <f.fainelli@gmail.com>
Fri, 28 Feb 2014 23:46:49 +0000 (15:46 -0800)
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>
Sat, 8 Mar 2014 08:14:49 +0000 (00:14 -0800)
skb->pkt_type is not a bitmask, but contains only value at a time from
the range defined in include/uapi/linux/if_packet.h.

Checking it like if it was a bitmask of values would also cause
PACKET_OTHERHOST, PACKET_LOOPBACK and PACKET_FASTROUTE to be matched by
this check since their lower 2 bits are also set, although that does not
fix a real bug, it is still potentially confusing.

This bogus check was introduced in commit 815cccbf ("ixgbe: add setlink,
getlink support to ixgbe and ixgbevf").

Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
Tested-by: Phil Schmitt <phillip.j.schmitt@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c

index 57e0cd8..6ac5da2 100644 (file)
@@ -516,7 +516,8 @@ static int ixgbevf_clean_rx_irq(struct ixgbevf_q_vector *q_vector,
                /* Workaround hardware that can't do proper VEPA multicast
                 * source pruning.
                 */
-               if ((skb->pkt_type & (PACKET_BROADCAST | PACKET_MULTICAST)) &&
+               if ((skb->pkt_type == PACKET_BROADCAST ||
+                   skb->pkt_type == PACKET_MULTICAST) &&
                    ether_addr_equal(rx_ring->netdev->dev_addr,
                                     eth_hdr(skb)->h_source)) {
                        dev_kfree_skb_irq(skb);