@@ -1827,6 +1827,289 @@ static const u8 ice_fdir_tcp6_gtpu4_eh_up_gre6_pkt[] = {
0x00, 0x00, 0x00, 0x00,
};
+/* IPV4 L2TPV2 control */
+static const u8 ice_fdir_ipv4_l2tpv2_ctrl_pkt[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
+ 0x00, 0x28, 0x00, 0x01, 0x00, 0x00, 0x40, 0x11,
+ 0x7c, 0xc2, 0x7f, 0x00, 0x00, 0x01, 0x7f, 0x00,
+ 0x00, 0x01, 0x06, 0xa5, 0x06, 0xa5, 0x00, 0x14,
+ 0x2c, 0x6b, 0xc8, 0x02, 0x00, 0x0c, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+};
+
+/* IPV4 L2TPV2 */
+static const u8 ice_fdir_ipv4_l2tpv2_pkt[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
+ 0x00, 0x28, 0x00, 0x01, 0x00, 0x00, 0x40, 0x11,
+ 0x7c, 0xc2, 0x7f, 0x00, 0x00, 0x01, 0x7f, 0x00,
+ 0x00, 0x01, 0x06, 0xa5, 0x06, 0xa5, 0x00, 0x14,
+ 0x2c, 0x6b, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00,
+};
+
+/* IPV4 PPPOL2TPV2 */
+static const u8 ice_fdir_ipv4_l2tpv2_ppp_pkt[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
+ 0x00, 0x26, 0x00, 0x01, 0x00, 0x00, 0x40, 0x11,
+ 0x7c, 0xc4, 0x7f, 0x00, 0x00, 0x01, 0x7f, 0x00,
+ 0x00, 0x01, 0x06, 0xa5, 0x06, 0xa5, 0x00, 0x12,
+ 0xf5, 0x77, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00,
+ 0xff, 0x03, 0x00, 0x00, 0x00, 0x00,
+};
+
+/* IPV4 PPPOL2TPV2 IPV4 */
+static const u8 ice_fdir_ipv4_l2tpv2_ppp4_pkt[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
+ 0x00, 0x3a, 0x00, 0x01, 0x00, 0x00, 0x40, 0x11,
+ 0x7c, 0xb0, 0x7f, 0x00, 0x00, 0x01, 0x7f, 0x00,
+ 0x00, 0x01, 0x06, 0xa5, 0x06, 0xa5, 0x00, 0x26,
+ 0xf5, 0x2e, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00,
+ 0xff, 0x03, 0x00, 0x21, 0x45, 0x00, 0x00, 0x14,
+ 0x00, 0x01, 0x00, 0x00, 0x40, 0x00, 0x7c, 0xe7,
+ 0x7f, 0x00, 0x00, 0x01, 0x7f, 0x00, 0x00, 0x01,
+ 0x00, 0x00,
+};
+
+/* IPV4 PPPOL2TPV2 IPV4 UDP */
+static const u8 ice_fdir_udp4_l2tpv2_ppp4_pkt[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
+ 0x00, 0x42, 0x00, 0x01, 0x00, 0x00, 0x40, 0x11,
+ 0x7c, 0xa8, 0x7f, 0x00, 0x00, 0x01, 0x7f, 0x00,
+ 0x00, 0x01, 0x06, 0xa5, 0x06, 0xa5, 0x00, 0x2e,
+ 0xf3, 0x3a, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00,
+ 0xff, 0x03, 0x00, 0x21, 0x45, 0x00, 0x00, 0x1c,
+ 0x00, 0x01, 0x00, 0x00, 0x40, 0x11, 0x7c, 0xce,
+ 0x7f, 0x00, 0x00, 0x01, 0x7f, 0x00, 0x00, 0x01,
+ 0x00, 0x35, 0x00, 0x35, 0x00, 0x08, 0x01, 0x72,
+ 0x00, 0x00,
+};
+
+/* IPV4 PPPOL2TPV2 IPV4 TCP */
+static const u8 ice_fdir_tcp4_l2tpv2_ppp4_pkt[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
+ 0x00, 0x4e, 0x00, 0x01, 0x00, 0x00, 0x40, 0x11,
+ 0x7c, 0x9c, 0x7f, 0x00, 0x00, 0x01, 0x7f, 0x00,
+ 0x00, 0x01, 0x06, 0xa5, 0x06, 0xa5, 0x00, 0x3a,
+ 0xf3, 0x23, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00,
+ 0xff, 0x03, 0x00, 0x21, 0x45, 0x00, 0x00, 0x28,
+ 0x00, 0x01, 0x00, 0x00, 0x40, 0x06, 0x7c, 0xcd,
+ 0x7f, 0x00, 0x00, 0x01, 0x7f, 0x00, 0x00, 0x01,
+ 0x00, 0x14, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x50, 0x02, 0x20, 0x00,
+ 0x91, 0x7c, 0x00, 0x00, 0x00, 0x00,
+};
+
+/* IPV4 PPPOL2TPV2 IPV6 */
+static const u8 ice_fdir_ipv6_l2tpv2_ppp4_pkt[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
+ 0x00, 0x4e, 0x00, 0x01, 0x00, 0x00, 0x40, 0x11,
+ 0x7c, 0x9c, 0x7f, 0x00, 0x00, 0x01, 0x7f, 0x00,
+ 0x00, 0x01, 0x06, 0xa5, 0x06, 0xa5, 0x00, 0x3a,
+ 0x59, 0x8e, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00,
+ 0xff, 0x03, 0x00, 0x57, 0x60, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x3b, 0x40, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
+};
+
+/* IPV4 PPPOL2TPV2 IPV6 UDP */
+static const u8 ice_fdir_udp6_l2tpv2_ppp4_pkt[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
+ 0x00, 0x56, 0x00, 0x01, 0x00, 0x00, 0x40, 0x11,
+ 0x7c, 0x94, 0x7f, 0x00, 0x00, 0x01, 0x7f, 0x00,
+ 0x00, 0x01, 0x06, 0xa5, 0x06, 0xa5, 0x00, 0x42,
+ 0x83, 0x91, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00,
+ 0xff, 0x03, 0x00, 0x57, 0x60, 0x00, 0x00, 0x00,
+ 0x00, 0x08, 0x11, 0x40, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01, 0x00, 0x35, 0x00, 0x35,
+ 0x00, 0x08, 0xff, 0x72, 0x00, 0x00,
+};
+
+/* IPV4 PPPOL2TPV2 IPV6 TCP */
+static const u8 ice_fdir_tcp6_l2tpv2_ppp4_pkt[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
+ 0x00, 0x62, 0x00, 0x01, 0x00, 0x00, 0x40, 0x11,
+ 0x7c, 0x88, 0x7f, 0x00, 0x00, 0x01, 0x7f, 0x00,
+ 0x00, 0x01, 0x06, 0xa5, 0x06, 0xa5, 0x00, 0x4e,
+ 0x8e, 0x6e, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00,
+ 0xff, 0x03, 0x00, 0x57, 0x60, 0x00, 0x00, 0x00,
+ 0x00, 0x14, 0x06, 0x40, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01, 0x00, 0x14, 0x00, 0x50,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x50, 0x02, 0x20, 0x00, 0x8f, 0x7d, 0x00, 0x00,
+ 0x00, 0x00,
+};
+
+/* IPV6 L2TPV2 control */
+static const u8 ice_fdir_ipv6_l2tpv2_ctrl_pkt[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd, 0x60, 0x00,
+ 0x00, 0x00, 0x00, 0x14, 0x11, 0x40, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0xa5,
+ 0x06, 0xa5, 0x00, 0x14, 0x2a, 0x6c, 0xc8, 0x02,
+ 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+};
+
+/* IPV6 L2TPV2 */
+static const u8 ice_fdir_ipv6_l2tpv2_pkt[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd, 0x60, 0x00,
+ 0x00, 0x00, 0x00, 0x14, 0x11, 0x40, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0xa5,
+ 0x06, 0xa5, 0x00, 0x14, 0x2a, 0x6c, 0x00, 0x02,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+};
+
+/* IPV6 PPPOL2TPV2 */
+static const u8 ice_fdir_ipv6_l2tpv2_ppp_pkt[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd, 0x60, 0x00,
+ 0x00, 0x00, 0x00, 0x12, 0x11, 0x40, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0xa5,
+ 0x06, 0xa5, 0x00, 0x12, 0xf3, 0x78, 0x00, 0x02,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00,
+ 0x00, 0x00,
+};
+
+/* IPV6 PPPOL2TPV2 IPV4 */
+static const u8 ice_fdir_ipv4_l2tpv2_ppp6_pkt[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd, 0x60, 0x00,
+ 0x00, 0x00, 0x00, 0x26, 0x11, 0x40, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0xa5,
+ 0x06, 0xa5, 0x00, 0x26, 0xf3, 0x2f, 0x00, 0x02,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x03, 0x00, 0x21,
+ 0x45, 0x00, 0x00, 0x14, 0x00, 0x01, 0x00, 0x00,
+ 0x40, 0x00, 0x7c, 0xe7, 0x7f, 0x00, 0x00, 0x01,
+ 0x7f, 0x00, 0x00, 0x01, 0x00, 0x00,
+};
+
+/* IPV6 PPPOL2TPV2 IPV4 UDP */
+static const u8 ice_fdir_udp4_l2tpv2_ppp6_pkt[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd, 0x60, 0x00,
+ 0x00, 0x00, 0x00, 0x2e, 0x11, 0x40, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0xa5,
+ 0x06, 0xa5, 0x00, 0x2e, 0xf1, 0x3b, 0x00, 0x02,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x03, 0x00, 0x21,
+ 0x45, 0x00, 0x00, 0x1c, 0x00, 0x01, 0x00, 0x00,
+ 0x40, 0x11, 0x7c, 0xce, 0x7f, 0x00, 0x00, 0x01,
+ 0x7f, 0x00, 0x00, 0x01, 0x00, 0x35, 0x00, 0x35,
+ 0x00, 0x08, 0x01, 0x72, 0x00, 0x00,
+};
+
+/* IPV6 PPPOL2TPV2 IPV4 TCP */
+static const u8 ice_fdir_tcp4_l2tpv2_ppp6_pkt[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd, 0x60, 0x00,
+ 0x00, 0x00, 0x00, 0x3a, 0x11, 0x40, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0xa5,
+ 0x06, 0xa5, 0x00, 0x3a, 0xf1, 0x24, 0x00, 0x02,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x03, 0x00, 0x21,
+ 0x45, 0x00, 0x00, 0x28, 0x00, 0x01, 0x00, 0x00,
+ 0x40, 0x06, 0x7c, 0xcd, 0x7f, 0x00, 0x00, 0x01,
+ 0x7f, 0x00, 0x00, 0x01, 0x00, 0x14, 0x00, 0x50,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x50, 0x02, 0x20, 0x00, 0x91, 0x7c, 0x00, 0x00,
+ 0x00, 0x00,
+};
+
+/* IPV6 PPPOL2TPV2 IPV6 */
+static const u8 ice_fdir_ipv6_l2tpv2_ppp6_pkt[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd, 0x60, 0x00,
+ 0x00, 0x00, 0x00, 0x3a, 0x11, 0x40, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0xa5,
+ 0x06, 0xa5, 0x00, 0x3a, 0x57, 0x8f, 0x00, 0x02,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x03, 0x00, 0x57,
+ 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3b, 0x40,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x00,
+};
+
+/* IPV6 PPPOL2TPV2 IPV6 UDP */
+static const u8 ice_fdir_udp6_l2tpv2_ppp6_pkt[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd, 0x60, 0x00,
+ 0x00, 0x00, 0x00, 0x42, 0x11, 0x40, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0xa5,
+ 0x06, 0xa5, 0x00, 0x42, 0x81, 0x92, 0x00, 0x02,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x03, 0x00, 0x57,
+ 0x60, 0x00, 0x00, 0x00, 0x00, 0x08, 0x11, 0x40,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x35, 0x00, 0x35, 0x00, 0x08, 0xff, 0x72,
+ 0x00, 0x00,
+};
+
+/* IPV6 PPPOL2TPV2 IPV6 TCP */
+static const u8 ice_fdir_tcp6_l2tpv2_ppp6_pkt[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd, 0x60, 0x00,
+ 0x00, 0x00, 0x00, 0x4e, 0x11, 0x40, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0xa5,
+ 0x06, 0xa5, 0x00, 0x4e, 0x8c, 0x6f, 0x00, 0x02,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x03, 0x00, 0x57,
+ 0x60, 0x00, 0x00, 0x00, 0x00, 0x14, 0x06, 0x40,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x14, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x50, 0x02, 0x20, 0x00,
+ 0x8f, 0x7d, 0x00, 0x00, 0x00, 0x00,
+};
+
static const u8 ice_fdir_tcpv6_pkt[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
@@ -2912,6 +3195,142 @@ static const struct ice_fdir_base_pkt ice_fdir_pkt[] = {
sizeof(ice_fdir_tcp6_gtpu4_eh_up_gre6_pkt),
ice_fdir_tcp6_gtpu4_eh_up_gre6_pkt,
},
+ /* IPV4 L2TPV2 CONTROL */
+ {
+ ICE_FLTR_PTYPE_NONF_IPV4_L2TPV2_CONTROL,
+ sizeof(ice_fdir_ipv4_l2tpv2_ctrl_pkt),
+ ice_fdir_ipv4_l2tpv2_ctrl_pkt,
+ sizeof(ice_fdir_ipv4_l2tpv2_ctrl_pkt),
+ ice_fdir_ipv4_l2tpv2_ctrl_pkt,
+ },
+ /* IPV4 L2TPV2 */
+ {
+ ICE_FLTR_PTYPE_NONF_IPV4_L2TPV2,
+ sizeof(ice_fdir_ipv4_l2tpv2_pkt),
+ ice_fdir_ipv4_l2tpv2_pkt,
+ sizeof(ice_fdir_ipv4_l2tpv2_pkt),
+ ice_fdir_ipv4_l2tpv2_pkt,
+ },
+ /* IPV4 L2TPV2 PPP */
+ {
+ ICE_FLTR_PTYPE_NONF_IPV4_L2TPV2_PPP,
+ sizeof(ice_fdir_ipv4_l2tpv2_ppp_pkt),
+ ice_fdir_ipv4_l2tpv2_ppp_pkt,
+ sizeof(ice_fdir_ipv4_l2tpv2_ppp_pkt),
+ ice_fdir_ipv4_l2tpv2_ppp_pkt,
+ },
+ /* IPV4 L2TPV2 PPP IPV4 */
+ {
+ ICE_FLTR_PTYPE_NONF_IPV4_L2TPV2_PPP_IPV4,
+ sizeof(ice_fdir_ipv4_l2tpv2_ppp4_pkt),
+ ice_fdir_ipv4_l2tpv2_ppp4_pkt,
+ sizeof(ice_fdir_ipv4_l2tpv2_ppp4_pkt),
+ ice_fdir_ipv4_l2tpv2_ppp4_pkt,
+ },
+ {
+ ICE_FLTR_PTYPE_NONF_IPV4_L2TPV2_PPP_IPV4_UDP,
+ sizeof(ice_fdir_udp4_l2tpv2_ppp4_pkt),
+ ice_fdir_udp4_l2tpv2_ppp4_pkt,
+ sizeof(ice_fdir_udp4_l2tpv2_ppp4_pkt),
+ ice_fdir_udp4_l2tpv2_ppp4_pkt,
+ },
+ {
+ ICE_FLTR_PTYPE_NONF_IPV4_L2TPV2_PPP_IPV4_TCP,
+ sizeof(ice_fdir_tcp4_l2tpv2_ppp4_pkt),
+ ice_fdir_tcp4_l2tpv2_ppp4_pkt,
+ sizeof(ice_fdir_tcp4_l2tpv2_ppp4_pkt),
+ ice_fdir_tcp4_l2tpv2_ppp4_pkt,
+ },
+ /* IPV4 L2TPV2 PPP IPV6 */
+ {
+ ICE_FLTR_PTYPE_NONF_IPV4_L2TPV2_PPP_IPV6,
+ sizeof(ice_fdir_ipv6_l2tpv2_ppp4_pkt),
+ ice_fdir_ipv6_l2tpv2_ppp4_pkt,
+ sizeof(ice_fdir_ipv6_l2tpv2_ppp4_pkt),
+ ice_fdir_ipv6_l2tpv2_ppp4_pkt,
+ },
+ {
+ ICE_FLTR_PTYPE_NONF_IPV4_L2TPV2_PPP_IPV6_UDP,
+ sizeof(ice_fdir_udp6_l2tpv2_ppp4_pkt),
+ ice_fdir_udp6_l2tpv2_ppp4_pkt,
+ sizeof(ice_fdir_udp6_l2tpv2_ppp4_pkt),
+ ice_fdir_udp6_l2tpv2_ppp4_pkt,
+ },
+ {
+ ICE_FLTR_PTYPE_NONF_IPV4_L2TPV2_PPP_IPV6_TCP,
+ sizeof(ice_fdir_tcp6_l2tpv2_ppp4_pkt),
+ ice_fdir_tcp6_l2tpv2_ppp4_pkt,
+ sizeof(ice_fdir_tcp6_l2tpv2_ppp4_pkt),
+ ice_fdir_tcp6_l2tpv2_ppp4_pkt,
+ },
+ /* IPV6 L2TPV2 CONTROL */
+ {
+ ICE_FLTR_PTYPE_NONF_IPV6_L2TPV2_CONTROL,
+ sizeof(ice_fdir_ipv6_l2tpv2_ctrl_pkt),
+ ice_fdir_ipv6_l2tpv2_ctrl_pkt,
+ sizeof(ice_fdir_ipv6_l2tpv2_ctrl_pkt),
+ ice_fdir_ipv6_l2tpv2_ctrl_pkt,
+ },
+ /* IPV6 L2TPV2 */
+ {
+ ICE_FLTR_PTYPE_NONF_IPV6_L2TPV2,
+ sizeof(ice_fdir_ipv6_l2tpv2_pkt),
+ ice_fdir_ipv6_l2tpv2_pkt,
+ sizeof(ice_fdir_ipv6_l2tpv2_pkt),
+ ice_fdir_ipv6_l2tpv2_pkt,
+ },
+ /* IPV6 L2TPV2 PPP */
+ {
+ ICE_FLTR_PTYPE_NONF_IPV6_L2TPV2_PPP,
+ sizeof(ice_fdir_ipv6_l2tpv2_ppp_pkt),
+ ice_fdir_ipv6_l2tpv2_ppp_pkt,
+ sizeof(ice_fdir_ipv6_l2tpv2_ppp_pkt),
+ ice_fdir_ipv6_l2tpv2_ppp_pkt,
+ },
+ /* IPV6 L2TPV2 PPP IPV4 */
+ {
+ ICE_FLTR_PTYPE_NONF_IPV6_L2TPV2_PPP_IPV4,
+ sizeof(ice_fdir_ipv4_l2tpv2_ppp6_pkt),
+ ice_fdir_ipv4_l2tpv2_ppp6_pkt,
+ sizeof(ice_fdir_ipv4_l2tpv2_ppp6_pkt),
+ ice_fdir_ipv4_l2tpv2_ppp6_pkt,
+ },
+ {
+ ICE_FLTR_PTYPE_NONF_IPV6_L2TPV2_PPP_IPV4_UDP,
+ sizeof(ice_fdir_udp4_l2tpv2_ppp6_pkt),
+ ice_fdir_udp4_l2tpv2_ppp6_pkt,
+ sizeof(ice_fdir_udp4_l2tpv2_ppp6_pkt),
+ ice_fdir_udp4_l2tpv2_ppp6_pkt,
+ },
+ {
+ ICE_FLTR_PTYPE_NONF_IPV6_L2TPV2_PPP_IPV4_TCP,
+ sizeof(ice_fdir_tcp4_l2tpv2_ppp6_pkt),
+ ice_fdir_tcp4_l2tpv2_ppp6_pkt,
+ sizeof(ice_fdir_tcp4_l2tpv2_ppp6_pkt),
+ ice_fdir_tcp4_l2tpv2_ppp6_pkt,
+ },
+ /* IPV6 L2TPV2 PPP IPV6 */
+ {
+ ICE_FLTR_PTYPE_NONF_IPV6_L2TPV2_PPP_IPV6,
+ sizeof(ice_fdir_ipv6_l2tpv2_ppp6_pkt),
+ ice_fdir_ipv6_l2tpv2_ppp6_pkt,
+ sizeof(ice_fdir_ipv6_l2tpv2_ppp6_pkt),
+ ice_fdir_ipv6_l2tpv2_ppp6_pkt,
+ },
+ {
+ ICE_FLTR_PTYPE_NONF_IPV6_L2TPV2_PPP_IPV6_UDP,
+ sizeof(ice_fdir_udp6_l2tpv2_ppp6_pkt),
+ ice_fdir_udp6_l2tpv2_ppp6_pkt,
+ sizeof(ice_fdir_udp6_l2tpv2_ppp6_pkt),
+ ice_fdir_udp6_l2tpv2_ppp6_pkt,
+ },
+ {
+ ICE_FLTR_PTYPE_NONF_IPV6_L2TPV2_PPP_IPV6_TCP,
+ sizeof(ice_fdir_tcp6_l2tpv2_ppp6_pkt),
+ ice_fdir_tcp6_l2tpv2_ppp6_pkt,
+ sizeof(ice_fdir_tcp6_l2tpv2_ppp6_pkt),
+ ice_fdir_tcp6_l2tpv2_ppp6_pkt,
+ },
{
ICE_FLTR_PTYPE_NONF_IPV6_TCP,
sizeof(ice_fdir_tcpv6_pkt), ice_fdir_tcpv6_pkt,
@@ -3290,6 +3709,111 @@ ice_fdir_get_open_tunnel_port(struct ice_hw *hw, enum ice_fltr_ptype flow,
return ICE_SUCCESS;
}
+/**
+ * ice_fdir_gen_l2tpv2_pkt - generate L2TPv2 training packet
+ * @pkt: pointer to return filter packet
+ * @l2tpv2_data: pointer to ice_fdir_l2tpv2 data structure
+ * @idx: the matched packet index of FDIR training packet table
+ * @offset: position of end byte for PPPoL2TPv2 packet
+ * @tun: true implies generate a tunnel packet
+ */
+static u16
+ice_fdir_gen_l2tpv2_pkt(u8 *pkt, struct ice_fdir_l2tpv2 *l2tpv2_data,
+ u16 idx, u16 offset, bool tun)
+{
+ u16 flags_version;
+ u16 offset_size;
+ u16 pos;
+
+ /* get outer packet end pos, 10 = l2tpv2 default len 6 + ppp len 4 */
+ pos = offset - ICE_L2TPV2_PKT_LENGTH - ICE_PPP_PKT_LENGTH;
+
+ /* copy outer packet */
+ ice_memcpy(pkt, ice_fdir_pkt[idx].tun_pkt, pos, ICE_NONDMA_TO_NONDMA);
+
+ /* copy l2tpv2 packet common header */
+ ice_memcpy(pkt + pos, &l2tpv2_data->flags_version,
+ sizeof(l2tpv2_data->flags_version),
+ ICE_NONDMA_TO_NONDMA);
+ pos += sizeof(l2tpv2_data->flags_version);
+
+ flags_version = BE16_TO_CPU(l2tpv2_data->flags_version);
+ if (flags_version == 0) {
+ l2tpv2_data->flags_version = CPU_TO_BE16(ICE_L2TPV2_FLAGS_VER);
+ flags_version = ICE_L2TPV2_FLAGS_VER;
+ }
+
+ /* copy l2tpv2 length */
+ if (flags_version & ICE_L2TPV2_FLAGS_LEN) {
+ ice_memcpy(pkt + pos, &l2tpv2_data->length,
+ sizeof(l2tpv2_data->length),
+ ICE_NONDMA_TO_NONDMA);
+ pos += sizeof(l2tpv2_data->length);
+ }
+
+ /* copy l2tpv2 tunnel id */
+ ice_memcpy(pkt + pos, &l2tpv2_data->tunnel_id,
+ sizeof(l2tpv2_data->tunnel_id),
+ ICE_NONDMA_TO_NONDMA);
+ pos += sizeof(l2tpv2_data->tunnel_id);
+
+ /* copy l2tpv2 session id */
+ ice_memcpy(pkt + pos, &l2tpv2_data->session_id,
+ sizeof(l2tpv2_data->session_id),
+ ICE_NONDMA_TO_NONDMA);
+ pos += sizeof(l2tpv2_data->session_id);
+
+ /* copy l2tpv2 ns + nr */
+ if (flags_version & ICE_L2TPV2_FLAGS_SEQ) {
+ ice_memcpy(pkt + pos, &l2tpv2_data->ns,
+ sizeof(l2tpv2_data->ns),
+ ICE_NONDMA_TO_NONDMA);
+ pos += sizeof(l2tpv2_data->ns);
+
+ ice_memcpy(pkt + pos, &l2tpv2_data->nr,
+ sizeof(l2tpv2_data->nr),
+ ICE_NONDMA_TO_NONDMA);
+ pos += sizeof(l2tpv2_data->nr);
+ }
+
+ /* copy l2tpv2 offset size + offset padding */
+ if (flags_version & ICE_L2TPV2_FLAGS_OFF) {
+ ice_memcpy(pkt + pos, &l2tpv2_data->offset_size,
+ sizeof(l2tpv2_data->offset_size),
+ ICE_NONDMA_TO_NONDMA);
+ pos += sizeof(l2tpv2_data->offset_size);
+ /* insert 0 into offset padding */
+ offset_size = BE16_TO_CPU(l2tpv2_data->offset_size);
+ if (offset_size > ICE_FDIR_MAX_RAW_PKT_SIZE -
+ ice_fdir_pkt[idx].tun_pkt_len) {
+ offset_size = ICE_FDIR_MAX_RAW_PKT_SIZE -
+ ice_fdir_pkt[idx].tun_pkt_len;
+ }
+ ice_memset(pkt + pos, 0, offset_size, ICE_NONDMA_MEM);
+ pos += offset_size;
+ }
+
+ if (ice_fdir_pkt[idx].tun_pkt_len > offset) {
+ /* copy ppp packet */
+ ice_memcpy(pkt + pos,
+ ice_fdir_pkt[idx].tun_pkt + offset -
+ ICE_PPP_PKT_LENGTH,
+ ICE_PPP_PKT_LENGTH,
+ ICE_NONDMA_TO_NONDMA);
+ pos += ICE_PPP_PKT_LENGTH;
+
+ /* copy inner packets */
+ if (tun) {
+ ice_memcpy(pkt + pos,
+ ice_fdir_pkt[idx].tun_pkt + offset,
+ ice_fdir_pkt[idx].tun_pkt_len - offset,
+ ICE_NONDMA_TO_NONDMA);
+ }
+ }
+
+ return pos;
+}
+
/**
* ice_fdir_get_gen_prgm_pkt - generate a training packet
* @hw: pointer to the hardware structure
@@ -3306,6 +3830,9 @@ ice_fdir_get_gen_prgm_pkt(struct ice_hw *hw, struct ice_fdir_fltr *input,
u16 tnl_port;
u8 *loc;
u16 idx;
+ u16 flags_version;
+ u16 pos;
+ u16 offset;
if (input->flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER) {
switch (input->ip.v4.proto) {
@@ -3346,9 +3873,29 @@ ice_fdir_get_gen_prgm_pkt(struct ice_hw *hw, struct ice_fdir_fltr *input,
break;
if (idx == ICE_FDIR_NUM_PKT)
return ICE_ERR_PARAM;
+
if (!tun) {
- ice_memcpy(pkt, ice_fdir_pkt[idx].pkt,
- ice_fdir_pkt[idx].pkt_len, ICE_NONDMA_TO_NONDMA);
+ switch (flow) {
+ case ICE_FLTR_PTYPE_NONF_IPV4_L2TPV2_CONTROL:
+ case ICE_FLTR_PTYPE_NONF_IPV4_L2TPV2:
+ case ICE_FLTR_PTYPE_NONF_IPV4_L2TPV2_PPP:
+ offset = ICE_FDIR_IPV4_L2TPV2_PPP_PKT_OFF;
+ ice_fdir_gen_l2tpv2_pkt(pkt, &input->l2tpv2_data,
+ idx, offset, tun);
+ break;
+ case ICE_FLTR_PTYPE_NONF_IPV6_L2TPV2_CONTROL:
+ case ICE_FLTR_PTYPE_NONF_IPV6_L2TPV2:
+ case ICE_FLTR_PTYPE_NONF_IPV6_L2TPV2_PPP:
+ offset = ICE_FDIR_IPV6_L2TPV2_PPP_PKT_OFF;
+ ice_fdir_gen_l2tpv2_pkt(pkt, &input->l2tpv2_data,
+ idx, offset, tun);
+ break;
+ default:
+ ice_memcpy(pkt, ice_fdir_pkt[idx].pkt,
+ ice_fdir_pkt[idx].pkt_len,
+ ICE_NONDMA_TO_NONDMA);
+ break;
+ }
loc = pkt;
} else {
if (!ice_fdir_pkt[idx].tun_pkt)
@@ -3479,6 +4026,28 @@ ice_fdir_get_gen_prgm_pkt(struct ice_hw *hw, struct ice_fdir_fltr *input,
ICE_NONDMA_TO_NONDMA);
loc = &pkt[ICE_FDIR_V6_V4_GTPOGRE_EH_PKT_OFF];
break;
+ case ICE_FLTR_PTYPE_NONF_IPV4_L2TPV2_PPP_IPV4:
+ case ICE_FLTR_PTYPE_NONF_IPV4_L2TPV2_PPP_IPV4_UDP:
+ case ICE_FLTR_PTYPE_NONF_IPV4_L2TPV2_PPP_IPV4_TCP:
+ case ICE_FLTR_PTYPE_NONF_IPV4_L2TPV2_PPP_IPV6:
+ case ICE_FLTR_PTYPE_NONF_IPV4_L2TPV2_PPP_IPV6_UDP:
+ case ICE_FLTR_PTYPE_NONF_IPV4_L2TPV2_PPP_IPV6_TCP:
+ offset = ICE_FDIR_IPV4_L2TPV2_PPP_PKT_OFF;
+ pos = ice_fdir_gen_l2tpv2_pkt(pkt, &input->l2tpv2_data,
+ idx, offset, tun);
+ loc = &pkt[pos];
+ break;
+ case ICE_FLTR_PTYPE_NONF_IPV6_L2TPV2_PPP_IPV4:
+ case ICE_FLTR_PTYPE_NONF_IPV6_L2TPV2_PPP_IPV4_UDP:
+ case ICE_FLTR_PTYPE_NONF_IPV6_L2TPV2_PPP_IPV4_TCP:
+ case ICE_FLTR_PTYPE_NONF_IPV6_L2TPV2_PPP_IPV6:
+ case ICE_FLTR_PTYPE_NONF_IPV6_L2TPV2_PPP_IPV6_UDP:
+ case ICE_FLTR_PTYPE_NONF_IPV6_L2TPV2_PPP_IPV6_TCP:
+ offset = ICE_FDIR_IPV6_L2TPV2_PPP_PKT_OFF;
+ pos = ice_fdir_gen_l2tpv2_pkt(pkt, &input->l2tpv2_data,
+ idx, offset, tun);
+ loc = &pkt[pos];
+ break;
default:
if (ice_fdir_get_open_tunnel_port(hw, flow, &tnl_port))
return ICE_ERR_DOES_NOT_EXIST;
@@ -4021,6 +4590,138 @@ ice_fdir_get_gen_prgm_pkt(struct ice_hw *hw, struct ice_fdir_fltr *input,
ice_pkt_insert_u8_tc(loc, ICE_IPV6_NO_MAC_TC_OFFSET,
input->ip.v6.tc);
break;
+ case ICE_FLTR_PTYPE_NONF_IPV4_L2TPV2_CONTROL:
+ ice_pkt_insert_mac_addr(loc, input->ext_data_outer.dst_mac);
+ ice_pkt_insert_mac_addr(loc + ETH_ALEN,
+ input->ext_data_outer.src_mac);
+ ice_pkt_insert_u16(loc, ICE_IPV4_L2TPV2_LEN_SESS_ID_OFFSET,
+ input->l2tpv2_data.session_id);
+ break;
+ case ICE_FLTR_PTYPE_NONF_IPV4_L2TPV2:
+ case ICE_FLTR_PTYPE_NONF_IPV4_L2TPV2_PPP:
+ ice_pkt_insert_mac_addr(loc, input->ext_data_outer.dst_mac);
+ ice_pkt_insert_mac_addr(loc + ETH_ALEN,
+ input->ext_data_outer.src_mac);
+ flags_version = BE16_TO_CPU(input->l2tpv2_data.flags_version);
+ if (flags_version & ICE_L2TPV2_FLAGS_LEN) {
+ ice_pkt_insert_u16(loc,
+ ICE_IPV4_L2TPV2_LEN_SESS_ID_OFFSET,
+ input->l2tpv2_data.session_id);
+ } else {
+ ice_pkt_insert_u16(loc,
+ ICE_IPV4_L2TPV2_SESS_ID_OFFSET,
+ input->l2tpv2_data.session_id);
+ }
+ break;
+ case ICE_FLTR_PTYPE_NONF_IPV6_L2TPV2_CONTROL:
+ ice_pkt_insert_mac_addr(loc, input->ext_data_outer.dst_mac);
+ ice_pkt_insert_mac_addr(loc + ETH_ALEN,
+ input->ext_data_outer.src_mac);
+ ice_pkt_insert_u16(loc, ICE_IPV6_L2TPV2_LEN_SESS_ID_OFFSET,
+ input->l2tpv2_data.session_id);
+ break;
+ case ICE_FLTR_PTYPE_NONF_IPV6_L2TPV2:
+ case ICE_FLTR_PTYPE_NONF_IPV6_L2TPV2_PPP:
+ ice_pkt_insert_mac_addr(loc, input->ext_data_outer.dst_mac);
+ ice_pkt_insert_mac_addr(loc + ETH_ALEN,
+ input->ext_data_outer.src_mac);
+ flags_version = BE16_TO_CPU(input->l2tpv2_data.flags_version);
+ if (flags_version & ICE_L2TPV2_FLAGS_LEN) {
+ ice_pkt_insert_u16(loc,
+ ICE_IPV6_L2TPV2_LEN_SESS_ID_OFFSET,
+ input->l2tpv2_data.session_id);
+ } else {
+ ice_pkt_insert_u16(loc,
+ ICE_IPV6_L2TPV2_SESS_ID_OFFSET,
+ input->l2tpv2_data.session_id);
+ }
+ break;
+ case ICE_FLTR_PTYPE_NONF_IPV4_L2TPV2_PPP_IPV4:
+ case ICE_FLTR_PTYPE_NONF_IPV6_L2TPV2_PPP_IPV4:
+ ice_pkt_insert_u32(loc, ICE_IPV4_NO_MAC_DST_ADDR_OFFSET,
+ input->ip.v4.src_ip);
+ ice_pkt_insert_u32(loc, ICE_IPV4_NO_MAC_SRC_ADDR_OFFSET,
+ input->ip.v4.dst_ip);
+ ice_pkt_insert_u8(loc, ICE_IPV4_NO_MAC_TOS_OFFSET,
+ input->ip.v4.tos);
+ ice_pkt_insert_u8(loc, ICE_IPV4_NO_MAC_TTL_OFFSET,
+ input->ip.v4.ttl);
+ ice_pkt_insert_u8(loc, ICE_IPV4_NO_MAC_PROTO_OFFSET,
+ input->ip.v4.proto);
+ break;
+ case ICE_FLTR_PTYPE_NONF_IPV4_L2TPV2_PPP_IPV4_UDP:
+ case ICE_FLTR_PTYPE_NONF_IPV6_L2TPV2_PPP_IPV4_UDP:
+ ice_pkt_insert_u32(loc, ICE_IPV4_NO_MAC_DST_ADDR_OFFSET,
+ input->ip.v4.src_ip);
+ ice_pkt_insert_u16(loc, ICE_UDP4_NO_MAC_DST_PORT_OFFSET,
+ input->ip.v4.src_port);
+ ice_pkt_insert_u32(loc, ICE_IPV4_NO_MAC_SRC_ADDR_OFFSET,
+ input->ip.v4.dst_ip);
+ ice_pkt_insert_u16(loc, ICE_UDP4_NO_MAC_SRC_PORT_OFFSET,
+ input->ip.v4.dst_port);
+ ice_pkt_insert_u8(loc, ICE_IPV4_NO_MAC_TOS_OFFSET,
+ input->ip.v4.tos);
+ ice_pkt_insert_u8(loc, ICE_IPV4_NO_MAC_TTL_OFFSET,
+ input->ip.v4.ttl);
+ break;
+ case ICE_FLTR_PTYPE_NONF_IPV4_L2TPV2_PPP_IPV4_TCP:
+ case ICE_FLTR_PTYPE_NONF_IPV6_L2TPV2_PPP_IPV4_TCP:
+ ice_pkt_insert_u32(loc, ICE_IPV4_NO_MAC_DST_ADDR_OFFSET,
+ input->ip.v4.src_ip);
+ ice_pkt_insert_u16(loc, ICE_TCP4_NO_MAC_DST_PORT_OFFSET,
+ input->ip.v4.src_port);
+ ice_pkt_insert_u32(loc, ICE_IPV4_NO_MAC_SRC_ADDR_OFFSET,
+ input->ip.v4.dst_ip);
+ ice_pkt_insert_u16(loc, ICE_TCP4_NO_MAC_SRC_PORT_OFFSET,
+ input->ip.v4.dst_port);
+ ice_pkt_insert_u8(loc, ICE_IPV4_NO_MAC_TOS_OFFSET,
+ input->ip.v4.tos);
+ ice_pkt_insert_u8(loc, ICE_IPV4_NO_MAC_TTL_OFFSET,
+ input->ip.v4.ttl);
+ break;
+ case ICE_FLTR_PTYPE_NONF_IPV4_L2TPV2_PPP_IPV6:
+ case ICE_FLTR_PTYPE_NONF_IPV6_L2TPV2_PPP_IPV6:
+ ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_NO_MAC_DST_ADDR_OFFSET,
+ input->ip.v6.src_ip);
+ ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_NO_MAC_SRC_ADDR_OFFSET,
+ input->ip.v6.dst_ip);
+ ice_pkt_insert_u8_tc(loc, ICE_IPV6_NO_MAC_TC_OFFSET,
+ input->ip.v6.tc);
+ ice_pkt_insert_u8(loc, ICE_IPV6_NO_MAC_HLIM_OFFSET,
+ input->ip.v6.hlim);
+ ice_pkt_insert_u8(loc, ICE_IPV6_NO_MAC_PROTO_OFFSET,
+ input->ip.v6.proto);
+ break;
+ case ICE_FLTR_PTYPE_NONF_IPV4_L2TPV2_PPP_IPV6_UDP:
+ case ICE_FLTR_PTYPE_NONF_IPV6_L2TPV2_PPP_IPV6_UDP:
+ ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_NO_MAC_DST_ADDR_OFFSET,
+ input->ip.v6.src_ip);
+ ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_NO_MAC_SRC_ADDR_OFFSET,
+ input->ip.v6.dst_ip);
+ ice_pkt_insert_u16(loc, ICE_UDP6_NO_MAC_DST_PORT_OFFSET,
+ input->ip.v6.src_port);
+ ice_pkt_insert_u16(loc, ICE_UDP6_NO_MAC_SRC_PORT_OFFSET,
+ input->ip.v6.dst_port);
+ ice_pkt_insert_u8_tc(loc, ICE_IPV6_NO_MAC_TC_OFFSET,
+ input->ip.v6.tc);
+ ice_pkt_insert_u8(loc, ICE_IPV6_NO_MAC_HLIM_OFFSET,
+ input->ip.v6.hlim);
+ break;
+ case ICE_FLTR_PTYPE_NONF_IPV4_L2TPV2_PPP_IPV6_TCP:
+ case ICE_FLTR_PTYPE_NONF_IPV6_L2TPV2_PPP_IPV6_TCP:
+ ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_NO_MAC_DST_ADDR_OFFSET,
+ input->ip.v6.src_ip);
+ ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_NO_MAC_SRC_ADDR_OFFSET,
+ input->ip.v6.dst_ip);
+ ice_pkt_insert_u16(loc, ICE_TCP6_NO_MAC_DST_PORT_OFFSET,
+ input->ip.v6.src_port);
+ ice_pkt_insert_u16(loc, ICE_TCP6_NO_MAC_SRC_PORT_OFFSET,
+ input->ip.v6.dst_port);
+ ice_pkt_insert_u8_tc(loc, ICE_IPV6_NO_MAC_TC_OFFSET,
+ input->ip.v6.tc);
+ ice_pkt_insert_u8(loc, ICE_IPV6_NO_MAC_HLIM_OFFSET,
+ input->ip.v6.hlim);
+ break;
case ICE_FLTR_PTYPE_NONF_IPV6_TCP:
ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
input->ip.v6.src_ip);
@@ -4252,6 +4953,12 @@ ice_fdir_comp_rules_extended(struct ice_fdir_fltr *a, struct ice_fdir_fltr *b)
return false;
if (memcmp(&a->ecpri_mask, &b->ecpri_mask, sizeof(a->ecpri_mask)))
return false;
+ if (memcmp(&a->l2tpv2_data.session_id, &b->l2tpv2_data.session_id,
+ sizeof(a->l2tpv2_data.session_id)))
+ return false;
+ if (memcmp(&a->l2tpv2_mask.session_id, &b->l2tpv2_mask.session_id,
+ sizeof(a->l2tpv2_mask.session_id)))
+ return false;
return true;
}
@@ -26,6 +26,8 @@
#define ICE_FDIR_V4_V6_GTPOGRE_EH_PKT_OFF 102
#define ICE_FDIR_V6_V4_GTPOGRE_EH_PKT_OFF 102
#define ICE_FDIR_V6_V6_GTPOGRE_EH_PKT_OFF 122
+#define ICE_FDIR_IPV4_L2TPV2_PPP_PKT_OFF 52
+#define ICE_FDIR_IPV6_L2TPV2_PPP_PKT_OFF 72
#define ICE_FDIR_TUN_PKT_OFF 50
#define ICE_FDIR_MAX_RAW_PKT_SIZE (512 + ICE_FDIR_TUN_PKT_OFF)
@@ -96,6 +98,10 @@
#define ICE_IPV4_VXLAN_VNI_OFFSET 46
#define ICE_ECPRI_TP0_PC_ID_OFFSET 18
#define ICE_IPV4_UDP_ECPRI_TP0_PC_ID_OFFSET 46
+#define ICE_IPV4_L2TPV2_SESS_ID_OFFSET 46
+#define ICE_IPV6_L2TPV2_SESS_ID_OFFSET 66
+#define ICE_IPV4_L2TPV2_LEN_SESS_ID_OFFSET 48
+#define ICE_IPV6_L2TPV2_LEN_SESS_ID_OFFSET 68
#define ICE_FDIR_MAX_FLTRS 16384
@@ -222,6 +228,16 @@ struct ice_fdir_ecpri {
__be16 pc_id;
};
+struct ice_fdir_l2tpv2 {
+ __be16 flags_version;
+ __be16 length;
+ __be16 tunnel_id;
+ __be16 session_id;
+ __be16 ns;
+ __be16 nr;
+ __be16 offset_size;
+};
+
struct ice_fdir_extra {
u8 dst_mac[ETH_ALEN]; /* dest MAC address */
u8 src_mac[ETH_ALEN]; /* src MAC address */
@@ -261,6 +277,9 @@ struct ice_fdir_fltr {
struct ice_fdir_ecpri ecpri_data;
struct ice_fdir_ecpri ecpri_mask;
+ struct ice_fdir_l2tpv2 l2tpv2_data;
+ struct ice_fdir_l2tpv2 l2tpv2_mask;
+
struct ice_fdir_extra ext_data;
struct ice_fdir_extra ext_mask;
@@ -282,6 +282,15 @@ struct ice_phy_info {
#define ICE_MAX_NUM_MIRROR_RULES 64
+#define ICE_L2TPV2_FLAGS_CTRL 0x8000
+#define ICE_L2TPV2_FLAGS_LEN 0x4000
+#define ICE_L2TPV2_FLAGS_SEQ 0x0800
+#define ICE_L2TPV2_FLAGS_OFF 0x0200
+#define ICE_L2TPV2_FLAGS_VER 0x0002
+
+#define ICE_L2TPV2_PKT_LENGTH 6
+#define ICE_PPP_PKT_LENGTH 4
+
/* protocol enumeration for filters */
enum ice_fltr_ptype {
/* NONE - used for undef/error */
@@ -479,6 +488,24 @@ enum ice_fltr_ptype {
ICE_FLTR_PTYPE_NONF_IPV4_UDP_VXLAN_IPV4_TCP,
ICE_FLTR_PTYPE_NONF_IPV4_UDP_VXLAN_IPV4_SCTP,
ICE_FLTR_PTYPE_NONF_IPV4_UDP_VXLAN_IPV4_OTHER,
+ ICE_FLTR_PTYPE_NONF_IPV4_L2TPV2_CONTROL,
+ ICE_FLTR_PTYPE_NONF_IPV4_L2TPV2,
+ ICE_FLTR_PTYPE_NONF_IPV4_L2TPV2_PPP,
+ ICE_FLTR_PTYPE_NONF_IPV4_L2TPV2_PPP_IPV4,
+ ICE_FLTR_PTYPE_NONF_IPV4_L2TPV2_PPP_IPV4_UDP,
+ ICE_FLTR_PTYPE_NONF_IPV4_L2TPV2_PPP_IPV4_TCP,
+ ICE_FLTR_PTYPE_NONF_IPV4_L2TPV2_PPP_IPV6,
+ ICE_FLTR_PTYPE_NONF_IPV4_L2TPV2_PPP_IPV6_UDP,
+ ICE_FLTR_PTYPE_NONF_IPV4_L2TPV2_PPP_IPV6_TCP,
+ ICE_FLTR_PTYPE_NONF_IPV6_L2TPV2_CONTROL,
+ ICE_FLTR_PTYPE_NONF_IPV6_L2TPV2,
+ ICE_FLTR_PTYPE_NONF_IPV6_L2TPV2_PPP,
+ ICE_FLTR_PTYPE_NONF_IPV6_L2TPV2_PPP_IPV4,
+ ICE_FLTR_PTYPE_NONF_IPV6_L2TPV2_PPP_IPV4_UDP,
+ ICE_FLTR_PTYPE_NONF_IPV6_L2TPV2_PPP_IPV4_TCP,
+ ICE_FLTR_PTYPE_NONF_IPV6_L2TPV2_PPP_IPV6,
+ ICE_FLTR_PTYPE_NONF_IPV6_L2TPV2_PPP_IPV6_UDP,
+ ICE_FLTR_PTYPE_NONF_IPV6_L2TPV2_PPP_IPV6_TCP,
ICE_FLTR_PTYPE_MAX,
};