net/ice/base: support RSS for GRE tunnel
[dpdk.git] / drivers / net / ice / base / ice_switch.c
index 763c7b8..2d8904d 100644 (file)
 #define ICE_ETH_ETHTYPE_OFFSET         12
 #define ICE_ETH_VLAN_TCI_OFFSET                14
 #define ICE_MAX_VLAN_ID                        0xFFF
+#define ICE_IPV6_ETHER_ID              0x86DD
 #define ICE_IPV4_NVGRE_PROTO_ID                0x002F
 #define ICE_PPP_IPV6_PROTO_ID          0x0057
-#define ICE_IPV6_ETHER_ID              0x86DD
 #define ICE_TCP_PROTO_ID               0x06
+#define ICE_GTPU_PROFILE               24
 #define ICE_ETH_P_8021Q                        0x8100
+#define ICE_MPLS_ETHER_ID              0x8847
 
 /* Dummy ethernet header needed in the ice_aqc_sw_rules_elem
  * struct to configure any switch filter rules.
@@ -258,8 +260,8 @@ static const u8 dummy_udp_packet[] = {
 /* offset info for MAC + VLAN + IPv4 + UDP dummy packet */
 static const struct ice_dummy_pkt_offsets dummy_vlan_udp_packet_offsets[] = {
        { ICE_MAC_OFOS,         0 },
-       { ICE_ETYPE_OL,         12 },
-       { ICE_VLAN_OFOS,        14 },
+       { ICE_VLAN_OFOS,        12 },
+       { ICE_ETYPE_OL,         16 },
        { ICE_IPV4_OFOS,        18 },
        { ICE_UDP_ILOS,         38 },
        { ICE_PROTOCOL_LAST,    0 },
@@ -271,9 +273,9 @@ static const u8 dummy_vlan_udp_packet[] = {
        0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00,
 
-       0x81, 0x00,             /* ICE_ETYPE_OL 12 */
+       0x81, 0x00, 0x00, 0x00, /* ICE_VLAN_OFOS 12 */
 
-       0x00, 0x00, 0x08, 0x00, /* ICE_VLAN_OFOS 14 */
+       0x08, 0x00,             /* ICE_ETYPE_OL 16 */
 
        0x45, 0x00, 0x00, 0x1c, /* ICE_IPV4_OFOS 18 */
        0x00, 0x01, 0x00, 0x00,
@@ -319,11 +321,30 @@ static const u8 dummy_tcp_packet[] = {
        0x00, 0x00,     /* 2 bytes for 4 byte alignment */
 };
 
+/* offset info for MAC + MPLS dummy packet */
+static const struct ice_dummy_pkt_offsets dummy_mpls_packet_offsets[] = {
+       { ICE_MAC_OFOS,         0 },
+       { ICE_ETYPE_OL,         12 },
+       { ICE_PROTOCOL_LAST,    0 },
+};
+
+/* Dummy packet for MAC + MPLS */
+static const u8 dummy_mpls_packet[] = {
+       0x00, 0x00, 0x00, 0x00, /* ICE_MAC_OFOS 0 */
+       0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00,
+
+       0x88, 0x47,             /* ICE_ETYPE_OL 12 */
+       0x00, 0x00, 0x01, 0x00,
+
+       0x00, 0x00,     /* 2 bytes for 4 byte alignment */
+};
+
 /* offset info for MAC + VLAN (C-tag, 802.1Q) + IPv4 + TCP dummy packet */
 static const struct ice_dummy_pkt_offsets dummy_vlan_tcp_packet_offsets[] = {
        { ICE_MAC_OFOS,         0 },
-       { ICE_ETYPE_OL,         12 },
-       { ICE_VLAN_OFOS,        14 },
+       { ICE_VLAN_OFOS,        12 },
+       { ICE_ETYPE_OL,         16 },
        { ICE_IPV4_OFOS,        18 },
        { ICE_TCP_IL,           38 },
        { ICE_PROTOCOL_LAST,    0 },
@@ -335,9 +356,9 @@ static const u8 dummy_vlan_tcp_packet[] = {
        0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00,
 
-       0x81, 0x00,             /* ICE_ETYPE_OL 12 */
+       0x81, 0x00, 0x00, 0x00, /* ICE_VLAN_OFOS 12 */
 
-       0x00, 0x00, 0x08, 0x00, /* ICE_VLAN_OFOS 14 */
+       0x08, 0x00,             /* ICE_ETYPE_OL 16 */
 
        0x45, 0x00, 0x00, 0x28, /* ICE_IPV4_OFOS 18 */
        0x00, 0x01, 0x00, 0x00,
@@ -393,8 +414,8 @@ static const u8 dummy_tcp_ipv6_packet[] = {
 static const struct ice_dummy_pkt_offsets
 dummy_vlan_tcp_ipv6_packet_offsets[] = {
        { ICE_MAC_OFOS,         0 },
-       { ICE_ETYPE_OL,         12 },
-       { ICE_VLAN_OFOS,        14 },
+       { ICE_VLAN_OFOS,        12 },
+       { ICE_ETYPE_OL,         16 },
        { ICE_IPV6_OFOS,        18 },
        { ICE_TCP_IL,           58 },
        { ICE_PROTOCOL_LAST,    0 },
@@ -406,9 +427,9 @@ static const u8 dummy_vlan_tcp_ipv6_packet[] = {
        0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00,
 
-       0x81, 0x00,             /* ICE_ETYPE_OL 12 */
+       0x81, 0x00, 0x00, 0x00, /* ICE_VLAN_OFOS 12 */
 
-       0x00, 0x00, 0x86, 0xDD, /* ICE_VLAN_OFOS 14 */
+       0x86, 0xDD,             /* ICE_ETYPE_OL 16 */
 
        0x60, 0x00, 0x00, 0x00, /* ICE_IPV6_OFOS 18 */
        0x00, 0x14, 0x06, 0x00, /* Next header is TCP */
@@ -471,8 +492,8 @@ static const u8 dummy_udp_ipv6_packet[] = {
 static const struct ice_dummy_pkt_offsets
 dummy_vlan_udp_ipv6_packet_offsets[] = {
        { ICE_MAC_OFOS,         0 },
-       { ICE_ETYPE_OL,         12 },
-       { ICE_VLAN_OFOS,        14 },
+       { ICE_VLAN_OFOS,        12 },
+       { ICE_ETYPE_OL,         16 },
        { ICE_IPV6_OFOS,        18 },
        { ICE_UDP_ILOS,         58 },
        { ICE_PROTOCOL_LAST,    0 },
@@ -484,9 +505,9 @@ static const u8 dummy_vlan_udp_ipv6_packet[] = {
        0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00,
 
-       0x81, 0x00,             /* ICE_ETYPE_OL 12 */
+       0x81, 0x00, 0x00, 0x00,/* ICE_VLAN_OFOS 12 */
 
-       0x00, 0x00, 0x86, 0xDD, /* ICE_VLAN_OFOS 14 */
+       0x86, 0xDD,             /* ICE_ETYPE_OL 16 */
 
        0x60, 0x00, 0x00, 0x00, /* ICE_IPV6_OFOS 18 */
        0x00, 0x08, 0x11, 0x00, /* Next header UDP */
@@ -807,7 +828,7 @@ static const struct ice_dummy_pkt_offsets dummy_ipv6_gtpu_ipv6_tcp_packet_offset
        { ICE_UDP_OF,           54 },
        { ICE_GTP,              62 },
        { ICE_IPV6_IL,          82 },
-       { ICE_TCP_IL,           102 },
+       { ICE_TCP_IL,           122 },
        { ICE_PROTOCOL_LAST,    0 },
 };
 
@@ -864,7 +885,7 @@ static const struct ice_dummy_pkt_offsets dummy_ipv6_gtpu_ipv6_udp_packet_offset
        { ICE_UDP_OF,           54 },
        { ICE_GTP,              62 },
        { ICE_IPV6_IL,          82 },
-       { ICE_UDP_ILOS,         102 },
+       { ICE_UDP_ILOS,         122 },
        { ICE_PROTOCOL_LAST,    0 },
 };
 
@@ -1123,6 +1144,7 @@ static const u8 dummy_udp_gtp_packet[] = {
 
        0x02, 0x00, 0x00, 0x00, /* PDU Session extension header */
        0x00, 0x00, 0x00, 0x00,
+
 };
 
 static const struct ice_dummy_pkt_offsets dummy_ipv4_gtp_no_pay_packet_offsets[] = {
@@ -1142,18 +1164,44 @@ struct ice_dummy_pkt_offsets dummy_ipv6_gtp_no_pay_packet_offsets[] = {
        { ICE_PROTOCOL_LAST,    0 },
 };
 
+static const u8 dummy_ipv6_gtp_packet[] = {
+       0x00, 0x00, 0x00, 0x00, /* ICE_MAC_OFOS 0 */
+       0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00,
+       0x86, 0xdd,
+
+       0x60, 0x00, 0x00, 0x00, /* ICE_IPV6_OFOS 14 */
+       0x00, 0x6c, 0x11, 0x00, /* Next header UDP*/
+       0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00,
+
+       0x08, 0x68, 0x08, 0x68, /* ICE_UDP_OF 54 */
+       0x00, 0x00, 0x00, 0x00,
+
+       0x30, 0x00, 0x00, 0x28,  /* ICE_GTP 62 */
+       0x00, 0x00, 0x00, 0x00,
+
+       0x00, 0x00,
+};
+
 static const struct ice_dummy_pkt_offsets dummy_pppoe_packet_offsets[] = {
        { ICE_MAC_OFOS,         0 },
-       { ICE_ETYPE_OL,         12 },
-       { ICE_VLAN_OFOS,        14},
+       { ICE_VLAN_OFOS,        12 },
+       { ICE_ETYPE_OL,         16 },
        { ICE_PPPOE,            18 },
        { ICE_PROTOCOL_LAST,    0 },
 };
 
 static const struct ice_dummy_pkt_offsets dummy_pppoe_packet_ipv4_offsets[] = {
        { ICE_MAC_OFOS,         0 },
-       { ICE_ETYPE_OL,         12 },
-       { ICE_VLAN_OFOS,        14},
+       { ICE_VLAN_OFOS,        12 },
+       { ICE_ETYPE_OL,         16 },
        { ICE_PPPOE,            18 },
        { ICE_IPV4_OFOS,        26 },
        { ICE_PROTOCOL_LAST,    0 },
@@ -1164,9 +1212,9 @@ static const u8 dummy_pppoe_ipv4_packet[] = {
        0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00,
 
-       0x81, 0x00,             /* ICE_ETYPE_OL 12 */
+       0x81, 0x00, 0x00, 0x00, /* ICE_VLAN_OFOS 12 */
 
-       0x00, 0x00, 0x88, 0x64, /* ICE_VLAN_OFOS 14 */
+       0x88, 0x64,             /* ICE_ETYPE_OL 16 */
 
        0x11, 0x00, 0x00, 0x00, /* ICE_PPPOE 18 */
        0x00, 0x16,
@@ -1185,8 +1233,8 @@ static const u8 dummy_pppoe_ipv4_packet[] = {
 static const
 struct ice_dummy_pkt_offsets dummy_pppoe_ipv4_tcp_packet_offsets[] = {
        { ICE_MAC_OFOS,         0 },
-       { ICE_ETYPE_OL,         12 },
-       { ICE_VLAN_OFOS,        14},
+       { ICE_VLAN_OFOS,        12 },
+       { ICE_ETYPE_OL,         16 },
        { ICE_PPPOE,            18 },
        { ICE_IPV4_OFOS,        26 },
        { ICE_TCP_IL,           46 },
@@ -1198,9 +1246,9 @@ static const u8 dummy_pppoe_ipv4_tcp_packet[] = {
        0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00,
 
-       0x81, 0x00,             /* ICE_ETYPE_OL 12 */
+       0x81, 0x00, 0x00, 0x00, /* ICE_VLAN_OFOS 12 */
 
-       0x00, 0x00, 0x88, 0x64, /* ICE_VLAN_OFOS 14 */
+       0x88, 0x64,             /* ICE_ETYPE_OL 16 */
 
        0x11, 0x00, 0x00, 0x00, /* ICE_PPPOE 18 */
        0x00, 0x16,
@@ -1225,8 +1273,8 @@ static const u8 dummy_pppoe_ipv4_tcp_packet[] = {
 static const
 struct ice_dummy_pkt_offsets dummy_pppoe_ipv4_udp_packet_offsets[] = {
        { ICE_MAC_OFOS,         0 },
-       { ICE_ETYPE_OL,         12 },
-       { ICE_VLAN_OFOS,        14},
+       { ICE_VLAN_OFOS,        12 },
+       { ICE_ETYPE_OL,         16 },
        { ICE_PPPOE,            18 },
        { ICE_IPV4_OFOS,        26 },
        { ICE_UDP_ILOS,         46 },
@@ -1238,9 +1286,9 @@ static const u8 dummy_pppoe_ipv4_udp_packet[] = {
        0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00,
 
-       0x81, 0x00,             /* ICE_ETYPE_OL 12 */
+       0x81, 0x00, 0x00, 0x00, /* ICE_VLAN_OFOS 12 */
 
-       0x00, 0x00, 0x88, 0x64, /* ICE_VLAN_OFOS 14 */
+       0x88, 0x64,             /* ICE_ETYPE_OL 16 */
 
        0x11, 0x00, 0x00, 0x00, /* ICE_PPPOE 18 */
        0x00, 0x16,
@@ -1261,8 +1309,8 @@ static const u8 dummy_pppoe_ipv4_udp_packet[] = {
 
 static const struct ice_dummy_pkt_offsets dummy_pppoe_packet_ipv6_offsets[] = {
        { ICE_MAC_OFOS,         0 },
-       { ICE_ETYPE_OL,         12 },
-       { ICE_VLAN_OFOS,        14},
+       { ICE_VLAN_OFOS,        12 },
+       { ICE_ETYPE_OL,         16 },
        { ICE_PPPOE,            18 },
        { ICE_IPV6_OFOS,        26 },
        { ICE_PROTOCOL_LAST,    0 },
@@ -1273,9 +1321,9 @@ static const u8 dummy_pppoe_ipv6_packet[] = {
        0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00,
 
-       0x81, 0x00,             /* ICE_ETYPE_OL 12 */
+       0x81, 0x00, 0x00, 0x00, /* ICE_VLAN_OFOS 12 */
 
-       0x00, 0x00, 0x88, 0x64, /* ICE_VLAN_OFOS 14 */
+       0x88, 0x64,             /* ICE_ETYPE_OL 16 */
 
        0x11, 0x00, 0x00, 0x00, /* ICE_PPPOE 18 */
        0x00, 0x2a,
@@ -1299,8 +1347,8 @@ static const u8 dummy_pppoe_ipv6_packet[] = {
 static const
 struct ice_dummy_pkt_offsets dummy_pppoe_packet_ipv6_tcp_offsets[] = {
        { ICE_MAC_OFOS,         0 },
-       { ICE_ETYPE_OL,         12 },
-       { ICE_VLAN_OFOS,        14},
+       { ICE_VLAN_OFOS,        12 },
+       { ICE_ETYPE_OL,         16 },
        { ICE_PPPOE,            18 },
        { ICE_IPV6_OFOS,        26 },
        { ICE_TCP_IL,           66 },
@@ -1312,9 +1360,9 @@ static const u8 dummy_pppoe_ipv6_tcp_packet[] = {
        0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00,
 
-       0x81, 0x00,             /* ICE_ETYPE_OL 12 */
+       0x81, 0x00, 0x00, 0x00, /* ICE_VLAN_OFOS 12 */
 
-       0x00, 0x00, 0x88, 0x64, /* ICE_VLAN_OFOS 14 */
+       0x88, 0x64,             /* ICE_ETYPE_OL 16 */
 
        0x11, 0x00, 0x00, 0x00, /* ICE_PPPOE 18 */
        0x00, 0x2a,
@@ -1344,8 +1392,8 @@ static const u8 dummy_pppoe_ipv6_tcp_packet[] = {
 static const
 struct ice_dummy_pkt_offsets dummy_pppoe_packet_ipv6_udp_offsets[] = {
        { ICE_MAC_OFOS,         0 },
-       { ICE_ETYPE_OL,         12 },
-       { ICE_VLAN_OFOS,        14},
+       { ICE_VLAN_OFOS,        12 },
+       { ICE_ETYPE_OL,         16 },
        { ICE_PPPOE,            18 },
        { ICE_IPV6_OFOS,        26 },
        { ICE_UDP_ILOS,         66 },
@@ -1357,9 +1405,9 @@ static const u8 dummy_pppoe_ipv6_udp_packet[] = {
        0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00,
 
-       0x81, 0x00,             /* ICE_ETYPE_OL 12 */
+       0x81, 0x00, 0x00, 0x00, /* ICE_VLAN_OFOS 12 */
 
-       0x00, 0x00, 0x88, 0x64, /* ICE_VLAN_OFOS 14 */
+       0x88, 0x64,             /* ICE_ETYPE_OL 16 */
 
        0x11, 0x00, 0x00, 0x00, /* ICE_PPPOE 18 */
        0x00, 0x2a,
@@ -1610,9 +1658,9 @@ static const u8 dummy_ipv6_l2tpv3_pkt[] = {
 
 static const struct ice_dummy_pkt_offsets dummy_qinq_ipv4_packet_offsets[] = {
        { ICE_MAC_OFOS,         0 },
-       { ICE_ETYPE_OL,         12 },
-       { ICE_VLAN_EX,          14 },
-       { ICE_VLAN_IN,          18 },
+       { ICE_VLAN_EX,          12 },
+       { ICE_VLAN_IN,          16 },
+       { ICE_ETYPE_OL,         20 },
        { ICE_IPV4_OFOS,        22 },
        { ICE_PROTOCOL_LAST,    0 },
 };
@@ -1622,10 +1670,9 @@ static const u8 dummy_qinq_ipv4_pkt[] = {
        0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00,
 
-       0x91, 0x00,             /* ICE_ETYPE_OL 12 */
-
-       0x00, 0x00, 0x81, 0x00, /* ICE_VLAN_EX 14 */
-       0x00, 0x00, 0x08, 0x00, /* ICE_VLAN_IN 18 */
+       0x91, 0x00, 0x00, 0x00, /* ICE_VLAN_EX 12 */
+       0x81, 0x00, 0x00, 0x00, /* ICE_VLAN_IN 16 */
+       0x08, 0x00,             /* ICE_ETYPE_OL 20 */
 
        0x45, 0x00, 0x00, 0x1c, /* ICE_IPV4_OFOS 22 */
        0x00, 0x01, 0x00, 0x00,
@@ -1641,9 +1688,9 @@ static const u8 dummy_qinq_ipv4_pkt[] = {
 
 static const struct ice_dummy_pkt_offsets dummy_qinq_ipv6_packet_offsets[] = {
        { ICE_MAC_OFOS,         0 },
-       { ICE_ETYPE_OL,         12 },
-       { ICE_VLAN_EX,          14 },
-       { ICE_VLAN_IN,          18 },
+       { ICE_VLAN_EX,          12 },
+       { ICE_VLAN_IN,          16 },
+       { ICE_ETYPE_OL,         20 },
        { ICE_IPV6_OFOS,        22 },
        { ICE_PROTOCOL_LAST,    0 },
 };
@@ -1653,10 +1700,9 @@ static const u8 dummy_qinq_ipv6_pkt[] = {
        0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00,
 
-       0x91, 0x00,             /* ICE_ETYPE_OL 12 */
-
-       0x00, 0x00, 0x81, 0x00, /* ICE_VLAN_EX 14 */
-       0x00, 0x00, 0x86, 0xDD, /* ICE_VLAN_IN 18 */
+       0x91, 0x00, 0x00, 0x00, /* ICE_VLAN_EX 12 */
+       0x81, 0x00, 0x00, 0x00, /* ICE_VLAN_IN 16 */
+       0x86, 0xDD,             /* ICE_ETYPE_OL 20 */
 
        0x60, 0x00, 0x00, 0x00, /* ICE_IPV6_OFOS 22 */
        0x00, 0x10, 0x11, 0x00, /* Next header UDP */
@@ -1680,9 +1726,9 @@ static const u8 dummy_qinq_ipv6_pkt[] = {
 
 static const struct ice_dummy_pkt_offsets dummy_qinq_pppoe_packet_offsets[] = {
        { ICE_MAC_OFOS,         0 },
-       { ICE_ETYPE_OL,         12 },
-       { ICE_VLAN_EX,          14 },
-       { ICE_VLAN_IN,          18 },
+       { ICE_VLAN_EX,          12 },
+       { ICE_VLAN_IN,          16 },
+       { ICE_ETYPE_OL,         20 },
        { ICE_PPPOE,            22 },
        { ICE_PROTOCOL_LAST,    0 },
 };
@@ -1690,9 +1736,9 @@ static const struct ice_dummy_pkt_offsets dummy_qinq_pppoe_packet_offsets[] = {
 static const
 struct ice_dummy_pkt_offsets dummy_qinq_pppoe_ipv4_packet_offsets[] = {
        { ICE_MAC_OFOS,         0 },
-       { ICE_ETYPE_OL,         12 },
-       { ICE_VLAN_EX,          14 },
-       { ICE_VLAN_IN,          18 },
+       { ICE_VLAN_EX,          12 },
+       { ICE_VLAN_IN,          16 },
+       { ICE_ETYPE_OL,         20 },
        { ICE_PPPOE,            22 },
        { ICE_IPV4_OFOS,        30 },
        { ICE_PROTOCOL_LAST,    0 },
@@ -1703,10 +1749,9 @@ static const u8 dummy_qinq_pppoe_ipv4_pkt[] = {
        0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00,
 
-       0x91, 0x00,             /* ICE_ETYPE_OL 12 */
-
-       0x00, 0x00, 0x81, 0x00, /* ICE_VLAN_EX 14 */
-       0x00, 0x00, 0x88, 0x64, /* ICE_VLAN_IN 18 */
+       0x91, 0x00, 0x00, 0x00, /* ICE_VLAN_EX 12 */
+       0x81, 0x00, 0x00, 0x00, /* ICE_VLAN_IN 16 */
+       0x88, 0x64,             /* ICE_ETYPE_OL 20 */
 
        0x11, 0x00, 0x00, 0x00, /* ICE_PPPOE 22 */
        0x00, 0x16,
@@ -1725,9 +1770,9 @@ static const u8 dummy_qinq_pppoe_ipv4_pkt[] = {
 static const
 struct ice_dummy_pkt_offsets dummy_qinq_pppoe_packet_ipv6_offsets[] = {
        { ICE_MAC_OFOS,         0 },
-       { ICE_ETYPE_OL,         12 },
-       { ICE_VLAN_EX,          14},
-       { ICE_VLAN_IN,          18 },
+       { ICE_VLAN_EX,          12 },
+       { ICE_VLAN_IN,          16 },
+       { ICE_ETYPE_OL,         20 },
        { ICE_PPPOE,            22 },
        { ICE_IPV6_OFOS,        30 },
        { ICE_PROTOCOL_LAST,    0 },
@@ -1738,10 +1783,9 @@ static const u8 dummy_qinq_pppoe_ipv6_packet[] = {
        0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00,
 
-       0x91, 0x00,             /* ICE_ETYPE_OL 12 */
-
-       0x00, 0x00, 0x81, 0x00, /* ICE_VLAN_EX 14 */
-       0x00, 0x00, 0x88, 0x64, /* ICE_VLAN_IN 18 */
+       0x91, 0x00, 0x00, 0x00, /* ICE_VLAN_EX 12 */
+       0x81, 0x00, 0x00, 0x00, /* ICE_VLAN_IN 16 */
+       0x88, 0x64,             /* ICE_ETYPE_OL 20 */
 
        0x11, 0x00, 0x00, 0x00, /* ICE_PPPOE 22 */
        0x00, 0x2a,
@@ -1785,6 +1829,33 @@ static void ice_collect_result_idx(struct ice_aqc_recipe_data_elem *buf,
                            ~ICE_AQ_RECIPE_RESULT_EN, recp->res_idxs);
 }
 
+static struct ice_prof_type_entry ice_prof_type_tbl[ICE_GTPU_PROFILE] = {
+       { ICE_PROFID_IPV4_GTPU_IPV4_OTHER,    ICE_SW_TUN_IPV4_GTPU_IPV4},
+       { ICE_PROFID_IPV4_GTPU_IPV4_UDP,      ICE_SW_TUN_IPV4_GTPU_IPV4_UDP},
+       { ICE_PROFID_IPV4_GTPU_IPV4_TCP,      ICE_SW_TUN_IPV4_GTPU_IPV4_TCP},
+       { ICE_PROFID_IPV4_GTPU_EH_IPV4_OTHER, ICE_SW_TUN_IPV4_GTPU_EH_IPV4},
+       { ICE_PROFID_IPV4_GTPU_EH_IPV4_UDP,   ICE_SW_TUN_IPV4_GTPU_EH_IPV4_UDP},
+       { ICE_PROFID_IPV4_GTPU_EH_IPV4_TCP,   ICE_SW_TUN_IPV4_GTPU_EH_IPV4_TCP},
+       { ICE_PROFID_IPV4_GTPU_IPV6_OTHER,    ICE_SW_TUN_IPV4_GTPU_IPV6},
+       { ICE_PROFID_IPV4_GTPU_IPV6_UDP,      ICE_SW_TUN_IPV4_GTPU_IPV6_UDP},
+       { ICE_PROFID_IPV4_GTPU_IPV6_TCP,      ICE_SW_TUN_IPV4_GTPU_IPV6_TCP},
+       { ICE_PROFID_IPV4_GTPU_EH_IPV6_OTHER, ICE_SW_TUN_IPV4_GTPU_EH_IPV6},
+       { ICE_PROFID_IPV4_GTPU_EH_IPV6_UDP,   ICE_SW_TUN_IPV4_GTPU_EH_IPV6_UDP},
+       { ICE_PROFID_IPV4_GTPU_EH_IPV6_TCP,   ICE_SW_TUN_IPV4_GTPU_EH_IPV6_TCP},
+       { ICE_PROFID_IPV6_GTPU_IPV4_OTHER,    ICE_SW_TUN_IPV6_GTPU_IPV4},
+       { ICE_PROFID_IPV6_GTPU_IPV4_UDP,      ICE_SW_TUN_IPV6_GTPU_IPV4_UDP},
+       { ICE_PROFID_IPV6_GTPU_IPV4_TCP,      ICE_SW_TUN_IPV6_GTPU_IPV4_TCP},
+       { ICE_PROFID_IPV6_GTPU_EH_IPV4_OTHER, ICE_SW_TUN_IPV6_GTPU_EH_IPV4},
+       { ICE_PROFID_IPV6_GTPU_EH_IPV4_UDP,   ICE_SW_TUN_IPV6_GTPU_EH_IPV4_UDP},
+       { ICE_PROFID_IPV6_GTPU_EH_IPV4_TCP,   ICE_SW_TUN_IPV6_GTPU_EH_IPV4_TCP},
+       { ICE_PROFID_IPV6_GTPU_IPV6_OTHER,    ICE_SW_TUN_IPV6_GTPU_IPV6},
+       { ICE_PROFID_IPV6_GTPU_IPV6_UDP,      ICE_SW_TUN_IPV6_GTPU_IPV6_UDP},
+       { ICE_PROFID_IPV6_GTPU_IPV6_TCP,      ICE_SW_TUN_IPV6_GTPU_IPV6_TCP},
+       { ICE_PROFID_IPV6_GTPU_EH_IPV6_OTHER, ICE_SW_TUN_IPV6_GTPU_EH_IPV6},
+       { ICE_PROFID_IPV6_GTPU_EH_IPV6_UDP,   ICE_SW_TUN_IPV6_GTPU_EH_IPV6_UDP},
+       { ICE_PROFID_IPV6_GTPU_EH_IPV6_TCP,   ICE_SW_TUN_IPV6_GTPU_EH_IPV6_TCP},
+};
+
 /**
  * ice_get_tun_type_for_recipe - get tunnel type for the recipe
  * @rid: recipe ID that we are populating
@@ -1796,7 +1867,7 @@ static enum ice_sw_tunnel_type ice_get_tun_type_for_recipe(u8 rid, bool vlan)
        u8 pppoe_profile[7] = {34, 35, 36, 37, 38, 39, 40};
        u8 non_tun_profile[6] = {4, 5, 6, 7, 8, 9};
        enum ice_sw_tunnel_type tun_type;
-       u16 i, j, profile_num = 0;
+       u16 i, j, k, profile_num = 0;
        bool non_tun_valid = false;
        bool pppoe_valid = false;
        bool vxlan_valid = false;
@@ -1870,18 +1941,12 @@ static enum ice_sw_tunnel_type ice_get_tun_type_for_recipe(u8 rid, bool vlan)
        }
 
        if (tun_type == ICE_SW_TUN_GTP) {
-               if (ice_is_bit_set(recipe_to_profile[rid],
-                                  ICE_PROFID_IPV4_GTPU_IPV4_OTHER))
-                       tun_type = ICE_SW_TUN_IPV4_GTPU_IPV4;
-               else if (ice_is_bit_set(recipe_to_profile[rid],
-                                       ICE_PROFID_IPV4_GTPU_IPV6_OTHER))
-                       tun_type = ICE_SW_TUN_IPV4_GTPU_IPV6;
-               else if (ice_is_bit_set(recipe_to_profile[rid],
-                                       ICE_PROFID_IPV6_GTPU_IPV4_OTHER))
-                       tun_type = ICE_SW_TUN_IPV6_GTPU_IPV4;
-               else if (ice_is_bit_set(recipe_to_profile[rid],
-                                       ICE_PROFID_IPV6_GTPU_IPV6_OTHER))
-                       tun_type = ICE_SW_TUN_IPV6_GTPU_IPV6;
+               for (k = 0; k < ARRAY_SIZE(ice_prof_type_tbl); k++)
+                       if (ice_is_bit_set(recipe_to_profile[rid],
+                                          ice_prof_type_tbl[k].prof_id)) {
+                               tun_type = ice_prof_type_tbl[k].type;
+                               break;
+                       }
        }
 
        if (profile_num == 1 && (flag_valid || non_tun_valid || pppoe_valid)) {
@@ -4665,7 +4730,7 @@ ice_add_mac_rule(struct ice_hw *hw, struct LIST_HEAD_TYPE *m_list,
                        if (ice_find_rule_entry(rule_head,
                                                &m_list_itr->fltr_info)) {
                                ice_release_lock(rule_lock);
-                               return ICE_ERR_ALREADY_EXISTS;
+                               continue;
                        }
                        ice_release_lock(rule_lock);
                        num_unicast++;
@@ -6506,7 +6571,7 @@ static const struct ice_prot_ext_tbl_entry ice_prot_ext[ICE_PROTOCOL_LAST] = {
        { ICE_MAC_OFOS,         { 0, 2, 4, 6, 8, 10, 12 } },
        { ICE_MAC_IL,           { 0, 2, 4, 6, 8, 10, 12 } },
        { ICE_ETYPE_OL,         { 0 } },
-       { ICE_VLAN_OFOS,        { 0, 2 } },
+       { ICE_VLAN_OFOS,        { 2, 0 } },
        { ICE_IPV4_OFOS,        { 0, 2, 4, 6, 8, 10, 12, 14, 16, 18 } },
        { ICE_IPV4_IL,          { 0, 2, 4, 6, 8, 10, 12, 14, 16, 18 } },
        { ICE_IPV6_OFOS,        { 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24,
@@ -6521,7 +6586,7 @@ static const struct ice_prot_ext_tbl_entry ice_prot_ext[ICE_PROTOCOL_LAST] = {
        { ICE_GENEVE,           { 8, 10, 12, 14 } },
        { ICE_VXLAN_GPE,        { 8, 10, 12, 14 } },
        { ICE_NVGRE,            { 0, 2, 4, 6 } },
-       { ICE_GTP,              { 8, 10, 12, 14, 16, 18, 20 } },
+       { ICE_GTP,              { 8, 10, 12, 14, 16, 18, 20, 22 } },
        { ICE_PPPOE,            { 0, 2, 4, 6 } },
        { ICE_PFCP,             { 8, 10, 12, 14, 16, 18, 20, 22 } },
        { ICE_L2TPV3,           { 0, 2, 4, 6, 8, 10 } },
@@ -6529,8 +6594,8 @@ static const struct ice_prot_ext_tbl_entry ice_prot_ext[ICE_PROTOCOL_LAST] = {
        { ICE_AH,               { 0, 2, 4, 6, 8, 10 } },
        { ICE_NAT_T,            { 8, 10, 12, 14 } },
        { ICE_GTP_NO_PAY,       { 8, 10, 12, 14 } },
-       { ICE_VLAN_EX,          { 0, 2 } },
-       { ICE_VLAN_IN,          { 0, 2 } },
+       { ICE_VLAN_EX,          { 2, 0 } },
+       { ICE_VLAN_IN,          { 2, 0 } },
 };
 
 /* The following table describes preferred grouping of recipes.
@@ -7461,38 +7526,100 @@ ice_get_compat_fv_bitmap(struct ice_hw *hw, struct ice_adv_rule_info *rinfo,
        case ICE_SW_IPV6_UDP:
                ice_set_bit(ICE_PROFID_IPV6_UDP, bm);
                return;
+       case ICE_SW_TUN_IPV4_GTPU_NO_PAY:
+               ice_set_bit(ICE_PROFID_IPV4_GTPU_TEID, bm);
+               return;
+       case ICE_SW_TUN_IPV6_GTPU_NO_PAY:
+               ice_set_bit(ICE_PROFID_IPV6_GTPU_TEID, bm);
+               return;
        case ICE_SW_TUN_IPV4_GTPU_IPV4:
-               ice_set_bit(ICE_PROFID_IPV4_GTPU_EH_IPV4_OTHER, bm);
                ice_set_bit(ICE_PROFID_IPV4_GTPU_IPV4_OTHER, bm);
-               ice_set_bit(ICE_PROFID_IPV4_GTPU_EH_IPV4_UDP, bm);
                ice_set_bit(ICE_PROFID_IPV4_GTPU_IPV4_UDP, bm);
-               ice_set_bit(ICE_PROFID_IPV4_GTPU_EH_IPV4_TCP, bm);
                ice_set_bit(ICE_PROFID_IPV4_GTPU_IPV4_TCP, bm);
                return;
+       case ICE_SW_TUN_IPV4_GTPU_IPV4_UDP:
+               ice_set_bit(ICE_PROFID_IPV4_GTPU_IPV4_UDP, bm);
+               return;
+       case ICE_SW_TUN_IPV4_GTPU_IPV4_TCP:
+               ice_set_bit(ICE_PROFID_IPV4_GTPU_IPV4_TCP, bm);
+               return;
+       case ICE_SW_TUN_IPV4_GTPU_EH_IPV4:
+               ice_set_bit(ICE_PROFID_IPV4_GTPU_EH_IPV4_OTHER, bm);
+               ice_set_bit(ICE_PROFID_IPV4_GTPU_EH_IPV4_UDP, bm);
+               ice_set_bit(ICE_PROFID_IPV4_GTPU_EH_IPV4_TCP, bm);
+               return;
+       case ICE_SW_TUN_IPV4_GTPU_EH_IPV4_UDP:
+               ice_set_bit(ICE_PROFID_IPV4_GTPU_EH_IPV4_UDP, bm);
+               return;
+       case ICE_SW_TUN_IPV4_GTPU_EH_IPV4_TCP:
+               ice_set_bit(ICE_PROFID_IPV4_GTPU_EH_IPV4_TCP, bm);
+               return;
        case ICE_SW_TUN_IPV6_GTPU_IPV4:
-               ice_set_bit(ICE_PROFID_IPV6_GTPU_EH_IPV4_OTHER, bm);
                ice_set_bit(ICE_PROFID_IPV6_GTPU_IPV4_OTHER, bm);
-               ice_set_bit(ICE_PROFID_IPV6_GTPU_EH_IPV4_UDP, bm);
                ice_set_bit(ICE_PROFID_IPV6_GTPU_IPV4_UDP, bm);
-               ice_set_bit(ICE_PROFID_IPV6_GTPU_EH_IPV4_TCP, bm);
                ice_set_bit(ICE_PROFID_IPV6_GTPU_IPV4_TCP, bm);
                return;
+       case ICE_SW_TUN_IPV6_GTPU_IPV4_UDP:
+               ice_set_bit(ICE_PROFID_IPV6_GTPU_IPV4_UDP, bm);
+               return;
+       case ICE_SW_TUN_IPV6_GTPU_IPV4_TCP:
+               ice_set_bit(ICE_PROFID_IPV6_GTPU_IPV4_TCP, bm);
+               return;
+       case ICE_SW_TUN_IPV6_GTPU_EH_IPV4:
+               ice_set_bit(ICE_PROFID_IPV6_GTPU_EH_IPV4_OTHER, bm);
+               ice_set_bit(ICE_PROFID_IPV6_GTPU_EH_IPV4_UDP, bm);
+               ice_set_bit(ICE_PROFID_IPV6_GTPU_EH_IPV4_TCP, bm);
+               return;
+       case ICE_SW_TUN_IPV6_GTPU_EH_IPV4_UDP:
+               ice_set_bit(ICE_PROFID_IPV6_GTPU_EH_IPV4_UDP, bm);
+               return;
+       case ICE_SW_TUN_IPV6_GTPU_EH_IPV4_TCP:
+               ice_set_bit(ICE_PROFID_IPV6_GTPU_EH_IPV4_TCP, bm);
+               return;
        case ICE_SW_TUN_IPV4_GTPU_IPV6:
-               ice_set_bit(ICE_PROFID_IPV4_GTPU_EH_IPV6_OTHER, bm);
                ice_set_bit(ICE_PROFID_IPV4_GTPU_IPV6_OTHER, bm);
-               ice_set_bit(ICE_PROFID_IPV4_GTPU_EH_IPV6_UDP, bm);
                ice_set_bit(ICE_PROFID_IPV4_GTPU_IPV6_UDP, bm);
-               ice_set_bit(ICE_PROFID_IPV4_GTPU_EH_IPV6_TCP, bm);
                ice_set_bit(ICE_PROFID_IPV4_GTPU_IPV6_TCP, bm);
                return;
+       case ICE_SW_TUN_IPV4_GTPU_IPV6_UDP:
+               ice_set_bit(ICE_PROFID_IPV4_GTPU_IPV6_UDP, bm);
+               return;
+       case ICE_SW_TUN_IPV4_GTPU_IPV6_TCP:
+               ice_set_bit(ICE_PROFID_IPV4_GTPU_IPV6_TCP, bm);
+               return;
+       case ICE_SW_TUN_IPV4_GTPU_EH_IPV6:
+               ice_set_bit(ICE_PROFID_IPV4_GTPU_EH_IPV6_OTHER, bm);
+               ice_set_bit(ICE_PROFID_IPV4_GTPU_EH_IPV6_UDP, bm);
+               ice_set_bit(ICE_PROFID_IPV4_GTPU_EH_IPV6_TCP, bm);
+               return;
+       case ICE_SW_TUN_IPV4_GTPU_EH_IPV6_UDP:
+               ice_set_bit(ICE_PROFID_IPV4_GTPU_EH_IPV6_UDP, bm);
+               return;
+       case ICE_SW_TUN_IPV4_GTPU_EH_IPV6_TCP:
+               ice_set_bit(ICE_PROFID_IPV4_GTPU_EH_IPV6_TCP, bm);
+               return;
        case ICE_SW_TUN_IPV6_GTPU_IPV6:
-               ice_set_bit(ICE_PROFID_IPV6_GTPU_EH_IPV6_OTHER, bm);
                ice_set_bit(ICE_PROFID_IPV6_GTPU_IPV6_OTHER, bm);
-               ice_set_bit(ICE_PROFID_IPV6_GTPU_EH_IPV6_UDP, bm);
                ice_set_bit(ICE_PROFID_IPV6_GTPU_IPV6_UDP, bm);
-               ice_set_bit(ICE_PROFID_IPV6_GTPU_EH_IPV6_TCP, bm);
                ice_set_bit(ICE_PROFID_IPV6_GTPU_IPV6_TCP, bm);
                return;
+       case ICE_SW_TUN_IPV6_GTPU_IPV6_UDP:
+               ice_set_bit(ICE_PROFID_IPV6_GTPU_IPV6_UDP, bm);
+               return;
+       case ICE_SW_TUN_IPV6_GTPU_IPV6_TCP:
+               ice_set_bit(ICE_PROFID_IPV6_GTPU_IPV6_TCP, bm);
+               return;
+       case ICE_SW_TUN_IPV6_GTPU_EH_IPV6:
+               ice_set_bit(ICE_PROFID_IPV6_GTPU_EH_IPV6_OTHER, bm);
+               ice_set_bit(ICE_PROFID_IPV6_GTPU_EH_IPV6_UDP, bm);
+               ice_set_bit(ICE_PROFID_IPV6_GTPU_EH_IPV6_TCP, bm);
+               return;
+       case ICE_SW_TUN_IPV6_GTPU_EH_IPV6_UDP:
+               ice_set_bit(ICE_PROFID_IPV6_GTPU_EH_IPV6_UDP, bm);
+               return;
+       case ICE_SW_TUN_IPV6_GTPU_EH_IPV6_TCP:
+               ice_set_bit(ICE_PROFID_IPV6_GTPU_EH_IPV6_TCP, bm);
+               return;
        case ICE_SW_TUN_AND_NON_TUN:
        case ICE_SW_TUN_AND_NON_TUN_QINQ:
        default:
@@ -7746,7 +7873,7 @@ ice_find_dummy_packet(struct ice_adv_lkup_elem *lkups, u16 lkups_cnt,
                      const struct ice_dummy_pkt_offsets **offsets)
 {
        bool tcp = false, udp = false, ipv6 = false, vlan = false;
-       bool gre = false;
+       bool gre = false, mpls = false;
        u16 i;
 
        for (i = 0; i < lkups_cnt; i++) {
@@ -7758,6 +7885,12 @@ ice_find_dummy_packet(struct ice_adv_lkup_elem *lkups, u16 lkups_cnt,
                        ipv6 = true;
                else if (lkups[i].type == ICE_VLAN_OFOS)
                        vlan = true;
+               else if (lkups[i].type == ICE_ETYPE_OL &&
+                        lkups[i].h_u.ethertype.ethtype_id ==
+                               CPU_TO_BE16(ICE_IPV6_ETHER_ID) &&
+                        lkups[i].m_u.ethertype.ethtype_id ==
+                               CPU_TO_BE16(0xFFFF))
+                       ipv6 = true;
                else if (lkups[i].type == ICE_IPV4_OFOS &&
                         lkups[i].h_u.ipv4_hdr.protocol ==
                                ICE_IPV4_NVGRE_PROTO_ID &&
@@ -7770,18 +7903,17 @@ ice_find_dummy_packet(struct ice_adv_lkup_elem *lkups, u16 lkups_cnt,
                         lkups[i].m_u.pppoe_hdr.ppp_prot_id ==
                                0xFFFF)
                        ipv6 = true;
-               else if (lkups[i].type == ICE_ETYPE_OL &&
-                        lkups[i].h_u.ethertype.ethtype_id ==
-                               CPU_TO_BE16(ICE_IPV6_ETHER_ID) &&
-                        lkups[i].m_u.ethertype.ethtype_id ==
-                                       0xFFFF)
-                       ipv6 = true;
                else if (lkups[i].type == ICE_IPV4_IL &&
                         lkups[i].h_u.ipv4_hdr.protocol ==
                                ICE_TCP_PROTO_ID &&
                         lkups[i].m_u.ipv4_hdr.protocol ==
                                0xFF)
                        tcp = true;
+               else if (lkups[i].type == ICE_ETYPE_OL &&
+                        lkups[i].h_u.ethertype.ethtype_id ==
+                               CPU_TO_BE16(ICE_MPLS_ETHER_ID) &&
+                        lkups[i].m_u.ethertype.ethtype_id == 0xFFFF)
+                       mpls = true;
        }
 
        if ((tun_type == ICE_SW_TUN_AND_NON_TUN_QINQ ||
@@ -7808,6 +7940,11 @@ ice_find_dummy_packet(struct ice_adv_lkup_elem *lkups, u16 lkups_cnt,
                *pkt_len = sizeof(dummy_qinq_pppoe_ipv4_pkt);
                *offsets = dummy_qinq_pppoe_ipv4_packet_offsets;
                return;
+       } else if (tun_type == ICE_SW_TUN_PPPOE_QINQ && ipv6) {
+               *pkt = dummy_qinq_pppoe_ipv6_packet;
+               *pkt_len = sizeof(dummy_qinq_pppoe_ipv6_packet);
+               *offsets = dummy_qinq_pppoe_packet_offsets;
+               return;
        } else if (tun_type == ICE_SW_TUN_PPPOE_QINQ ||
                        tun_type == ICE_SW_TUN_PPPOE_PAY_QINQ) {
                *pkt = dummy_qinq_pppoe_ipv4_pkt;
@@ -7822,8 +7959,8 @@ ice_find_dummy_packet(struct ice_adv_lkup_elem *lkups, u16 lkups_cnt,
                *offsets = dummy_ipv4_gtp_no_pay_packet_offsets;
                return;
        } else if (tun_type == ICE_SW_TUN_IPV6_GTPU_NO_PAY) {
-               *pkt = dummy_ipv6_gtpu_ipv6_packet;
-               *pkt_len = sizeof(dummy_ipv6_gtpu_ipv6_packet);
+               *pkt = dummy_ipv6_gtp_packet;
+               *pkt_len = sizeof(dummy_ipv6_gtp_packet);
                *offsets = dummy_ipv6_gtp_no_pay_packet_offsets;
                return;
        }
@@ -7891,6 +8028,102 @@ ice_find_dummy_packet(struct ice_adv_lkup_elem *lkups, u16 lkups_cnt,
                return;
        }
 
+       if (tun_type == ICE_SW_TUN_IPV4_GTPU_IPV4 ||
+           tun_type == ICE_SW_TUN_IPV4_GTPU_EH_IPV4) {
+               *pkt = dummy_ipv4_gtpu_ipv4_packet;
+               *pkt_len = sizeof(dummy_ipv4_gtpu_ipv4_packet);
+               *offsets = dummy_ipv4_gtpu_ipv4_packet_offsets;
+               return;
+       }
+
+       if (tun_type == ICE_SW_TUN_IPV4_GTPU_IPV4_UDP ||
+           tun_type == ICE_SW_TUN_IPV4_GTPU_EH_IPV4_UDP) {
+               *pkt = dummy_ipv4_gtpu_ipv4_udp_packet;
+               *pkt_len = sizeof(dummy_ipv4_gtpu_ipv4_udp_packet);
+               *offsets = dummy_ipv4_gtpu_ipv4_udp_packet_offsets;
+               return;
+       }
+
+       if (tun_type == ICE_SW_TUN_IPV4_GTPU_IPV4_TCP ||
+           tun_type == ICE_SW_TUN_IPV4_GTPU_EH_IPV4_TCP) {
+               *pkt = dummy_ipv4_gtpu_ipv4_tcp_packet;
+               *pkt_len = sizeof(dummy_ipv4_gtpu_ipv4_tcp_packet);
+               *offsets = dummy_ipv4_gtpu_ipv4_tcp_packet_offsets;
+               return;
+       }
+
+       if (tun_type == ICE_SW_TUN_IPV4_GTPU_IPV6 ||
+           tun_type == ICE_SW_TUN_IPV4_GTPU_EH_IPV6) {
+               *pkt = dummy_ipv4_gtpu_ipv6_packet;
+               *pkt_len = sizeof(dummy_ipv4_gtpu_ipv6_packet);
+               *offsets = dummy_ipv4_gtpu_ipv6_packet_offsets;
+               return;
+       }
+
+       if (tun_type == ICE_SW_TUN_IPV4_GTPU_IPV6_UDP ||
+           tun_type == ICE_SW_TUN_IPV4_GTPU_EH_IPV6_UDP) {
+               *pkt = dummy_ipv4_gtpu_ipv6_udp_packet;
+               *pkt_len = sizeof(dummy_ipv4_gtpu_ipv6_udp_packet);
+               *offsets = dummy_ipv4_gtpu_ipv6_udp_packet_offsets;
+               return;
+       }
+
+       if (tun_type == ICE_SW_TUN_IPV4_GTPU_IPV6_TCP ||
+           tun_type == ICE_SW_TUN_IPV4_GTPU_EH_IPV6_TCP) {
+               *pkt = dummy_ipv4_gtpu_ipv6_tcp_packet;
+               *pkt_len = sizeof(dummy_ipv4_gtpu_ipv6_tcp_packet);
+               *offsets = dummy_ipv4_gtpu_ipv6_tcp_packet_offsets;
+               return;
+       }
+
+       if (tun_type == ICE_SW_TUN_IPV6_GTPU_IPV4 ||
+           tun_type == ICE_SW_TUN_IPV6_GTPU_EH_IPV4) {
+               *pkt = dummy_ipv6_gtpu_ipv4_packet;
+               *pkt_len = sizeof(dummy_ipv6_gtpu_ipv4_packet);
+               *offsets = dummy_ipv6_gtpu_ipv4_packet_offsets;
+               return;
+       }
+
+       if (tun_type == ICE_SW_TUN_IPV6_GTPU_IPV4_UDP ||
+           tun_type == ICE_SW_TUN_IPV6_GTPU_EH_IPV4_UDP) {
+               *pkt = dummy_ipv6_gtpu_ipv4_udp_packet;
+               *pkt_len = sizeof(dummy_ipv6_gtpu_ipv4_udp_packet);
+               *offsets = dummy_ipv6_gtpu_ipv4_udp_packet_offsets;
+               return;
+       }
+
+       if (tun_type == ICE_SW_TUN_IPV6_GTPU_IPV4_TCP ||
+           tun_type == ICE_SW_TUN_IPV6_GTPU_EH_IPV4_TCP) {
+               *pkt = dummy_ipv6_gtpu_ipv4_tcp_packet;
+               *pkt_len = sizeof(dummy_ipv6_gtpu_ipv4_tcp_packet);
+               *offsets = dummy_ipv6_gtpu_ipv4_tcp_packet_offsets;
+               return;
+       }
+
+       if (tun_type == ICE_SW_TUN_IPV6_GTPU_IPV6 ||
+           tun_type == ICE_SW_TUN_IPV6_GTPU_EH_IPV6) {
+               *pkt = dummy_ipv6_gtpu_ipv6_packet;
+               *pkt_len = sizeof(dummy_ipv6_gtpu_ipv6_packet);
+               *offsets = dummy_ipv6_gtpu_ipv6_packet_offsets;
+               return;
+       }
+
+       if (tun_type == ICE_SW_TUN_IPV6_GTPU_IPV6_UDP ||
+           tun_type == ICE_SW_TUN_IPV6_GTPU_EH_IPV6_UDP) {
+               *pkt = dummy_ipv6_gtpu_ipv6_udp_packet;
+               *pkt_len = sizeof(dummy_ipv6_gtpu_ipv6_udp_packet);
+               *offsets = dummy_ipv6_gtpu_ipv6_udp_packet_offsets;
+               return;
+       }
+
+       if (tun_type == ICE_SW_TUN_IPV6_GTPU_IPV6_TCP ||
+           tun_type == ICE_SW_TUN_IPV6_GTPU_EH_IPV6_TCP) {
+               *pkt = dummy_ipv6_gtpu_ipv6_tcp_packet;
+               *pkt_len = sizeof(dummy_ipv6_gtpu_ipv6_tcp_packet);
+               *offsets = dummy_ipv6_gtpu_ipv6_tcp_packet_offsets;
+               return;
+       }
+
        if (tun_type == ICE_SW_TUN_PPPOE && ipv6) {
                *pkt = dummy_pppoe_ipv6_packet;
                *pkt_len = sizeof(dummy_pppoe_ipv6_packet);
@@ -7974,32 +8207,6 @@ ice_find_dummy_packet(struct ice_adv_lkup_elem *lkups, u16 lkups_cnt,
                return;
        }
 
-       /* Support GTP tunnel + L3 */
-       if (tun_type == ICE_SW_TUN_IPV4_GTPU_IPV4) {
-               *pkt = dummy_ipv4_gtpu_ipv4_packet;
-               *pkt_len = sizeof(dummy_ipv4_gtpu_ipv4_packet);
-               *offsets = dummy_ipv4_gtpu_ipv4_packet_offsets;
-               return;
-       }
-       if (tun_type == ICE_SW_TUN_IPV4_GTPU_IPV6) {
-               *pkt = dummy_ipv4_gtpu_ipv6_packet;
-               *pkt_len = sizeof(dummy_ipv4_gtpu_ipv6_packet);
-               *offsets = dummy_ipv4_gtpu_ipv6_packet_offsets;
-               return;
-       }
-       if (tun_type == ICE_SW_TUN_IPV6_GTPU_IPV4) {
-               *pkt = dummy_ipv6_gtpu_ipv4_packet;
-               *pkt_len = sizeof(dummy_ipv6_gtpu_ipv4_packet);
-               *offsets = dummy_ipv6_gtpu_ipv4_packet_offsets;
-               return;
-       }
-       if (tun_type == ICE_SW_TUN_IPV6_GTPU_IPV6) {
-               *pkt = dummy_ipv6_gtpu_ipv6_packet;
-               *pkt_len = sizeof(dummy_ipv6_gtpu_ipv6_packet);
-               *offsets = dummy_ipv6_gtpu_ipv6_packet_offsets;
-               return;
-       }
-
        if (tun_type == ICE_ALL_TUNNELS) {
                *pkt = dummy_gre_udp_packet;
                *pkt_len = sizeof(dummy_gre_udp_packet);
@@ -8077,6 +8284,10 @@ ice_find_dummy_packet(struct ice_adv_lkup_elem *lkups, u16 lkups_cnt,
                *pkt = dummy_vlan_tcp_packet;
                *pkt_len = sizeof(dummy_vlan_tcp_packet);
                *offsets = dummy_vlan_tcp_packet_offsets;
+       }  else if (mpls) {
+               *pkt = dummy_mpls_packet;
+               *pkt_len = sizeof(dummy_mpls_packet);
+               *offsets = dummy_mpls_packet_offsets;
        } else {
                *pkt = dummy_tcp_packet;
                *pkt_len = sizeof(dummy_tcp_packet);