net/enic: fix receive packet types
authorHyong Youb Kim <hyonkim@cisco.com>
Fri, 29 Jun 2018 09:29:30 +0000 (02:29 -0700)
committerFerruh Yigit <ferruh.yigit@intel.com>
Mon, 2 Jul 2018 23:49:51 +0000 (01:49 +0200)
Fix missing or incorrect packet types discovered by DTS.
- Non-IP inner packets
  Set the tunnel flag.
- Inner Ethernet packets
  All supported tunnel packets have Ethernet as inner packets. So, set
  INNER_L2_ETHER for all tunnel types.
- IPv4 fragments carrying TCP/UDP
  The NIC indicates TCP/UDP based on the protocol in IP header. For
  fragments, ignore that bit and always set L4_FRAG.
- IPv6 fragments
  The NIC does regconize fragments (IPv6 packets with fragment extension
  headers). Set packet types for these.

Fixes: 93fb21fdbe23 ("net/enic: enable overlay offload for VXLAN and GENEVE")
Cc: stable@dpdk.org
Signed-off-by: Hyong Youb Kim <hyonkim@cisco.com>
Reviewed-by: John Daley <johndale@cisco.com>
drivers/net/enic/enic_rxtx.c

index 8853a20..bbb0444 100644 (file)
@@ -137,51 +137,81 @@ enic_cq_rx_flags_to_pkt_type(struct cq_desc *cqd, uint8_t tnl)
         */
        static const uint32_t cq_type_table[128] __rte_cache_aligned = {
                [0x00] = RTE_PTYPE_UNKNOWN,
+               [0x01] = RTE_PTYPE_UNKNOWN |
+                        RTE_PTYPE_TUNNEL_GRENAT |
+                        RTE_PTYPE_INNER_L2_ETHER,
                [0x20] = RTE_PTYPE_L3_IPV4_EXT_UNKNOWN | RTE_PTYPE_L4_NONFRAG,
                [0x21] = RTE_PTYPE_L3_IPV4_EXT_UNKNOWN | RTE_PTYPE_L4_NONFRAG |
                         RTE_PTYPE_TUNNEL_GRENAT |
+                        RTE_PTYPE_INNER_L2_ETHER |
                         RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN |
                         RTE_PTYPE_INNER_L4_NONFRAG,
                [0x22] = RTE_PTYPE_L3_IPV4_EXT_UNKNOWN | RTE_PTYPE_L4_UDP,
                [0x23] = RTE_PTYPE_L3_IPV4_EXT_UNKNOWN | RTE_PTYPE_L4_UDP |
                         RTE_PTYPE_TUNNEL_GRENAT |
+                        RTE_PTYPE_INNER_L2_ETHER |
                         RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN |
                         RTE_PTYPE_INNER_L4_UDP,
                [0x24] = RTE_PTYPE_L3_IPV4_EXT_UNKNOWN | RTE_PTYPE_L4_TCP,
                [0x25] = RTE_PTYPE_L3_IPV4_EXT_UNKNOWN | RTE_PTYPE_L4_TCP |
                         RTE_PTYPE_TUNNEL_GRENAT |
+                        RTE_PTYPE_INNER_L2_ETHER |
                         RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN |
                         RTE_PTYPE_INNER_L4_TCP,
                [0x60] = RTE_PTYPE_L3_IPV4_EXT_UNKNOWN | RTE_PTYPE_L4_FRAG,
                [0x61] = RTE_PTYPE_L3_IPV4_EXT_UNKNOWN | RTE_PTYPE_L4_FRAG |
                         RTE_PTYPE_TUNNEL_GRENAT |
+                        RTE_PTYPE_INNER_L2_ETHER |
                         RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN |
                         RTE_PTYPE_INNER_L4_FRAG,
-               [0x62] = RTE_PTYPE_L3_IPV4_EXT_UNKNOWN | RTE_PTYPE_L4_UDP,
-               [0x63] = RTE_PTYPE_L3_IPV4_EXT_UNKNOWN | RTE_PTYPE_L4_UDP |
+               [0x62] = RTE_PTYPE_L3_IPV4_EXT_UNKNOWN | RTE_PTYPE_L4_FRAG,
+               [0x63] = RTE_PTYPE_L3_IPV4_EXT_UNKNOWN | RTE_PTYPE_L4_FRAG |
                         RTE_PTYPE_TUNNEL_GRENAT |
+                        RTE_PTYPE_INNER_L2_ETHER |
                         RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN |
-                        RTE_PTYPE_INNER_L4_UDP,
-               [0x64] = RTE_PTYPE_L3_IPV4_EXT_UNKNOWN | RTE_PTYPE_L4_TCP,
-               [0x65] = RTE_PTYPE_L3_IPV4_EXT_UNKNOWN | RTE_PTYPE_L4_TCP |
+                        RTE_PTYPE_INNER_L4_FRAG,
+               [0x64] = RTE_PTYPE_L3_IPV4_EXT_UNKNOWN | RTE_PTYPE_L4_FRAG,
+               [0x65] = RTE_PTYPE_L3_IPV4_EXT_UNKNOWN | RTE_PTYPE_L4_FRAG |
                         RTE_PTYPE_TUNNEL_GRENAT |
+                        RTE_PTYPE_INNER_L2_ETHER |
                         RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN |
-                        RTE_PTYPE_INNER_L4_TCP,
+                        RTE_PTYPE_INNER_L4_FRAG,
                [0x10] = RTE_PTYPE_L3_IPV6_EXT_UNKNOWN | RTE_PTYPE_L4_NONFRAG,
                [0x11] = RTE_PTYPE_L3_IPV6_EXT_UNKNOWN | RTE_PTYPE_L4_NONFRAG |
                         RTE_PTYPE_TUNNEL_GRENAT |
+                        RTE_PTYPE_INNER_L2_ETHER |
                         RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN |
                         RTE_PTYPE_INNER_L4_NONFRAG,
                [0x12] = RTE_PTYPE_L3_IPV6_EXT_UNKNOWN | RTE_PTYPE_L4_UDP,
                [0x13] = RTE_PTYPE_L3_IPV6_EXT_UNKNOWN | RTE_PTYPE_L4_UDP |
                         RTE_PTYPE_TUNNEL_GRENAT |
+                        RTE_PTYPE_INNER_L2_ETHER |
                         RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN |
                         RTE_PTYPE_INNER_L4_UDP,
                [0x14] = RTE_PTYPE_L3_IPV6_EXT_UNKNOWN | RTE_PTYPE_L4_TCP,
                [0x15] = RTE_PTYPE_L3_IPV6_EXT_UNKNOWN | RTE_PTYPE_L4_TCP |
                         RTE_PTYPE_TUNNEL_GRENAT |
+                        RTE_PTYPE_INNER_L2_ETHER |
                         RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN |
                         RTE_PTYPE_INNER_L4_TCP,
+               [0x50] = RTE_PTYPE_L3_IPV6_EXT_UNKNOWN | RTE_PTYPE_L4_FRAG,
+               [0x51] = RTE_PTYPE_L3_IPV6_EXT_UNKNOWN | RTE_PTYPE_L4_FRAG |
+                        RTE_PTYPE_TUNNEL_GRENAT |
+                        RTE_PTYPE_INNER_L2_ETHER |
+                        RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN |
+                        RTE_PTYPE_INNER_L4_FRAG,
+               [0x52] = RTE_PTYPE_L3_IPV6_EXT_UNKNOWN | RTE_PTYPE_L4_FRAG,
+               [0x53] = RTE_PTYPE_L3_IPV6_EXT_UNKNOWN | RTE_PTYPE_L4_FRAG |
+                        RTE_PTYPE_TUNNEL_GRENAT |
+                        RTE_PTYPE_INNER_L2_ETHER |
+                        RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN |
+                        RTE_PTYPE_INNER_L4_FRAG,
+               [0x54] = RTE_PTYPE_L3_IPV6_EXT_UNKNOWN | RTE_PTYPE_L4_FRAG,
+               [0x55] = RTE_PTYPE_L3_IPV6_EXT_UNKNOWN | RTE_PTYPE_L4_FRAG |
+                        RTE_PTYPE_TUNNEL_GRENAT |
+                        RTE_PTYPE_INNER_L2_ETHER |
+                        RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN |
+                        RTE_PTYPE_INNER_L4_FRAG,
                /* All others reserved */
        };
        cqrd_flags &= CQ_ENET_RQ_DESC_FLAGS_IPV4_FRAGMENT