ixgbevf: Set Rx hash type for ingress packets
authorFan Du <fan.du@intel.com>
Wed, 29 Apr 2015 02:57:40 +0000 (10:57 +0800)
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>
Sat, 18 Jul 2015 02:59:07 +0000 (19:59 -0700)
Set hash type for ingress packets according to NIC
advanced receive descriptors RSS type part.

Signed-off-by: Fan Du <fan.du@intel.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/defines.h
drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c

index 770e21a643880a9032cdc5b1e6460075acfd7250..58434584b16d9034f762ba85c71ab8251642e66e 100644 (file)
@@ -161,6 +161,18 @@ typedef u32 ixgbe_link_speed;
 #define IXGBE_RXDADV_SPLITHEADER_EN    0x00001000
 #define IXGBE_RXDADV_SPH               0x8000
 
+/* RSS Hash results */
+#define IXGBE_RXDADV_RSSTYPE_NONE              0x00000000
+#define IXGBE_RXDADV_RSSTYPE_IPV4_TCP          0x00000001
+#define IXGBE_RXDADV_RSSTYPE_IPV4              0x00000002
+#define IXGBE_RXDADV_RSSTYPE_IPV6_TCP          0x00000003
+#define IXGBE_RXDADV_RSSTYPE_IPV6_EX           0x00000004
+#define IXGBE_RXDADV_RSSTYPE_IPV6              0x00000005
+#define IXGBE_RXDADV_RSSTYPE_IPV6_TCP_EX       0x00000006
+#define IXGBE_RXDADV_RSSTYPE_IPV4_UDP          0x00000007
+#define IXGBE_RXDADV_RSSTYPE_IPV6_UDP          0x00000008
+#define IXGBE_RXDADV_RSSTYPE_IPV6_UDP_EX       0x00000009
+
 #define IXGBE_RXD_ERR_FRAME_ERR_MASK ( \
                                      IXGBE_RXD_ERR_CE |  \
                                      IXGBE_RXD_ERR_LE |  \
index acfa05154436cc75dac90887c813b4053419d1d9..b2c86f1b8a9fafa5015b85f81bb2817fb806f77f 100644 (file)
@@ -457,6 +457,32 @@ static void ixgbevf_rx_skb(struct ixgbevf_q_vector *q_vector,
        napi_gro_receive(&q_vector->napi, skb);
 }
 
+#define IXGBE_RSS_L4_TYPES_MASK \
+       ((1ul << IXGBE_RXDADV_RSSTYPE_IPV4_TCP) | \
+        (1ul << IXGBE_RXDADV_RSSTYPE_IPV4_UDP) | \
+        (1ul << IXGBE_RXDADV_RSSTYPE_IPV6_TCP) | \
+        (1ul << IXGBE_RXDADV_RSSTYPE_IPV6_UDP))
+
+static inline void ixgbevf_rx_hash(struct ixgbevf_ring *ring,
+                                  union ixgbe_adv_rx_desc *rx_desc,
+                                  struct sk_buff *skb)
+{
+       u16 rss_type;
+
+       if (!(ring->netdev->features & NETIF_F_RXHASH))
+               return;
+
+       rss_type = le16_to_cpu(rx_desc->wb.lower.lo_dword.hs_rss.pkt_info) &
+                  IXGBE_RXDADV_RSSTYPE_MASK;
+
+       if (!rss_type)
+               return;
+
+       skb_set_hash(skb, le32_to_cpu(rx_desc->wb.lower.hi_dword.rss),
+                    (IXGBE_RSS_L4_TYPES_MASK & (1ul << rss_type)) ?
+                    PKT_HASH_TYPE_L4 : PKT_HASH_TYPE_L3);
+}
+
 /**
  * ixgbevf_rx_checksum - indicate in skb if hw indicated a good cksum
  * @ring: structure containig ring specific data
@@ -506,6 +532,7 @@ static void ixgbevf_process_skb_fields(struct ixgbevf_ring *rx_ring,
                                       union ixgbe_adv_rx_desc *rx_desc,
                                       struct sk_buff *skb)
 {
+       ixgbevf_rx_hash(rx_ring, rx_desc, skb);
        ixgbevf_rx_checksum(rx_ring, rx_desc, skb);
 
        if (ixgbevf_test_staterr(rx_desc, IXGBE_RXD_STAT_VP)) {