2020-05-12 09:01:40 +08:00
|
|
|
// SPDX-License-Identifier: GPL-2.0
|
|
|
|
/* Copyright (C) 2018-2020, Intel Corporation. */
|
|
|
|
|
|
|
|
#include "ice_common.h"
|
|
|
|
|
2020-05-12 09:01:42 +08:00
|
|
|
/* These are training packet headers used to program flow director filters. */
|
|
|
|
static const u8 ice_fdir_tcpv4_pkt[] = {
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
|
|
|
|
0x00, 0x28, 0x00, 0x01, 0x00, 0x00, 0x40, 0x06,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00,
|
|
|
|
0x20, 0x00, 0x00, 0x00, 0x00, 0x00
|
|
|
|
};
|
|
|
|
|
|
|
|
static const u8 ice_fdir_udpv4_pkt[] = {
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
|
|
|
|
0x00, 0x1C, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00,
|
|
|
|
};
|
|
|
|
|
|
|
|
static const u8 ice_fdir_sctpv4_pkt[] = {
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
|
|
|
|
0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x40, 0x84,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
};
|
|
|
|
|
|
|
|
static const u8 ice_fdir_ipv4_pkt[] = {
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
|
|
|
|
0x00, 0x14, 0x00, 0x00, 0x40, 0x00, 0x40, 0x10,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00
|
|
|
|
};
|
|
|
|
|
2021-03-09 11:08:08 +08:00
|
|
|
static const u8 ice_fdir_udp4_gtpu4_pkt[] = {
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
|
|
|
|
0x00, 0x4c, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x08, 0x68, 0x08, 0x68, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x34, 0xff, 0x00, 0x28, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x02, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00,
|
|
|
|
0x00, 0x1c, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00,
|
|
|
|
};
|
|
|
|
|
|
|
|
static const u8 ice_fdir_tcp4_gtpu4_pkt[] = {
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
|
|
|
|
0x00, 0x58, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x08, 0x68, 0x08, 0x68, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x34, 0xff, 0x00, 0x28, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x02, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00,
|
|
|
|
0x00, 0x28, 0x00, 0x00, 0x40, 0x00, 0x40, 0x06,
|
|
|
|
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,
|
|
|
|
};
|
|
|
|
|
|
|
|
static const u8 ice_fdir_icmp4_gtpu4_pkt[] = {
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
|
|
|
|
0x00, 0x4c, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x08, 0x68, 0x08, 0x68, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x34, 0xff, 0x00, 0x28, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x02, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00,
|
|
|
|
0x00, 0x1c, 0x00, 0x00, 0x40, 0x00, 0x40, 0x01,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00,
|
|
|
|
};
|
|
|
|
|
|
|
|
static const u8 ice_fdir_ipv4_gtpu4_pkt[] = {
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
|
|
|
|
0x00, 0x44, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x08, 0x68, 0x08, 0x68, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x34, 0xff, 0x00, 0x28, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x02, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00,
|
|
|
|
0x00, 0x14, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00,
|
|
|
|
};
|
|
|
|
|
2021-03-09 11:08:09 +08:00
|
|
|
static const u8 ice_fdir_ipv4_l2tpv3_pkt[] = {
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
|
|
|
|
0x00, 0x14, 0x00, 0x00, 0x40, 0x00, 0x40, 0x73,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
};
|
|
|
|
|
|
|
|
static const u8 ice_fdir_ipv6_l2tpv3_pkt[] = {
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x73, 0x40, 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, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00,
|
|
|
|
};
|
|
|
|
|
|
|
|
static const u8 ice_fdir_ipv4_esp_pkt[] = {
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
|
|
|
|
0x00, 0x14, 0x00, 0x00, 0x40, 0x00, 0x40, 0x32,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00
|
|
|
|
};
|
|
|
|
|
|
|
|
static const u8 ice_fdir_ipv6_esp_pkt[] = {
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x32, 0x40, 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, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
};
|
|
|
|
|
|
|
|
static const u8 ice_fdir_ipv4_ah_pkt[] = {
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
|
|
|
|
0x00, 0x14, 0x00, 0x00, 0x40, 0x00, 0x40, 0x33,
|
|
|
|
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
|
|
|
|
};
|
|
|
|
|
|
|
|
static const u8 ice_fdir_ipv6_ah_pkt[] = {
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x33, 0x40, 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, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
};
|
|
|
|
|
|
|
|
static const u8 ice_fdir_ipv4_nat_t_esp_pkt[] = {
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
|
|
|
|
0x00, 0x1C, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x11, 0x94, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00,
|
|
|
|
};
|
|
|
|
|
|
|
|
static const u8 ice_fdir_ipv6_nat_t_esp_pkt[] = {
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x08, 0x11, 0x40, 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, 0x00, 0x00,
|
|
|
|
0x11, 0x94, 0x00, 0x00, 0x00, 0x08,
|
|
|
|
};
|
|
|
|
|
|
|
|
static const u8 ice_fdir_ipv4_pfcp_node_pkt[] = {
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
|
|
|
|
0x00, 0x2C, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x22, 0x65, 0x22, 0x65, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x20, 0x00, 0x00, 0x10, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00,
|
|
|
|
};
|
|
|
|
|
|
|
|
static const u8 ice_fdir_ipv4_pfcp_session_pkt[] = {
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
|
|
|
|
0x00, 0x2C, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x22, 0x65, 0x22, 0x65, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x21, 0x00, 0x00, 0x10, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00,
|
|
|
|
};
|
|
|
|
|
|
|
|
static const u8 ice_fdir_ipv6_pfcp_node_pkt[] = {
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x18, 0x11, 0x40, 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, 0x22, 0x65,
|
|
|
|
0x22, 0x65, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00,
|
|
|
|
0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
};
|
|
|
|
|
|
|
|
static const u8 ice_fdir_ipv6_pfcp_session_pkt[] = {
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x18, 0x11, 0x40, 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, 0x22, 0x65,
|
|
|
|
0x22, 0x65, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00,
|
|
|
|
0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
};
|
|
|
|
|
2021-03-09 11:08:07 +08:00
|
|
|
static const u8 ice_fdir_non_ip_l2_pkt[] = {
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
};
|
|
|
|
|
2020-05-12 09:01:43 +08:00
|
|
|
static const u8 ice_fdir_tcpv6_pkt[] = {
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x14, 0x06, 0x40, 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, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x50, 0x00, 0x20, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00,
|
|
|
|
};
|
|
|
|
|
|
|
|
static const u8 ice_fdir_udpv6_pkt[] = {
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x08, 0x11, 0x40, 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, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x08, 0x00, 0x00,
|
|
|
|
};
|
|
|
|
|
|
|
|
static const u8 ice_fdir_sctpv6_pkt[] = {
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x0C, 0x84, 0x40, 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, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00,
|
|
|
|
};
|
|
|
|
|
|
|
|
static const u8 ice_fdir_ipv6_pkt[] = {
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x3B, 0x40, 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,
|
|
|
|
};
|
|
|
|
|
2020-05-12 09:01:42 +08:00
|
|
|
static const u8 ice_fdir_tcp4_tun_pkt[] = {
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
|
|
|
|
0x00, 0x5a, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
|
|
|
|
0x45, 0x00, 0x00, 0x28, 0x00, 0x00, 0x40, 0x00,
|
|
|
|
0x40, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x50, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
};
|
|
|
|
|
|
|
|
static const u8 ice_fdir_udp4_tun_pkt[] = {
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
|
|
|
|
0x00, 0x4e, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
|
|
|
|
0x45, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x40, 0x00,
|
|
|
|
0x40, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00,
|
|
|
|
};
|
|
|
|
|
|
|
|
static const u8 ice_fdir_sctp4_tun_pkt[] = {
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
|
|
|
|
0x00, 0x52, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
|
|
|
|
0x45, 0x00, 0x00, 0x20, 0x00, 0x01, 0x00, 0x00,
|
|
|
|
0x40, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
};
|
|
|
|
|
|
|
|
static const u8 ice_fdir_ip4_tun_pkt[] = {
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
|
|
|
|
0x00, 0x46, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
|
|
|
|
0x45, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00,
|
|
|
|
};
|
|
|
|
|
2020-05-12 09:01:43 +08:00
|
|
|
static const u8 ice_fdir_tcp6_tun_pkt[] = {
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
|
|
|
|
0x00, 0x6e, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd,
|
|
|
|
0x60, 0x00, 0x00, 0x00, 0x00, 0x14, 0x06, 0x40,
|
|
|
|
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,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x20, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00,
|
|
|
|
};
|
|
|
|
|
|
|
|
static const u8 ice_fdir_udp6_tun_pkt[] = {
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
|
|
|
|
0x00, 0x62, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd,
|
|
|
|
0x60, 0x00, 0x00, 0x00, 0x00, 0x08, 0x11, 0x40,
|
|
|
|
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,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
};
|
|
|
|
|
|
|
|
static const u8 ice_fdir_sctp6_tun_pkt[] = {
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
|
|
|
|
0x00, 0x66, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd,
|
|
|
|
0x60, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x84, 0x40,
|
|
|
|
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,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00,
|
|
|
|
};
|
|
|
|
|
|
|
|
static const u8 ice_fdir_ip6_tun_pkt[] = {
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
|
|
|
|
0x00, 0x5a, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd,
|
|
|
|
0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3b, 0x40,
|
|
|
|
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,
|
|
|
|
};
|
|
|
|
|
2020-05-12 09:01:42 +08:00
|
|
|
/* Flow Director no-op training packet table */
|
|
|
|
static const struct ice_fdir_base_pkt ice_fdir_pkt[] = {
|
|
|
|
{
|
|
|
|
ICE_FLTR_PTYPE_NONF_IPV4_TCP,
|
|
|
|
sizeof(ice_fdir_tcpv4_pkt), ice_fdir_tcpv4_pkt,
|
|
|
|
sizeof(ice_fdir_tcp4_tun_pkt), ice_fdir_tcp4_tun_pkt,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
ICE_FLTR_PTYPE_NONF_IPV4_UDP,
|
|
|
|
sizeof(ice_fdir_udpv4_pkt), ice_fdir_udpv4_pkt,
|
|
|
|
sizeof(ice_fdir_udp4_tun_pkt), ice_fdir_udp4_tun_pkt,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
ICE_FLTR_PTYPE_NONF_IPV4_SCTP,
|
|
|
|
sizeof(ice_fdir_sctpv4_pkt), ice_fdir_sctpv4_pkt,
|
|
|
|
sizeof(ice_fdir_sctp4_tun_pkt), ice_fdir_sctp4_tun_pkt,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
ICE_FLTR_PTYPE_NONF_IPV4_OTHER,
|
|
|
|
sizeof(ice_fdir_ipv4_pkt), ice_fdir_ipv4_pkt,
|
|
|
|
sizeof(ice_fdir_ip4_tun_pkt), ice_fdir_ip4_tun_pkt,
|
|
|
|
},
|
2021-03-09 11:08:08 +08:00
|
|
|
{
|
|
|
|
ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_UDP,
|
|
|
|
sizeof(ice_fdir_udp4_gtpu4_pkt),
|
|
|
|
ice_fdir_udp4_gtpu4_pkt,
|
|
|
|
sizeof(ice_fdir_udp4_gtpu4_pkt),
|
|
|
|
ice_fdir_udp4_gtpu4_pkt,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_TCP,
|
|
|
|
sizeof(ice_fdir_tcp4_gtpu4_pkt),
|
|
|
|
ice_fdir_tcp4_gtpu4_pkt,
|
|
|
|
sizeof(ice_fdir_tcp4_gtpu4_pkt),
|
|
|
|
ice_fdir_tcp4_gtpu4_pkt,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_ICMP,
|
|
|
|
sizeof(ice_fdir_icmp4_gtpu4_pkt),
|
|
|
|
ice_fdir_icmp4_gtpu4_pkt,
|
|
|
|
sizeof(ice_fdir_icmp4_gtpu4_pkt),
|
|
|
|
ice_fdir_icmp4_gtpu4_pkt,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_OTHER,
|
|
|
|
sizeof(ice_fdir_ipv4_gtpu4_pkt),
|
|
|
|
ice_fdir_ipv4_gtpu4_pkt,
|
|
|
|
sizeof(ice_fdir_ipv4_gtpu4_pkt),
|
|
|
|
ice_fdir_ipv4_gtpu4_pkt,
|
|
|
|
},
|
2021-03-09 11:08:09 +08:00
|
|
|
{
|
|
|
|
ICE_FLTR_PTYPE_NONF_IPV4_L2TPV3,
|
|
|
|
sizeof(ice_fdir_ipv4_l2tpv3_pkt), ice_fdir_ipv4_l2tpv3_pkt,
|
|
|
|
sizeof(ice_fdir_ipv4_l2tpv3_pkt), ice_fdir_ipv4_l2tpv3_pkt,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
ICE_FLTR_PTYPE_NONF_IPV6_L2TPV3,
|
|
|
|
sizeof(ice_fdir_ipv6_l2tpv3_pkt), ice_fdir_ipv6_l2tpv3_pkt,
|
|
|
|
sizeof(ice_fdir_ipv6_l2tpv3_pkt), ice_fdir_ipv6_l2tpv3_pkt,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
ICE_FLTR_PTYPE_NONF_IPV4_ESP,
|
|
|
|
sizeof(ice_fdir_ipv4_esp_pkt), ice_fdir_ipv4_esp_pkt,
|
|
|
|
sizeof(ice_fdir_ipv4_esp_pkt), ice_fdir_ipv4_esp_pkt,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
ICE_FLTR_PTYPE_NONF_IPV6_ESP,
|
|
|
|
sizeof(ice_fdir_ipv6_esp_pkt), ice_fdir_ipv6_esp_pkt,
|
|
|
|
sizeof(ice_fdir_ipv6_esp_pkt), ice_fdir_ipv6_esp_pkt,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
ICE_FLTR_PTYPE_NONF_IPV4_AH,
|
|
|
|
sizeof(ice_fdir_ipv4_ah_pkt), ice_fdir_ipv4_ah_pkt,
|
|
|
|
sizeof(ice_fdir_ipv4_ah_pkt), ice_fdir_ipv4_ah_pkt,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
ICE_FLTR_PTYPE_NONF_IPV6_AH,
|
|
|
|
sizeof(ice_fdir_ipv6_ah_pkt), ice_fdir_ipv6_ah_pkt,
|
|
|
|
sizeof(ice_fdir_ipv6_ah_pkt), ice_fdir_ipv6_ah_pkt,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
ICE_FLTR_PTYPE_NONF_IPV4_NAT_T_ESP,
|
|
|
|
sizeof(ice_fdir_ipv4_nat_t_esp_pkt),
|
|
|
|
ice_fdir_ipv4_nat_t_esp_pkt,
|
|
|
|
sizeof(ice_fdir_ipv4_nat_t_esp_pkt),
|
|
|
|
ice_fdir_ipv4_nat_t_esp_pkt,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
ICE_FLTR_PTYPE_NONF_IPV6_NAT_T_ESP,
|
|
|
|
sizeof(ice_fdir_ipv6_nat_t_esp_pkt),
|
|
|
|
ice_fdir_ipv6_nat_t_esp_pkt,
|
|
|
|
sizeof(ice_fdir_ipv6_nat_t_esp_pkt),
|
|
|
|
ice_fdir_ipv6_nat_t_esp_pkt,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
ICE_FLTR_PTYPE_NONF_IPV4_PFCP_NODE,
|
|
|
|
sizeof(ice_fdir_ipv4_pfcp_node_pkt),
|
|
|
|
ice_fdir_ipv4_pfcp_node_pkt,
|
|
|
|
sizeof(ice_fdir_ipv4_pfcp_node_pkt),
|
|
|
|
ice_fdir_ipv4_pfcp_node_pkt,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
ICE_FLTR_PTYPE_NONF_IPV4_PFCP_SESSION,
|
|
|
|
sizeof(ice_fdir_ipv4_pfcp_session_pkt),
|
|
|
|
ice_fdir_ipv4_pfcp_session_pkt,
|
|
|
|
sizeof(ice_fdir_ipv4_pfcp_session_pkt),
|
|
|
|
ice_fdir_ipv4_pfcp_session_pkt,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
ICE_FLTR_PTYPE_NONF_IPV6_PFCP_NODE,
|
|
|
|
sizeof(ice_fdir_ipv6_pfcp_node_pkt),
|
|
|
|
ice_fdir_ipv6_pfcp_node_pkt,
|
|
|
|
sizeof(ice_fdir_ipv6_pfcp_node_pkt),
|
|
|
|
ice_fdir_ipv6_pfcp_node_pkt,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
ICE_FLTR_PTYPE_NONF_IPV6_PFCP_SESSION,
|
|
|
|
sizeof(ice_fdir_ipv6_pfcp_session_pkt),
|
|
|
|
ice_fdir_ipv6_pfcp_session_pkt,
|
|
|
|
sizeof(ice_fdir_ipv6_pfcp_session_pkt),
|
|
|
|
ice_fdir_ipv6_pfcp_session_pkt,
|
|
|
|
},
|
2021-03-09 11:08:07 +08:00
|
|
|
{
|
|
|
|
ICE_FLTR_PTYPE_NON_IP_L2,
|
|
|
|
sizeof(ice_fdir_non_ip_l2_pkt), ice_fdir_non_ip_l2_pkt,
|
|
|
|
sizeof(ice_fdir_non_ip_l2_pkt), ice_fdir_non_ip_l2_pkt,
|
|
|
|
},
|
2020-05-12 09:01:43 +08:00
|
|
|
{
|
|
|
|
ICE_FLTR_PTYPE_NONF_IPV6_TCP,
|
|
|
|
sizeof(ice_fdir_tcpv6_pkt), ice_fdir_tcpv6_pkt,
|
|
|
|
sizeof(ice_fdir_tcp6_tun_pkt), ice_fdir_tcp6_tun_pkt,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
ICE_FLTR_PTYPE_NONF_IPV6_UDP,
|
|
|
|
sizeof(ice_fdir_udpv6_pkt), ice_fdir_udpv6_pkt,
|
|
|
|
sizeof(ice_fdir_udp6_tun_pkt), ice_fdir_udp6_tun_pkt,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
ICE_FLTR_PTYPE_NONF_IPV6_SCTP,
|
|
|
|
sizeof(ice_fdir_sctpv6_pkt), ice_fdir_sctpv6_pkt,
|
|
|
|
sizeof(ice_fdir_sctp6_tun_pkt), ice_fdir_sctp6_tun_pkt,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
ICE_FLTR_PTYPE_NONF_IPV6_OTHER,
|
|
|
|
sizeof(ice_fdir_ipv6_pkt), ice_fdir_ipv6_pkt,
|
|
|
|
sizeof(ice_fdir_ip6_tun_pkt), ice_fdir_ip6_tun_pkt,
|
|
|
|
},
|
2020-05-12 09:01:42 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
#define ICE_FDIR_NUM_PKT ARRAY_SIZE(ice_fdir_pkt)
|
|
|
|
|
|
|
|
/**
|
|
|
|
* ice_set_dflt_val_fd_desc
|
|
|
|
* @fd_fltr_ctx: pointer to fd filter descriptor
|
|
|
|
*/
|
|
|
|
static void ice_set_dflt_val_fd_desc(struct ice_fd_fltr_desc_ctx *fd_fltr_ctx)
|
|
|
|
{
|
|
|
|
fd_fltr_ctx->comp_q = ICE_FXD_FLTR_QW0_COMP_Q_ZERO;
|
|
|
|
fd_fltr_ctx->comp_report = ICE_FXD_FLTR_QW0_COMP_REPORT_SW_FAIL;
|
|
|
|
fd_fltr_ctx->fd_space = ICE_FXD_FLTR_QW0_FD_SPACE_GUAR_BEST;
|
|
|
|
fd_fltr_ctx->cnt_ena = ICE_FXD_FLTR_QW0_STAT_ENA_PKTS;
|
|
|
|
fd_fltr_ctx->evict_ena = ICE_FXD_FLTR_QW0_EVICT_ENA_TRUE;
|
|
|
|
fd_fltr_ctx->toq = ICE_FXD_FLTR_QW0_TO_Q_EQUALS_QINDEX;
|
|
|
|
fd_fltr_ctx->toq_prio = ICE_FXD_FLTR_QW0_TO_Q_PRIO1;
|
|
|
|
fd_fltr_ctx->dpu_recipe = ICE_FXD_FLTR_QW0_DPU_RECIPE_DFLT;
|
|
|
|
fd_fltr_ctx->drop = ICE_FXD_FLTR_QW0_DROP_NO;
|
|
|
|
fd_fltr_ctx->flex_prio = ICE_FXD_FLTR_QW0_FLEX_PRI_NONE;
|
|
|
|
fd_fltr_ctx->flex_mdid = ICE_FXD_FLTR_QW0_FLEX_MDID0;
|
|
|
|
fd_fltr_ctx->flex_val = ICE_FXD_FLTR_QW0_FLEX_VAL0;
|
|
|
|
fd_fltr_ctx->dtype = ICE_TX_DESC_DTYPE_FLTR_PROG;
|
|
|
|
fd_fltr_ctx->desc_prof_prio = ICE_FXD_FLTR_QW1_PROF_PRIO_ZERO;
|
|
|
|
fd_fltr_ctx->desc_prof = ICE_FXD_FLTR_QW1_PROF_ZERO;
|
|
|
|
fd_fltr_ctx->swap = ICE_FXD_FLTR_QW1_SWAP_SET;
|
|
|
|
fd_fltr_ctx->fdid_prio = ICE_FXD_FLTR_QW1_FDID_PRI_ONE;
|
|
|
|
fd_fltr_ctx->fdid_mdid = ICE_FXD_FLTR_QW1_FDID_MDID_FD;
|
|
|
|
fd_fltr_ctx->fdid = ICE_FXD_FLTR_QW1_FDID_ZERO;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* ice_set_fd_desc_val
|
|
|
|
* @ctx: pointer to fd filter descriptor context
|
|
|
|
* @fdir_desc: populated with fd filter descriptor values
|
|
|
|
*/
|
|
|
|
static void
|
|
|
|
ice_set_fd_desc_val(struct ice_fd_fltr_desc_ctx *ctx,
|
|
|
|
struct ice_fltr_desc *fdir_desc)
|
|
|
|
{
|
|
|
|
u64 qword;
|
|
|
|
|
|
|
|
/* prep QW0 of FD filter programming desc */
|
|
|
|
qword = ((u64)ctx->qindex << ICE_FXD_FLTR_QW0_QINDEX_S) &
|
|
|
|
ICE_FXD_FLTR_QW0_QINDEX_M;
|
|
|
|
qword |= ((u64)ctx->comp_q << ICE_FXD_FLTR_QW0_COMP_Q_S) &
|
|
|
|
ICE_FXD_FLTR_QW0_COMP_Q_M;
|
|
|
|
qword |= ((u64)ctx->comp_report << ICE_FXD_FLTR_QW0_COMP_REPORT_S) &
|
|
|
|
ICE_FXD_FLTR_QW0_COMP_REPORT_M;
|
|
|
|
qword |= ((u64)ctx->fd_space << ICE_FXD_FLTR_QW0_FD_SPACE_S) &
|
|
|
|
ICE_FXD_FLTR_QW0_FD_SPACE_M;
|
|
|
|
qword |= ((u64)ctx->cnt_index << ICE_FXD_FLTR_QW0_STAT_CNT_S) &
|
|
|
|
ICE_FXD_FLTR_QW0_STAT_CNT_M;
|
|
|
|
qword |= ((u64)ctx->cnt_ena << ICE_FXD_FLTR_QW0_STAT_ENA_S) &
|
|
|
|
ICE_FXD_FLTR_QW0_STAT_ENA_M;
|
|
|
|
qword |= ((u64)ctx->evict_ena << ICE_FXD_FLTR_QW0_EVICT_ENA_S) &
|
|
|
|
ICE_FXD_FLTR_QW0_EVICT_ENA_M;
|
|
|
|
qword |= ((u64)ctx->toq << ICE_FXD_FLTR_QW0_TO_Q_S) &
|
|
|
|
ICE_FXD_FLTR_QW0_TO_Q_M;
|
|
|
|
qword |= ((u64)ctx->toq_prio << ICE_FXD_FLTR_QW0_TO_Q_PRI_S) &
|
|
|
|
ICE_FXD_FLTR_QW0_TO_Q_PRI_M;
|
|
|
|
qword |= ((u64)ctx->dpu_recipe << ICE_FXD_FLTR_QW0_DPU_RECIPE_S) &
|
|
|
|
ICE_FXD_FLTR_QW0_DPU_RECIPE_M;
|
|
|
|
qword |= ((u64)ctx->drop << ICE_FXD_FLTR_QW0_DROP_S) &
|
|
|
|
ICE_FXD_FLTR_QW0_DROP_M;
|
|
|
|
qword |= ((u64)ctx->flex_prio << ICE_FXD_FLTR_QW0_FLEX_PRI_S) &
|
|
|
|
ICE_FXD_FLTR_QW0_FLEX_PRI_M;
|
|
|
|
qword |= ((u64)ctx->flex_mdid << ICE_FXD_FLTR_QW0_FLEX_MDID_S) &
|
|
|
|
ICE_FXD_FLTR_QW0_FLEX_MDID_M;
|
|
|
|
qword |= ((u64)ctx->flex_val << ICE_FXD_FLTR_QW0_FLEX_VAL_S) &
|
|
|
|
ICE_FXD_FLTR_QW0_FLEX_VAL_M;
|
|
|
|
fdir_desc->qidx_compq_space_stat = cpu_to_le64(qword);
|
|
|
|
|
|
|
|
/* prep QW1 of FD filter programming desc */
|
|
|
|
qword = ((u64)ctx->dtype << ICE_FXD_FLTR_QW1_DTYPE_S) &
|
|
|
|
ICE_FXD_FLTR_QW1_DTYPE_M;
|
|
|
|
qword |= ((u64)ctx->pcmd << ICE_FXD_FLTR_QW1_PCMD_S) &
|
|
|
|
ICE_FXD_FLTR_QW1_PCMD_M;
|
|
|
|
qword |= ((u64)ctx->desc_prof_prio << ICE_FXD_FLTR_QW1_PROF_PRI_S) &
|
|
|
|
ICE_FXD_FLTR_QW1_PROF_PRI_M;
|
|
|
|
qword |= ((u64)ctx->desc_prof << ICE_FXD_FLTR_QW1_PROF_S) &
|
|
|
|
ICE_FXD_FLTR_QW1_PROF_M;
|
|
|
|
qword |= ((u64)ctx->fd_vsi << ICE_FXD_FLTR_QW1_FD_VSI_S) &
|
|
|
|
ICE_FXD_FLTR_QW1_FD_VSI_M;
|
|
|
|
qword |= ((u64)ctx->swap << ICE_FXD_FLTR_QW1_SWAP_S) &
|
|
|
|
ICE_FXD_FLTR_QW1_SWAP_M;
|
|
|
|
qword |= ((u64)ctx->fdid_prio << ICE_FXD_FLTR_QW1_FDID_PRI_S) &
|
|
|
|
ICE_FXD_FLTR_QW1_FDID_PRI_M;
|
|
|
|
qword |= ((u64)ctx->fdid_mdid << ICE_FXD_FLTR_QW1_FDID_MDID_S) &
|
|
|
|
ICE_FXD_FLTR_QW1_FDID_MDID_M;
|
|
|
|
qword |= ((u64)ctx->fdid << ICE_FXD_FLTR_QW1_FDID_S) &
|
|
|
|
ICE_FXD_FLTR_QW1_FDID_M;
|
|
|
|
fdir_desc->dtype_cmd_vsi_fdid = cpu_to_le64(qword);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* ice_fdir_get_prgm_desc - set a fdir descriptor from a fdir filter struct
|
|
|
|
* @hw: pointer to the hardware structure
|
|
|
|
* @input: filter
|
|
|
|
* @fdesc: filter descriptor
|
|
|
|
* @add: if add is true, this is an add operation, false implies delete
|
|
|
|
*/
|
|
|
|
void
|
|
|
|
ice_fdir_get_prgm_desc(struct ice_hw *hw, struct ice_fdir_fltr *input,
|
|
|
|
struct ice_fltr_desc *fdesc, bool add)
|
|
|
|
{
|
|
|
|
struct ice_fd_fltr_desc_ctx fdir_fltr_ctx = { 0 };
|
|
|
|
|
|
|
|
/* set default context info */
|
|
|
|
ice_set_dflt_val_fd_desc(&fdir_fltr_ctx);
|
|
|
|
|
|
|
|
/* change sideband filtering values */
|
|
|
|
fdir_fltr_ctx.fdid = input->fltr_id;
|
|
|
|
if (input->dest_ctl == ICE_FLTR_PRGM_DESC_DEST_DROP_PKT) {
|
|
|
|
fdir_fltr_ctx.drop = ICE_FXD_FLTR_QW0_DROP_YES;
|
|
|
|
fdir_fltr_ctx.qindex = 0;
|
2021-03-09 11:08:06 +08:00
|
|
|
} else if (input->dest_ctl ==
|
|
|
|
ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_OTHER) {
|
|
|
|
fdir_fltr_ctx.drop = ICE_FXD_FLTR_QW0_DROP_NO;
|
|
|
|
fdir_fltr_ctx.qindex = 0;
|
2020-05-12 09:01:42 +08:00
|
|
|
} else {
|
2021-03-09 11:08:06 +08:00
|
|
|
if (input->dest_ctl ==
|
|
|
|
ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_QGROUP)
|
|
|
|
fdir_fltr_ctx.toq = input->q_region;
|
2020-05-12 09:01:42 +08:00
|
|
|
fdir_fltr_ctx.drop = ICE_FXD_FLTR_QW0_DROP_NO;
|
|
|
|
fdir_fltr_ctx.qindex = input->q_index;
|
|
|
|
}
|
ice: Enable FDIR Configure for AVF
The virtual channel is going to be extended to support FDIR and
RSS configure from AVF. New data structures and OP codes will be
added, the patch enable the FDIR part.
To support above advanced AVF feature, we need to figure out
what kind of data structure should be passed from VF to PF to describe
an FDIR rule or RSS config rule. The common part of the requirement is
we need a data structure to represent the input set selection of a rule's
hash key.
An input set selection is a group of fields be selected from one or more
network protocol layers that could be identified as a specific flow.
For example, select dst IP address from an IPv4 header combined with
dst port from the TCP header as the input set for an IPv4/TCP flow.
The patch adds a new data structure virtchnl_proto_hdrs to abstract
a network protocol headers group which is composed of layers of network
protocol header(virtchnl_proto_hdr).
A protocol header contains a 32 bits mask (field_selector) to describe
which fields are selected as input sets, as well as a header type
(enum virtchnl_proto_hdr_type). Each bit is mapped to a field in
enum virtchnl_proto_hdr_field guided by its header type.
+------------+-----------+------------------------------+
| | Proto Hdr | Header Type A |
| | +------------------------------+
| | | BIT 31 | ... | BIT 1 | BIT 0 |
| |-----------+------------------------------+
|Proto Hdrs | Proto Hdr | Header Type B |
| | +------------------------------+
| | | BIT 31 | ... | BIT 1 | BIT 0 |
| |-----------+------------------------------+
| | Proto Hdr | Header Type C |
| | +------------------------------+
| | | BIT 31 | ... | BIT 1 | BIT 0 |
| |-----------+------------------------------+
| | .... |
+-------------------------------------------------------+
All fields in enum virtchnl_proto_hdr_fields are grouped with header type
and the value of the first field of a header type is always 32 aligned.
enum proto_hdr_type {
header_type_A = 0;
header_type_B = 1;
....
}
enum proto_hdr_field {
/* header type A */
header_A_field_0 = 0,
header_A_field_1 = 1,
header_A_field_2 = 2,
header_A_field_3 = 3,
/* header type B */
header_B_field_0 = 32, // = header_type_B << 5
header_B_field_0 = 33,
header_B_field_0 = 34
header_B_field_0 = 35,
....
};
So we have:
proto_hdr_type = proto_hdr_field / 32
bit offset = proto_hdr_field % 32
To simply the protocol header's operations, couple help macros are added.
For example, to select src IP and dst port as input set for an IPv4/UDP
flow.
we have:
struct virtchnl_proto_hdr hdr[2];
VIRTCHNL_SET_PROTO_HDR_TYPE(&hdr[0], IPV4)
VIRTCHNL_ADD_PROTO_HDR_FIELD(&hdr[0], IPV4, SRC)
VIRTCHNL_SET_PROTO_HDR_TYPE(&hdr[1], UDP)
VIRTCHNL_ADD_PROTO_HDR_FIELD(&hdr[1], UDP, DST)
The byte array is used to store the protocol header of a training package.
The byte array must be network order.
The patch added virtual channel support for iAVF FDIR add/validate/delete
filter. iAVF FDIR is Flow Director for Intel Adaptive Virtual Function
which can direct Ethernet packets to the queues of the Network Interface
Card. Add/delete command is adding or deleting one rule for each virtual
channel message, while validate command is just verifying if this rule
is valid without any other operations.
To add or delete one rule, driver needs to config TCAM and Profile,
build training packets which contains the input set value, and send
the training packets through FDIR Tx queue. In addition, driver needs to
manage the software context to avoid adding duplicated rules, deleting
non-existent rule, input set conflicts and other invalid cases.
NOTE:
Supported pattern/actions and their parse functions are not be included in
this patch, they will be added in a separate one.
Signed-off-by: Jeff Guo <jia.guo@intel.com>
Signed-off-by: Yahui Cao <yahui.cao@intel.com>
Signed-off-by: Simei Su <simei.su@intel.com>
Signed-off-by: Beilei Xing <beilei.xing@intel.com>
Signed-off-by: Qi Zhang <qi.z.zhang@intel.com>
Tested-by: Chen Bo <BoX.C.Chen@intel.com>
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
2021-03-09 11:08:04 +08:00
|
|
|
fdir_fltr_ctx.cnt_ena = input->cnt_ena;
|
2020-05-12 09:01:42 +08:00
|
|
|
fdir_fltr_ctx.cnt_index = input->cnt_index;
|
|
|
|
fdir_fltr_ctx.fd_vsi = ice_get_hw_vsi_num(hw, input->dest_vsi);
|
|
|
|
fdir_fltr_ctx.evict_ena = ICE_FXD_FLTR_QW0_EVICT_ENA_FALSE;
|
2021-03-09 11:08:06 +08:00
|
|
|
if (input->dest_ctl == ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_OTHER)
|
|
|
|
fdir_fltr_ctx.toq_prio = 0;
|
|
|
|
else
|
|
|
|
fdir_fltr_ctx.toq_prio = 3;
|
2020-05-12 09:01:42 +08:00
|
|
|
fdir_fltr_ctx.pcmd = add ? ICE_FXD_FLTR_QW1_PCMD_ADD :
|
|
|
|
ICE_FXD_FLTR_QW1_PCMD_REMOVE;
|
|
|
|
fdir_fltr_ctx.swap = ICE_FXD_FLTR_QW1_SWAP_NOT_SET;
|
|
|
|
fdir_fltr_ctx.comp_q = ICE_FXD_FLTR_QW0_COMP_Q_ZERO;
|
ice: Enable FDIR Configure for AVF
The virtual channel is going to be extended to support FDIR and
RSS configure from AVF. New data structures and OP codes will be
added, the patch enable the FDIR part.
To support above advanced AVF feature, we need to figure out
what kind of data structure should be passed from VF to PF to describe
an FDIR rule or RSS config rule. The common part of the requirement is
we need a data structure to represent the input set selection of a rule's
hash key.
An input set selection is a group of fields be selected from one or more
network protocol layers that could be identified as a specific flow.
For example, select dst IP address from an IPv4 header combined with
dst port from the TCP header as the input set for an IPv4/TCP flow.
The patch adds a new data structure virtchnl_proto_hdrs to abstract
a network protocol headers group which is composed of layers of network
protocol header(virtchnl_proto_hdr).
A protocol header contains a 32 bits mask (field_selector) to describe
which fields are selected as input sets, as well as a header type
(enum virtchnl_proto_hdr_type). Each bit is mapped to a field in
enum virtchnl_proto_hdr_field guided by its header type.
+------------+-----------+------------------------------+
| | Proto Hdr | Header Type A |
| | +------------------------------+
| | | BIT 31 | ... | BIT 1 | BIT 0 |
| |-----------+------------------------------+
|Proto Hdrs | Proto Hdr | Header Type B |
| | +------------------------------+
| | | BIT 31 | ... | BIT 1 | BIT 0 |
| |-----------+------------------------------+
| | Proto Hdr | Header Type C |
| | +------------------------------+
| | | BIT 31 | ... | BIT 1 | BIT 0 |
| |-----------+------------------------------+
| | .... |
+-------------------------------------------------------+
All fields in enum virtchnl_proto_hdr_fields are grouped with header type
and the value of the first field of a header type is always 32 aligned.
enum proto_hdr_type {
header_type_A = 0;
header_type_B = 1;
....
}
enum proto_hdr_field {
/* header type A */
header_A_field_0 = 0,
header_A_field_1 = 1,
header_A_field_2 = 2,
header_A_field_3 = 3,
/* header type B */
header_B_field_0 = 32, // = header_type_B << 5
header_B_field_0 = 33,
header_B_field_0 = 34
header_B_field_0 = 35,
....
};
So we have:
proto_hdr_type = proto_hdr_field / 32
bit offset = proto_hdr_field % 32
To simply the protocol header's operations, couple help macros are added.
For example, to select src IP and dst port as input set for an IPv4/UDP
flow.
we have:
struct virtchnl_proto_hdr hdr[2];
VIRTCHNL_SET_PROTO_HDR_TYPE(&hdr[0], IPV4)
VIRTCHNL_ADD_PROTO_HDR_FIELD(&hdr[0], IPV4, SRC)
VIRTCHNL_SET_PROTO_HDR_TYPE(&hdr[1], UDP)
VIRTCHNL_ADD_PROTO_HDR_FIELD(&hdr[1], UDP, DST)
The byte array is used to store the protocol header of a training package.
The byte array must be network order.
The patch added virtual channel support for iAVF FDIR add/validate/delete
filter. iAVF FDIR is Flow Director for Intel Adaptive Virtual Function
which can direct Ethernet packets to the queues of the Network Interface
Card. Add/delete command is adding or deleting one rule for each virtual
channel message, while validate command is just verifying if this rule
is valid without any other operations.
To add or delete one rule, driver needs to config TCAM and Profile,
build training packets which contains the input set value, and send
the training packets through FDIR Tx queue. In addition, driver needs to
manage the software context to avoid adding duplicated rules, deleting
non-existent rule, input set conflicts and other invalid cases.
NOTE:
Supported pattern/actions and their parse functions are not be included in
this patch, they will be added in a separate one.
Signed-off-by: Jeff Guo <jia.guo@intel.com>
Signed-off-by: Yahui Cao <yahui.cao@intel.com>
Signed-off-by: Simei Su <simei.su@intel.com>
Signed-off-by: Beilei Xing <beilei.xing@intel.com>
Signed-off-by: Qi Zhang <qi.z.zhang@intel.com>
Tested-by: Chen Bo <BoX.C.Chen@intel.com>
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
2021-03-09 11:08:04 +08:00
|
|
|
fdir_fltr_ctx.comp_report = input->comp_report;
|
|
|
|
fdir_fltr_ctx.fdid_prio = input->fdid_prio;
|
2020-05-12 09:01:42 +08:00
|
|
|
fdir_fltr_ctx.desc_prof = 1;
|
|
|
|
fdir_fltr_ctx.desc_prof_prio = 3;
|
|
|
|
ice_set_fd_desc_val(&fdir_fltr_ctx, fdesc);
|
|
|
|
}
|
|
|
|
|
2020-05-12 09:01:40 +08:00
|
|
|
/**
|
|
|
|
* ice_alloc_fd_res_cntr - obtain counter resource for FD type
|
|
|
|
* @hw: pointer to the hardware structure
|
|
|
|
* @cntr_id: returns counter index
|
|
|
|
*/
|
|
|
|
enum ice_status ice_alloc_fd_res_cntr(struct ice_hw *hw, u16 *cntr_id)
|
|
|
|
{
|
|
|
|
return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_COUNTER_BLOCK,
|
|
|
|
ICE_AQC_RES_TYPE_FLAG_DEDICATED, 1, cntr_id);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* ice_free_fd_res_cntr - Free counter resource for FD type
|
|
|
|
* @hw: pointer to the hardware structure
|
|
|
|
* @cntr_id: counter index to be freed
|
|
|
|
*/
|
|
|
|
enum ice_status ice_free_fd_res_cntr(struct ice_hw *hw, u16 cntr_id)
|
|
|
|
{
|
|
|
|
return ice_free_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_COUNTER_BLOCK,
|
|
|
|
ICE_AQC_RES_TYPE_FLAG_DEDICATED, 1, cntr_id);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* ice_alloc_fd_guar_item - allocate resource for FD guaranteed entries
|
|
|
|
* @hw: pointer to the hardware structure
|
|
|
|
* @cntr_id: returns counter index
|
|
|
|
* @num_fltr: number of filter entries to be allocated
|
|
|
|
*/
|
|
|
|
enum ice_status
|
|
|
|
ice_alloc_fd_guar_item(struct ice_hw *hw, u16 *cntr_id, u16 num_fltr)
|
|
|
|
{
|
|
|
|
return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_GUARANTEED_ENTRIES,
|
|
|
|
ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr,
|
|
|
|
cntr_id);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* ice_alloc_fd_shrd_item - allocate resource for flow director shared entries
|
|
|
|
* @hw: pointer to the hardware structure
|
|
|
|
* @cntr_id: returns counter index
|
|
|
|
* @num_fltr: number of filter entries to be allocated
|
|
|
|
*/
|
|
|
|
enum ice_status
|
|
|
|
ice_alloc_fd_shrd_item(struct ice_hw *hw, u16 *cntr_id, u16 num_fltr)
|
|
|
|
{
|
|
|
|
return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_SHARED_ENTRIES,
|
|
|
|
ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr,
|
|
|
|
cntr_id);
|
|
|
|
}
|
2020-05-12 09:01:41 +08:00
|
|
|
|
|
|
|
/**
|
|
|
|
* ice_get_fdir_cnt_all - get the number of Flow Director filters
|
|
|
|
* @hw: hardware data structure
|
|
|
|
*
|
|
|
|
* Returns the number of filters available on device
|
|
|
|
*/
|
|
|
|
int ice_get_fdir_cnt_all(struct ice_hw *hw)
|
|
|
|
{
|
|
|
|
return hw->func_caps.fd_fltr_guar + hw->func_caps.fd_fltr_best_effort;
|
|
|
|
}
|
|
|
|
|
2020-05-12 09:01:43 +08:00
|
|
|
/**
|
|
|
|
* ice_pkt_insert_ipv6_addr - insert a be32 IPv6 address into a memory buffer
|
|
|
|
* @pkt: packet buffer
|
|
|
|
* @offset: offset into buffer
|
|
|
|
* @addr: IPv6 address to convert and insert into pkt at offset
|
|
|
|
*/
|
|
|
|
static void ice_pkt_insert_ipv6_addr(u8 *pkt, int offset, __be32 *addr)
|
|
|
|
{
|
|
|
|
int idx;
|
|
|
|
|
|
|
|
for (idx = 0; idx < ICE_IPV6_ADDR_LEN_AS_U32; idx++)
|
|
|
|
memcpy(pkt + offset + idx * sizeof(*addr), &addr[idx],
|
|
|
|
sizeof(*addr));
|
|
|
|
}
|
|
|
|
|
2021-03-09 11:08:08 +08:00
|
|
|
/**
|
|
|
|
* ice_pkt_insert_u6_qfi - insert a u6 value QFI into a memory buffer for GTPU
|
|
|
|
* @pkt: packet buffer
|
|
|
|
* @offset: offset into buffer
|
|
|
|
* @data: 8 bit value to convert and insert into pkt at offset
|
|
|
|
*
|
|
|
|
* This function is designed for inserting QFI (6 bits) for GTPU.
|
|
|
|
*/
|
|
|
|
static void ice_pkt_insert_u6_qfi(u8 *pkt, int offset, u8 data)
|
|
|
|
{
|
|
|
|
u8 ret;
|
|
|
|
|
|
|
|
ret = (data & 0x3F) + (*(pkt + offset) & 0xC0);
|
|
|
|
memcpy(pkt + offset, &ret, sizeof(ret));
|
|
|
|
}
|
|
|
|
|
2021-03-09 11:07:59 +08:00
|
|
|
/**
|
|
|
|
* ice_pkt_insert_u8 - insert a u8 value into a memory buffer.
|
|
|
|
* @pkt: packet buffer
|
|
|
|
* @offset: offset into buffer
|
|
|
|
* @data: 8 bit value to convert and insert into pkt at offset
|
|
|
|
*/
|
|
|
|
static void ice_pkt_insert_u8(u8 *pkt, int offset, u8 data)
|
|
|
|
{
|
|
|
|
memcpy(pkt + offset, &data, sizeof(data));
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* ice_pkt_insert_u8_tc - insert a u8 value into a memory buffer for TC ipv6.
|
|
|
|
* @pkt: packet buffer
|
|
|
|
* @offset: offset into buffer
|
|
|
|
* @data: 8 bit value to convert and insert into pkt at offset
|
|
|
|
*
|
|
|
|
* This function is designed for inserting Traffic Class (TC) for IPv6,
|
|
|
|
* since that TC is not aligned in number of bytes. Here we split it out
|
|
|
|
* into two part and fill each byte with data copy from pkt, then insert
|
|
|
|
* the two bytes data one by one.
|
|
|
|
*/
|
|
|
|
static void ice_pkt_insert_u8_tc(u8 *pkt, int offset, u8 data)
|
|
|
|
{
|
|
|
|
u8 high, low;
|
|
|
|
|
|
|
|
high = (data >> 4) + (*(pkt + offset) & 0xF0);
|
|
|
|
memcpy(pkt + offset, &high, sizeof(high));
|
|
|
|
|
|
|
|
low = (*(pkt + offset + 1) & 0x0F) + ((data & 0x0F) << 4);
|
|
|
|
memcpy(pkt + offset + 1, &low, sizeof(low));
|
|
|
|
}
|
|
|
|
|
2020-05-12 09:01:42 +08:00
|
|
|
/**
|
|
|
|
* ice_pkt_insert_u16 - insert a be16 value into a memory buffer
|
|
|
|
* @pkt: packet buffer
|
|
|
|
* @offset: offset into buffer
|
|
|
|
* @data: 16 bit value to convert and insert into pkt at offset
|
|
|
|
*/
|
|
|
|
static void ice_pkt_insert_u16(u8 *pkt, int offset, __be16 data)
|
|
|
|
{
|
|
|
|
memcpy(pkt + offset, &data, sizeof(data));
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* ice_pkt_insert_u32 - insert a be32 value into a memory buffer
|
|
|
|
* @pkt: packet buffer
|
|
|
|
* @offset: offset into buffer
|
|
|
|
* @data: 32 bit value to convert and insert into pkt at offset
|
|
|
|
*/
|
|
|
|
static void ice_pkt_insert_u32(u8 *pkt, int offset, __be32 data)
|
|
|
|
{
|
|
|
|
memcpy(pkt + offset, &data, sizeof(data));
|
|
|
|
}
|
|
|
|
|
2021-03-09 11:07:58 +08:00
|
|
|
/**
|
|
|
|
* ice_pkt_insert_mac_addr - insert a MAC addr into a memory buffer.
|
|
|
|
* @pkt: packet buffer
|
|
|
|
* @addr: MAC address to convert and insert into pkt at offset
|
|
|
|
*/
|
|
|
|
static void ice_pkt_insert_mac_addr(u8 *pkt, u8 *addr)
|
|
|
|
{
|
|
|
|
ether_addr_copy(pkt, addr);
|
|
|
|
}
|
|
|
|
|
2020-05-12 09:01:42 +08:00
|
|
|
/**
|
|
|
|
* ice_fdir_get_gen_prgm_pkt - generate a training packet
|
|
|
|
* @hw: pointer to the hardware structure
|
|
|
|
* @input: flow director filter data structure
|
|
|
|
* @pkt: pointer to return filter packet
|
|
|
|
* @frag: generate a fragment packet
|
|
|
|
* @tun: true implies generate a tunnel packet
|
|
|
|
*/
|
|
|
|
enum ice_status
|
|
|
|
ice_fdir_get_gen_prgm_pkt(struct ice_hw *hw, struct ice_fdir_fltr *input,
|
|
|
|
u8 *pkt, bool frag, bool tun)
|
|
|
|
{
|
|
|
|
enum ice_fltr_ptype flow;
|
|
|
|
u16 tnl_port;
|
|
|
|
u8 *loc;
|
|
|
|
u16 idx;
|
|
|
|
|
|
|
|
if (input->flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER) {
|
2020-05-12 09:01:43 +08:00
|
|
|
switch (input->ip.v4.proto) {
|
2020-05-12 09:01:42 +08:00
|
|
|
case IPPROTO_TCP:
|
|
|
|
flow = ICE_FLTR_PTYPE_NONF_IPV4_TCP;
|
|
|
|
break;
|
|
|
|
case IPPROTO_UDP:
|
|
|
|
flow = ICE_FLTR_PTYPE_NONF_IPV4_UDP;
|
|
|
|
break;
|
|
|
|
case IPPROTO_SCTP:
|
|
|
|
flow = ICE_FLTR_PTYPE_NONF_IPV4_SCTP;
|
|
|
|
break;
|
2021-03-09 11:07:59 +08:00
|
|
|
default:
|
2020-05-12 09:01:42 +08:00
|
|
|
flow = ICE_FLTR_PTYPE_NONF_IPV4_OTHER;
|
|
|
|
break;
|
|
|
|
}
|
2020-05-12 09:01:43 +08:00
|
|
|
} else if (input->flow_type == ICE_FLTR_PTYPE_NONF_IPV6_OTHER) {
|
|
|
|
switch (input->ip.v6.proto) {
|
|
|
|
case IPPROTO_TCP:
|
|
|
|
flow = ICE_FLTR_PTYPE_NONF_IPV6_TCP;
|
|
|
|
break;
|
|
|
|
case IPPROTO_UDP:
|
|
|
|
flow = ICE_FLTR_PTYPE_NONF_IPV6_UDP;
|
|
|
|
break;
|
|
|
|
case IPPROTO_SCTP:
|
|
|
|
flow = ICE_FLTR_PTYPE_NONF_IPV6_SCTP;
|
|
|
|
break;
|
2021-03-09 11:07:59 +08:00
|
|
|
default:
|
2020-05-12 09:01:43 +08:00
|
|
|
flow = ICE_FLTR_PTYPE_NONF_IPV6_OTHER;
|
|
|
|
break;
|
|
|
|
}
|
2020-05-12 09:01:42 +08:00
|
|
|
} else {
|
|
|
|
flow = input->flow_type;
|
|
|
|
}
|
|
|
|
|
|
|
|
for (idx = 0; idx < ICE_FDIR_NUM_PKT; idx++)
|
|
|
|
if (ice_fdir_pkt[idx].flow == flow)
|
|
|
|
break;
|
|
|
|
if (idx == ICE_FDIR_NUM_PKT)
|
|
|
|
return ICE_ERR_PARAM;
|
|
|
|
if (!tun) {
|
|
|
|
memcpy(pkt, ice_fdir_pkt[idx].pkt, ice_fdir_pkt[idx].pkt_len);
|
|
|
|
loc = pkt;
|
|
|
|
} else {
|
2021-11-22 23:39:25 +08:00
|
|
|
if (!ice_get_open_tunnel_port(hw, &tnl_port, TNL_ALL))
|
2020-05-12 09:01:42 +08:00
|
|
|
return ICE_ERR_DOES_NOT_EXIST;
|
|
|
|
if (!ice_fdir_pkt[idx].tun_pkt)
|
|
|
|
return ICE_ERR_PARAM;
|
|
|
|
memcpy(pkt, ice_fdir_pkt[idx].tun_pkt,
|
|
|
|
ice_fdir_pkt[idx].tun_pkt_len);
|
|
|
|
ice_pkt_insert_u16(pkt, ICE_IPV4_UDP_DST_PORT_OFFSET,
|
|
|
|
htons(tnl_port));
|
|
|
|
loc = &pkt[ICE_FDIR_TUN_PKT_OFF];
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Reverse the src and dst, since the HW expects them to be from Tx
|
|
|
|
* perspective. The input from user is from Rx filter perspective.
|
|
|
|
*/
|
|
|
|
switch (flow) {
|
|
|
|
case ICE_FLTR_PTYPE_NONF_IPV4_TCP:
|
|
|
|
ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
|
2020-05-12 09:01:43 +08:00
|
|
|
input->ip.v4.src_ip);
|
2020-05-12 09:01:42 +08:00
|
|
|
ice_pkt_insert_u16(loc, ICE_IPV4_TCP_DST_PORT_OFFSET,
|
2020-05-12 09:01:43 +08:00
|
|
|
input->ip.v4.src_port);
|
2020-05-12 09:01:42 +08:00
|
|
|
ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
|
2020-05-12 09:01:43 +08:00
|
|
|
input->ip.v4.dst_ip);
|
2020-05-12 09:01:42 +08:00
|
|
|
ice_pkt_insert_u16(loc, ICE_IPV4_TCP_SRC_PORT_OFFSET,
|
2020-05-12 09:01:43 +08:00
|
|
|
input->ip.v4.dst_port);
|
2021-03-09 11:07:59 +08:00
|
|
|
ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
|
|
|
|
ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
|
2021-03-09 11:07:58 +08:00
|
|
|
ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
|
2020-05-12 09:01:42 +08:00
|
|
|
if (frag)
|
2021-07-17 06:16:44 +08:00
|
|
|
loc[20] = ICE_FDIR_IPV4_PKT_FLAG_MF;
|
2020-05-12 09:01:42 +08:00
|
|
|
break;
|
|
|
|
case ICE_FLTR_PTYPE_NONF_IPV4_UDP:
|
|
|
|
ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
|
2020-05-12 09:01:43 +08:00
|
|
|
input->ip.v4.src_ip);
|
2020-05-12 09:01:42 +08:00
|
|
|
ice_pkt_insert_u16(loc, ICE_IPV4_UDP_DST_PORT_OFFSET,
|
2020-05-12 09:01:43 +08:00
|
|
|
input->ip.v4.src_port);
|
2020-05-12 09:01:42 +08:00
|
|
|
ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
|
2020-05-12 09:01:43 +08:00
|
|
|
input->ip.v4.dst_ip);
|
2020-05-12 09:01:42 +08:00
|
|
|
ice_pkt_insert_u16(loc, ICE_IPV4_UDP_SRC_PORT_OFFSET,
|
2020-05-12 09:01:43 +08:00
|
|
|
input->ip.v4.dst_port);
|
2021-03-09 11:07:59 +08:00
|
|
|
ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
|
|
|
|
ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
|
2021-03-09 11:07:58 +08:00
|
|
|
ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
|
|
|
|
ice_pkt_insert_mac_addr(loc + ETH_ALEN,
|
|
|
|
input->ext_data.src_mac);
|
2020-05-12 09:01:42 +08:00
|
|
|
break;
|
|
|
|
case ICE_FLTR_PTYPE_NONF_IPV4_SCTP:
|
|
|
|
ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
|
2020-05-12 09:01:43 +08:00
|
|
|
input->ip.v4.src_ip);
|
2020-05-12 09:01:42 +08:00
|
|
|
ice_pkt_insert_u16(loc, ICE_IPV4_SCTP_DST_PORT_OFFSET,
|
2020-05-12 09:01:43 +08:00
|
|
|
input->ip.v4.src_port);
|
2020-05-12 09:01:42 +08:00
|
|
|
ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
|
2020-05-12 09:01:43 +08:00
|
|
|
input->ip.v4.dst_ip);
|
2020-05-12 09:01:42 +08:00
|
|
|
ice_pkt_insert_u16(loc, ICE_IPV4_SCTP_SRC_PORT_OFFSET,
|
2020-05-12 09:01:43 +08:00
|
|
|
input->ip.v4.dst_port);
|
2021-03-09 11:07:59 +08:00
|
|
|
ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
|
|
|
|
ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
|
2021-03-09 11:07:58 +08:00
|
|
|
ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
|
2020-05-12 09:01:42 +08:00
|
|
|
break;
|
|
|
|
case ICE_FLTR_PTYPE_NONF_IPV4_OTHER:
|
|
|
|
ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
|
2020-05-12 09:01:43 +08:00
|
|
|
input->ip.v4.src_ip);
|
2020-05-12 09:01:42 +08:00
|
|
|
ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
|
2020-05-12 09:01:43 +08:00
|
|
|
input->ip.v4.dst_ip);
|
2021-03-09 11:07:59 +08:00
|
|
|
ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
|
|
|
|
ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
|
|
|
|
ice_pkt_insert_u8(loc, ICE_IPV4_PROTO_OFFSET,
|
|
|
|
input->ip.v4.proto);
|
2021-03-09 11:07:58 +08:00
|
|
|
ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
|
2020-05-12 09:01:42 +08:00
|
|
|
break;
|
2021-03-09 11:08:08 +08:00
|
|
|
case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_UDP:
|
|
|
|
case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_TCP:
|
|
|
|
case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_ICMP:
|
|
|
|
case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_OTHER:
|
|
|
|
ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
|
|
|
|
input->ip.v4.src_ip);
|
|
|
|
ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
|
|
|
|
input->ip.v4.dst_ip);
|
|
|
|
ice_pkt_insert_u32(loc, ICE_IPV4_GTPU_TEID_OFFSET,
|
|
|
|
input->gtpu_data.teid);
|
|
|
|
ice_pkt_insert_u6_qfi(loc, ICE_IPV4_GTPU_QFI_OFFSET,
|
|
|
|
input->gtpu_data.qfi);
|
|
|
|
break;
|
2021-03-09 11:08:09 +08:00
|
|
|
case ICE_FLTR_PTYPE_NONF_IPV4_L2TPV3:
|
|
|
|
ice_pkt_insert_u32(loc, ICE_IPV4_L2TPV3_SESS_ID_OFFSET,
|
|
|
|
input->l2tpv3_data.session_id);
|
|
|
|
break;
|
|
|
|
case ICE_FLTR_PTYPE_NONF_IPV6_L2TPV3:
|
|
|
|
ice_pkt_insert_u32(loc, ICE_IPV6_L2TPV3_SESS_ID_OFFSET,
|
|
|
|
input->l2tpv3_data.session_id);
|
|
|
|
break;
|
|
|
|
case ICE_FLTR_PTYPE_NONF_IPV4_ESP:
|
|
|
|
ice_pkt_insert_u32(loc, ICE_IPV4_ESP_SPI_OFFSET,
|
|
|
|
input->ip.v4.sec_parm_idx);
|
|
|
|
break;
|
|
|
|
case ICE_FLTR_PTYPE_NONF_IPV6_ESP:
|
|
|
|
ice_pkt_insert_u32(loc, ICE_IPV6_ESP_SPI_OFFSET,
|
|
|
|
input->ip.v6.sec_parm_idx);
|
|
|
|
break;
|
|
|
|
case ICE_FLTR_PTYPE_NONF_IPV4_AH:
|
|
|
|
ice_pkt_insert_u32(loc, ICE_IPV4_AH_SPI_OFFSET,
|
|
|
|
input->ip.v4.sec_parm_idx);
|
|
|
|
break;
|
|
|
|
case ICE_FLTR_PTYPE_NONF_IPV6_AH:
|
|
|
|
ice_pkt_insert_u32(loc, ICE_IPV6_AH_SPI_OFFSET,
|
|
|
|
input->ip.v6.sec_parm_idx);
|
|
|
|
break;
|
|
|
|
case ICE_FLTR_PTYPE_NONF_IPV4_NAT_T_ESP:
|
|
|
|
ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
|
|
|
|
input->ip.v4.src_ip);
|
|
|
|
ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
|
|
|
|
input->ip.v4.dst_ip);
|
|
|
|
ice_pkt_insert_u32(loc, ICE_IPV4_NAT_T_ESP_SPI_OFFSET,
|
|
|
|
input->ip.v4.sec_parm_idx);
|
|
|
|
break;
|
|
|
|
case ICE_FLTR_PTYPE_NONF_IPV6_NAT_T_ESP:
|
|
|
|
ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
|
|
|
|
input->ip.v6.src_ip);
|
|
|
|
ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
|
|
|
|
input->ip.v6.dst_ip);
|
|
|
|
ice_pkt_insert_u32(loc, ICE_IPV6_NAT_T_ESP_SPI_OFFSET,
|
|
|
|
input->ip.v6.sec_parm_idx);
|
|
|
|
break;
|
|
|
|
case ICE_FLTR_PTYPE_NONF_IPV4_PFCP_NODE:
|
|
|
|
case ICE_FLTR_PTYPE_NONF_IPV4_PFCP_SESSION:
|
|
|
|
ice_pkt_insert_u16(loc, ICE_IPV4_UDP_SRC_PORT_OFFSET,
|
|
|
|
input->ip.v4.dst_port);
|
|
|
|
break;
|
|
|
|
case ICE_FLTR_PTYPE_NONF_IPV6_PFCP_NODE:
|
|
|
|
case ICE_FLTR_PTYPE_NONF_IPV6_PFCP_SESSION:
|
|
|
|
ice_pkt_insert_u16(loc, ICE_IPV6_UDP_SRC_PORT_OFFSET,
|
|
|
|
input->ip.v6.dst_port);
|
|
|
|
break;
|
2021-03-09 11:08:07 +08:00
|
|
|
case ICE_FLTR_PTYPE_NON_IP_L2:
|
|
|
|
ice_pkt_insert_u16(loc, ICE_MAC_ETHTYPE_OFFSET,
|
|
|
|
input->ext_data.ether_type);
|
|
|
|
break;
|
2020-05-12 09:01:43 +08:00
|
|
|
case ICE_FLTR_PTYPE_NONF_IPV6_TCP:
|
|
|
|
ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
|
|
|
|
input->ip.v6.src_ip);
|
|
|
|
ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
|
|
|
|
input->ip.v6.dst_ip);
|
|
|
|
ice_pkt_insert_u16(loc, ICE_IPV6_TCP_DST_PORT_OFFSET,
|
|
|
|
input->ip.v6.src_port);
|
|
|
|
ice_pkt_insert_u16(loc, ICE_IPV6_TCP_SRC_PORT_OFFSET,
|
|
|
|
input->ip.v6.dst_port);
|
2021-03-09 11:07:59 +08:00
|
|
|
ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
|
|
|
|
ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
|
2021-03-09 11:07:58 +08:00
|
|
|
ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
|
2020-05-12 09:01:43 +08:00
|
|
|
break;
|
|
|
|
case ICE_FLTR_PTYPE_NONF_IPV6_UDP:
|
|
|
|
ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
|
|
|
|
input->ip.v6.src_ip);
|
|
|
|
ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
|
|
|
|
input->ip.v6.dst_ip);
|
|
|
|
ice_pkt_insert_u16(loc, ICE_IPV6_UDP_DST_PORT_OFFSET,
|
|
|
|
input->ip.v6.src_port);
|
|
|
|
ice_pkt_insert_u16(loc, ICE_IPV6_UDP_SRC_PORT_OFFSET,
|
|
|
|
input->ip.v6.dst_port);
|
2021-03-09 11:07:59 +08:00
|
|
|
ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
|
|
|
|
ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
|
2021-03-09 11:07:58 +08:00
|
|
|
ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
|
2020-05-12 09:01:43 +08:00
|
|
|
break;
|
|
|
|
case ICE_FLTR_PTYPE_NONF_IPV6_SCTP:
|
|
|
|
ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
|
|
|
|
input->ip.v6.src_ip);
|
|
|
|
ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
|
|
|
|
input->ip.v6.dst_ip);
|
|
|
|
ice_pkt_insert_u16(loc, ICE_IPV6_SCTP_DST_PORT_OFFSET,
|
|
|
|
input->ip.v6.src_port);
|
|
|
|
ice_pkt_insert_u16(loc, ICE_IPV6_SCTP_SRC_PORT_OFFSET,
|
|
|
|
input->ip.v6.dst_port);
|
2021-03-09 11:07:59 +08:00
|
|
|
ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
|
|
|
|
ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
|
2021-03-09 11:07:58 +08:00
|
|
|
ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
|
2020-05-12 09:01:43 +08:00
|
|
|
break;
|
|
|
|
case ICE_FLTR_PTYPE_NONF_IPV6_OTHER:
|
|
|
|
ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
|
|
|
|
input->ip.v6.src_ip);
|
|
|
|
ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
|
|
|
|
input->ip.v6.dst_ip);
|
2021-03-09 11:07:59 +08:00
|
|
|
ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
|
|
|
|
ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
|
|
|
|
ice_pkt_insert_u8(loc, ICE_IPV6_PROTO_OFFSET,
|
|
|
|
input->ip.v6.proto);
|
2021-03-09 11:07:58 +08:00
|
|
|
ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
|
2020-05-12 09:01:43 +08:00
|
|
|
break;
|
2020-05-12 09:01:42 +08:00
|
|
|
default:
|
|
|
|
return ICE_ERR_PARAM;
|
|
|
|
}
|
|
|
|
|
2020-05-12 09:01:44 +08:00
|
|
|
if (input->flex_fltr)
|
|
|
|
ice_pkt_insert_u16(loc, input->flex_offset, input->flex_word);
|
|
|
|
|
2020-05-12 09:01:42 +08:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* ice_fdir_has_frag - does flow type have 2 ptypes
|
|
|
|
* @flow: flow ptype
|
|
|
|
*
|
|
|
|
* returns true is there is a fragment packet for this ptype
|
|
|
|
*/
|
|
|
|
bool ice_fdir_has_frag(enum ice_fltr_ptype flow)
|
|
|
|
{
|
|
|
|
if (flow == ICE_FLTR_PTYPE_NONF_IPV4_OTHER)
|
|
|
|
return true;
|
|
|
|
else
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2020-05-12 09:01:41 +08:00
|
|
|
/**
|
2021-03-03 02:15:45 +08:00
|
|
|
* ice_fdir_find_fltr_by_idx - find filter with idx
|
2020-05-12 09:01:41 +08:00
|
|
|
* @hw: pointer to hardware structure
|
|
|
|
* @fltr_idx: index to find.
|
|
|
|
*
|
|
|
|
* Returns pointer to filter if found or null
|
|
|
|
*/
|
|
|
|
struct ice_fdir_fltr *
|
|
|
|
ice_fdir_find_fltr_by_idx(struct ice_hw *hw, u32 fltr_idx)
|
|
|
|
{
|
|
|
|
struct ice_fdir_fltr *rule;
|
|
|
|
|
|
|
|
list_for_each_entry(rule, &hw->fdir_list_head, fltr_node) {
|
|
|
|
/* rule ID found in the list */
|
|
|
|
if (fltr_idx == rule->fltr_id)
|
|
|
|
return rule;
|
|
|
|
if (fltr_idx < rule->fltr_id)
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
return NULL;
|
|
|
|
}
|
2020-05-12 09:01:42 +08:00
|
|
|
|
|
|
|
/**
|
|
|
|
* ice_fdir_list_add_fltr - add a new node to the flow director filter list
|
|
|
|
* @hw: hardware structure
|
|
|
|
* @fltr: filter node to add to structure
|
|
|
|
*/
|
|
|
|
void ice_fdir_list_add_fltr(struct ice_hw *hw, struct ice_fdir_fltr *fltr)
|
|
|
|
{
|
|
|
|
struct ice_fdir_fltr *rule, *parent = NULL;
|
|
|
|
|
|
|
|
list_for_each_entry(rule, &hw->fdir_list_head, fltr_node) {
|
|
|
|
/* rule ID found or pass its spot in the list */
|
|
|
|
if (rule->fltr_id >= fltr->fltr_id)
|
|
|
|
break;
|
|
|
|
parent = rule;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (parent)
|
|
|
|
list_add(&fltr->fltr_node, &parent->fltr_node);
|
|
|
|
else
|
|
|
|
list_add(&fltr->fltr_node, &hw->fdir_list_head);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* ice_fdir_update_cntrs - increment / decrement filter counter
|
|
|
|
* @hw: pointer to hardware structure
|
|
|
|
* @flow: filter flow type
|
|
|
|
* @add: true implies filters added
|
|
|
|
*/
|
|
|
|
void
|
|
|
|
ice_fdir_update_cntrs(struct ice_hw *hw, enum ice_fltr_ptype flow, bool add)
|
|
|
|
{
|
|
|
|
int incr;
|
|
|
|
|
|
|
|
incr = add ? 1 : -1;
|
|
|
|
hw->fdir_active_fltr += incr;
|
|
|
|
|
|
|
|
if (flow == ICE_FLTR_PTYPE_NONF_NONE || flow >= ICE_FLTR_PTYPE_MAX)
|
|
|
|
ice_debug(hw, ICE_DBG_SW, "Unknown filter type %d\n", flow);
|
|
|
|
else
|
|
|
|
hw->fdir_fltr_cnt[flow] += incr;
|
|
|
|
}
|
|
|
|
|
2020-05-12 09:01:43 +08:00
|
|
|
/**
|
|
|
|
* ice_cmp_ipv6_addr - compare 2 IP v6 addresses
|
|
|
|
* @a: IP v6 address
|
|
|
|
* @b: IP v6 address
|
|
|
|
*
|
|
|
|
* Returns 0 on equal, returns non-0 if different
|
|
|
|
*/
|
|
|
|
static int ice_cmp_ipv6_addr(__be32 *a, __be32 *b)
|
|
|
|
{
|
|
|
|
return memcmp(a, b, 4 * sizeof(__be32));
|
|
|
|
}
|
|
|
|
|
2020-05-12 09:01:42 +08:00
|
|
|
/**
|
|
|
|
* ice_fdir_comp_rules - compare 2 filters
|
|
|
|
* @a: a Flow Director filter data structure
|
|
|
|
* @b: a Flow Director filter data structure
|
2020-05-12 09:01:43 +08:00
|
|
|
* @v6: bool true if v6 filter
|
2020-05-12 09:01:42 +08:00
|
|
|
*
|
|
|
|
* Returns true if the filters match
|
|
|
|
*/
|
|
|
|
static bool
|
2020-05-12 09:01:43 +08:00
|
|
|
ice_fdir_comp_rules(struct ice_fdir_fltr *a, struct ice_fdir_fltr *b, bool v6)
|
2020-05-12 09:01:42 +08:00
|
|
|
{
|
|
|
|
enum ice_fltr_ptype flow_type = a->flow_type;
|
|
|
|
|
|
|
|
/* The calling function already checks that the two filters have the
|
|
|
|
* same flow_type.
|
|
|
|
*/
|
2020-05-12 09:01:43 +08:00
|
|
|
if (!v6) {
|
|
|
|
if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_TCP ||
|
|
|
|
flow_type == ICE_FLTR_PTYPE_NONF_IPV4_UDP ||
|
|
|
|
flow_type == ICE_FLTR_PTYPE_NONF_IPV4_SCTP) {
|
|
|
|
if (a->ip.v4.dst_ip == b->ip.v4.dst_ip &&
|
|
|
|
a->ip.v4.src_ip == b->ip.v4.src_ip &&
|
|
|
|
a->ip.v4.dst_port == b->ip.v4.dst_port &&
|
|
|
|
a->ip.v4.src_port == b->ip.v4.src_port)
|
|
|
|
return true;
|
|
|
|
} else if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER) {
|
|
|
|
if (a->ip.v4.dst_ip == b->ip.v4.dst_ip &&
|
|
|
|
a->ip.v4.src_ip == b->ip.v4.src_ip &&
|
|
|
|
a->ip.v4.l4_header == b->ip.v4.l4_header &&
|
|
|
|
a->ip.v4.proto == b->ip.v4.proto &&
|
|
|
|
a->ip.v4.ip_ver == b->ip.v4.ip_ver &&
|
|
|
|
a->ip.v4.tos == b->ip.v4.tos)
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if (flow_type == ICE_FLTR_PTYPE_NONF_IPV6_UDP ||
|
|
|
|
flow_type == ICE_FLTR_PTYPE_NONF_IPV6_TCP ||
|
|
|
|
flow_type == ICE_FLTR_PTYPE_NONF_IPV6_SCTP) {
|
|
|
|
if (a->ip.v6.dst_port == b->ip.v6.dst_port &&
|
|
|
|
a->ip.v6.src_port == b->ip.v6.src_port &&
|
|
|
|
!ice_cmp_ipv6_addr(a->ip.v6.dst_ip,
|
|
|
|
b->ip.v6.dst_ip) &&
|
|
|
|
!ice_cmp_ipv6_addr(a->ip.v6.src_ip,
|
|
|
|
b->ip.v6.src_ip))
|
|
|
|
return true;
|
|
|
|
} else if (flow_type == ICE_FLTR_PTYPE_NONF_IPV6_OTHER) {
|
|
|
|
if (a->ip.v6.dst_port == b->ip.v6.dst_port &&
|
|
|
|
a->ip.v6.src_port == b->ip.v6.src_port)
|
|
|
|
return true;
|
|
|
|
}
|
2020-05-12 09:01:42 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* ice_fdir_is_dup_fltr - test if filter is already in list for PF
|
|
|
|
* @hw: hardware data structure
|
|
|
|
* @input: Flow Director filter data structure
|
|
|
|
*
|
|
|
|
* Returns true if the filter is found in the list
|
|
|
|
*/
|
|
|
|
bool ice_fdir_is_dup_fltr(struct ice_hw *hw, struct ice_fdir_fltr *input)
|
|
|
|
{
|
|
|
|
struct ice_fdir_fltr *rule;
|
|
|
|
bool ret = false;
|
|
|
|
|
|
|
|
list_for_each_entry(rule, &hw->fdir_list_head, fltr_node) {
|
|
|
|
enum ice_fltr_ptype flow_type;
|
|
|
|
|
|
|
|
if (rule->flow_type != input->flow_type)
|
|
|
|
continue;
|
|
|
|
|
|
|
|
flow_type = input->flow_type;
|
|
|
|
if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_TCP ||
|
|
|
|
flow_type == ICE_FLTR_PTYPE_NONF_IPV4_UDP ||
|
|
|
|
flow_type == ICE_FLTR_PTYPE_NONF_IPV4_SCTP ||
|
|
|
|
flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER)
|
2020-05-12 09:01:43 +08:00
|
|
|
ret = ice_fdir_comp_rules(rule, input, false);
|
|
|
|
else
|
|
|
|
ret = ice_fdir_comp_rules(rule, input, true);
|
2020-05-12 09:01:42 +08:00
|
|
|
if (ret) {
|
|
|
|
if (rule->fltr_id == input->fltr_id &&
|
|
|
|
rule->q_index != input->q_index)
|
|
|
|
ret = false;
|
|
|
|
else
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
}
|