1148beb61SHenry Tieman // SPDX-License-Identifier: GPL-2.0
2148beb61SHenry Tieman /* Copyright (C) 2018-2020, Intel Corporation. */
3148beb61SHenry Tieman 
4148beb61SHenry Tieman #include "ice_common.h"
5148beb61SHenry Tieman 
6cac2a27cSHenry Tieman /* These are training packet headers used to program flow director filters. */
7cac2a27cSHenry Tieman static const u8 ice_fdir_tcpv4_pkt[] = {
8cac2a27cSHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
9cac2a27cSHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
10cac2a27cSHenry Tieman 	0x00, 0x28, 0x00, 0x01, 0x00, 0x00, 0x40, 0x06,
11cac2a27cSHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12cac2a27cSHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
13cac2a27cSHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00,
14cac2a27cSHenry Tieman 	0x20, 0x00, 0x00, 0x00, 0x00, 0x00
15cac2a27cSHenry Tieman };
16cac2a27cSHenry Tieman 
17cac2a27cSHenry Tieman static const u8 ice_fdir_udpv4_pkt[] = {
18cac2a27cSHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
19cac2a27cSHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
20cac2a27cSHenry Tieman 	0x00, 0x1C, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
21cac2a27cSHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
22cac2a27cSHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
23cac2a27cSHenry Tieman 	0x00, 0x00,
24cac2a27cSHenry Tieman };
25cac2a27cSHenry Tieman 
26cac2a27cSHenry Tieman static const u8 ice_fdir_sctpv4_pkt[] = {
27cac2a27cSHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
28cac2a27cSHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
29cac2a27cSHenry Tieman 	0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x40, 0x84,
30cac2a27cSHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
31cac2a27cSHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
32cac2a27cSHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
33cac2a27cSHenry Tieman };
34cac2a27cSHenry Tieman 
35cac2a27cSHenry Tieman static const u8 ice_fdir_ipv4_pkt[] = {
36cac2a27cSHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
37cac2a27cSHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
38cac2a27cSHenry Tieman 	0x00, 0x14, 0x00, 0x00, 0x40, 0x00, 0x40, 0x10,
39cac2a27cSHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
40cac2a27cSHenry Tieman 	0x00, 0x00
41cac2a27cSHenry Tieman };
42cac2a27cSHenry Tieman 
43ef9e4cc5SQi Zhang static const u8 ice_fdir_udp4_gtpu4_pkt[] = {
44ef9e4cc5SQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
45ef9e4cc5SQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
46ef9e4cc5SQi Zhang 	0x00, 0x4c, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
47ef9e4cc5SQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
48ef9e4cc5SQi Zhang 	0x00, 0x00, 0x08, 0x68, 0x08, 0x68, 0x00, 0x00,
49ef9e4cc5SQi Zhang 	0x00, 0x00, 0x34, 0xff, 0x00, 0x28, 0x00, 0x00,
50ef9e4cc5SQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x02, 0x00,
51ef9e4cc5SQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00,
52ef9e4cc5SQi Zhang 	0x00, 0x1c, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
53ef9e4cc5SQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
54ef9e4cc5SQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
55ef9e4cc5SQi Zhang 	0x00, 0x00,
56ef9e4cc5SQi Zhang };
57ef9e4cc5SQi Zhang 
58ef9e4cc5SQi Zhang static const u8 ice_fdir_tcp4_gtpu4_pkt[] = {
59ef9e4cc5SQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
60ef9e4cc5SQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
61ef9e4cc5SQi Zhang 	0x00, 0x58, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
62ef9e4cc5SQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
63ef9e4cc5SQi Zhang 	0x00, 0x00, 0x08, 0x68, 0x08, 0x68, 0x00, 0x00,
64ef9e4cc5SQi Zhang 	0x00, 0x00, 0x34, 0xff, 0x00, 0x28, 0x00, 0x00,
65ef9e4cc5SQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x02, 0x00,
66ef9e4cc5SQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00,
67ef9e4cc5SQi Zhang 	0x00, 0x28, 0x00, 0x00, 0x40, 0x00, 0x40, 0x06,
68ef9e4cc5SQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
69ef9e4cc5SQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
70ef9e4cc5SQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
71ef9e4cc5SQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
72ef9e4cc5SQi Zhang };
73ef9e4cc5SQi Zhang 
74ef9e4cc5SQi Zhang static const u8 ice_fdir_icmp4_gtpu4_pkt[] = {
75ef9e4cc5SQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
76ef9e4cc5SQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
77ef9e4cc5SQi Zhang 	0x00, 0x4c, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
78ef9e4cc5SQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
79ef9e4cc5SQi Zhang 	0x00, 0x00, 0x08, 0x68, 0x08, 0x68, 0x00, 0x00,
80ef9e4cc5SQi Zhang 	0x00, 0x00, 0x34, 0xff, 0x00, 0x28, 0x00, 0x00,
81ef9e4cc5SQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x02, 0x00,
82ef9e4cc5SQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00,
83ef9e4cc5SQi Zhang 	0x00, 0x1c, 0x00, 0x00, 0x40, 0x00, 0x40, 0x01,
84ef9e4cc5SQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
85ef9e4cc5SQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
86ef9e4cc5SQi Zhang 	0x00, 0x00,
87ef9e4cc5SQi Zhang };
88ef9e4cc5SQi Zhang 
89ef9e4cc5SQi Zhang static const u8 ice_fdir_ipv4_gtpu4_pkt[] = {
90ef9e4cc5SQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
91ef9e4cc5SQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
92ef9e4cc5SQi Zhang 	0x00, 0x44, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
93ef9e4cc5SQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
94ef9e4cc5SQi Zhang 	0x00, 0x00, 0x08, 0x68, 0x08, 0x68, 0x00, 0x00,
95ef9e4cc5SQi Zhang 	0x00, 0x00, 0x34, 0xff, 0x00, 0x28, 0x00, 0x00,
96ef9e4cc5SQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x02, 0x00,
97ef9e4cc5SQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00,
98ef9e4cc5SQi Zhang 	0x00, 0x14, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00,
99ef9e4cc5SQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
100ef9e4cc5SQi Zhang 	0x00, 0x00,
101ef9e4cc5SQi Zhang };
102ef9e4cc5SQi Zhang 
103213528feSQi Zhang static const u8 ice_fdir_ipv4_l2tpv3_pkt[] = {
104213528feSQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
105213528feSQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
106213528feSQi Zhang 	0x00, 0x14, 0x00, 0x00, 0x40, 0x00, 0x40, 0x73,
107213528feSQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
108213528feSQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
109213528feSQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
110213528feSQi Zhang };
111213528feSQi Zhang 
112213528feSQi Zhang static const u8 ice_fdir_ipv6_l2tpv3_pkt[] = {
113213528feSQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
114213528feSQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
115213528feSQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x73, 0x40, 0x00, 0x00,
116213528feSQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
117213528feSQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
118213528feSQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
119213528feSQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
120213528feSQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
121213528feSQi Zhang 	0x00, 0x00,
122213528feSQi Zhang };
123213528feSQi Zhang 
124213528feSQi Zhang static const u8 ice_fdir_ipv4_esp_pkt[] = {
125213528feSQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
126213528feSQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
127213528feSQi Zhang 	0x00, 0x14, 0x00, 0x00, 0x40, 0x00, 0x40, 0x32,
128213528feSQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
129213528feSQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
130213528feSQi Zhang 	0x00, 0x00
131213528feSQi Zhang };
132213528feSQi Zhang 
133213528feSQi Zhang static const u8 ice_fdir_ipv6_esp_pkt[] = {
134213528feSQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
135213528feSQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
136213528feSQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x32, 0x40, 0x00, 0x00,
137213528feSQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
138213528feSQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
139213528feSQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
140213528feSQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
141213528feSQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
142213528feSQi Zhang };
143213528feSQi Zhang 
144213528feSQi Zhang static const u8 ice_fdir_ipv4_ah_pkt[] = {
145213528feSQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
146213528feSQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
147213528feSQi Zhang 	0x00, 0x14, 0x00, 0x00, 0x40, 0x00, 0x40, 0x33,
148213528feSQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
149213528feSQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
150213528feSQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
151213528feSQi Zhang 	0x00, 0x00
152213528feSQi Zhang };
153213528feSQi Zhang 
154213528feSQi Zhang static const u8 ice_fdir_ipv6_ah_pkt[] = {
155213528feSQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
156213528feSQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
157213528feSQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x33, 0x40, 0x00, 0x00,
158213528feSQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
159213528feSQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
160213528feSQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
161213528feSQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
162213528feSQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
163213528feSQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
164213528feSQi Zhang };
165213528feSQi Zhang 
166213528feSQi Zhang static const u8 ice_fdir_ipv4_nat_t_esp_pkt[] = {
167213528feSQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
168213528feSQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
169213528feSQi Zhang 	0x00, 0x1C, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
170213528feSQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
171213528feSQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x11, 0x94, 0x00, 0x00,
172213528feSQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
173213528feSQi Zhang 	0x00, 0x00,
174213528feSQi Zhang };
175213528feSQi Zhang 
176213528feSQi Zhang static const u8 ice_fdir_ipv6_nat_t_esp_pkt[] = {
177213528feSQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
178213528feSQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
179213528feSQi Zhang 	0x00, 0x00, 0x00, 0x08, 0x11, 0x40, 0x00, 0x00,
180213528feSQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
181213528feSQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
182213528feSQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
183213528feSQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
184213528feSQi Zhang 	0x11, 0x94, 0x00, 0x00, 0x00, 0x08,
185213528feSQi Zhang };
186213528feSQi Zhang 
187213528feSQi Zhang static const u8 ice_fdir_ipv4_pfcp_node_pkt[] = {
188213528feSQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
189213528feSQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
190213528feSQi Zhang 	0x00, 0x2C, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
191213528feSQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
192213528feSQi Zhang 	0x00, 0x00, 0x22, 0x65, 0x22, 0x65, 0x00, 0x00,
193213528feSQi Zhang 	0x00, 0x00, 0x20, 0x00, 0x00, 0x10, 0x00, 0x00,
194213528feSQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
195213528feSQi Zhang 	0x00, 0x00,
196213528feSQi Zhang };
197213528feSQi Zhang 
198213528feSQi Zhang static const u8 ice_fdir_ipv4_pfcp_session_pkt[] = {
199213528feSQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
200213528feSQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
201213528feSQi Zhang 	0x00, 0x2C, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
202213528feSQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
203213528feSQi Zhang 	0x00, 0x00, 0x22, 0x65, 0x22, 0x65, 0x00, 0x00,
204213528feSQi Zhang 	0x00, 0x00, 0x21, 0x00, 0x00, 0x10, 0x00, 0x00,
205213528feSQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
206213528feSQi Zhang 	0x00, 0x00,
207213528feSQi Zhang };
208213528feSQi Zhang 
209213528feSQi Zhang static const u8 ice_fdir_ipv6_pfcp_node_pkt[] = {
210213528feSQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
211213528feSQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
212213528feSQi Zhang 	0x00, 0x00, 0x00, 0x18, 0x11, 0x40, 0x00, 0x00,
213213528feSQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
214213528feSQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
215213528feSQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
216213528feSQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x65,
217213528feSQi Zhang 	0x22, 0x65, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00,
218213528feSQi Zhang 	0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
219213528feSQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
220213528feSQi Zhang };
221213528feSQi Zhang 
222213528feSQi Zhang static const u8 ice_fdir_ipv6_pfcp_session_pkt[] = {
223213528feSQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
224213528feSQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
225213528feSQi Zhang 	0x00, 0x00, 0x00, 0x18, 0x11, 0x40, 0x00, 0x00,
226213528feSQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
227213528feSQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
228213528feSQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
229213528feSQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x65,
230213528feSQi Zhang 	0x22, 0x65, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00,
231213528feSQi Zhang 	0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
232213528feSQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
233213528feSQi Zhang };
234213528feSQi Zhang 
23521606584SQi Zhang static const u8 ice_fdir_non_ip_l2_pkt[] = {
23621606584SQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
23721606584SQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
23821606584SQi Zhang 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
23921606584SQi Zhang };
24021606584SQi Zhang 
241165d80d6SHenry Tieman static const u8 ice_fdir_tcpv6_pkt[] = {
242165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
243165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
244165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x14, 0x06, 0x40, 0x00, 0x00,
245165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
246165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
247165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
248165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
249165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
250165d80d6SHenry Tieman 	0x00, 0x00, 0x50, 0x00, 0x20, 0x00, 0x00, 0x00,
251165d80d6SHenry Tieman 	0x00, 0x00,
252165d80d6SHenry Tieman };
253165d80d6SHenry Tieman 
254165d80d6SHenry Tieman static const u8 ice_fdir_udpv6_pkt[] = {
255165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
256165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
257165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x08, 0x11, 0x40, 0x00, 0x00,
258165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
259165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
260165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
261165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
262165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x08, 0x00, 0x00,
263165d80d6SHenry Tieman };
264165d80d6SHenry Tieman 
265165d80d6SHenry Tieman static const u8 ice_fdir_sctpv6_pkt[] = {
266165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
267165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
268165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x0C, 0x84, 0x40, 0x00, 0x00,
269165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
270165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
271165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
272165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
273165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
274165d80d6SHenry Tieman 	0x00, 0x00,
275165d80d6SHenry Tieman };
276165d80d6SHenry Tieman 
277165d80d6SHenry Tieman static const u8 ice_fdir_ipv6_pkt[] = {
278165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
279165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
280165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x3B, 0x40, 0x00, 0x00,
281165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
282165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
283165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
284165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
285165d80d6SHenry Tieman };
286165d80d6SHenry Tieman 
287cac2a27cSHenry Tieman static const u8 ice_fdir_tcp4_tun_pkt[] = {
288cac2a27cSHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
289cac2a27cSHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
290cac2a27cSHenry Tieman 	0x00, 0x5a, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
291cac2a27cSHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
292cac2a27cSHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
293cac2a27cSHenry Tieman 	0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
294cac2a27cSHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
295cac2a27cSHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
296cac2a27cSHenry Tieman 	0x45, 0x00, 0x00, 0x28, 0x00, 0x00, 0x40, 0x00,
297cac2a27cSHenry Tieman 	0x40, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
298cac2a27cSHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
299cac2a27cSHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
300cac2a27cSHenry Tieman 	0x50, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00,
301cac2a27cSHenry Tieman };
302cac2a27cSHenry Tieman 
303cac2a27cSHenry Tieman static const u8 ice_fdir_udp4_tun_pkt[] = {
304cac2a27cSHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
305cac2a27cSHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
306cac2a27cSHenry Tieman 	0x00, 0x4e, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
307cac2a27cSHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
308cac2a27cSHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
309cac2a27cSHenry Tieman 	0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
310cac2a27cSHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
311cac2a27cSHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
312cac2a27cSHenry Tieman 	0x45, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x40, 0x00,
313cac2a27cSHenry Tieman 	0x40, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
314cac2a27cSHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
315cac2a27cSHenry Tieman 	0x00, 0x00, 0x00, 0x00,
316cac2a27cSHenry Tieman };
317cac2a27cSHenry Tieman 
318cac2a27cSHenry Tieman static const u8 ice_fdir_sctp4_tun_pkt[] = {
319cac2a27cSHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
320cac2a27cSHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
321cac2a27cSHenry Tieman 	0x00, 0x52, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
322cac2a27cSHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
323cac2a27cSHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
324cac2a27cSHenry Tieman 	0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
325cac2a27cSHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
326cac2a27cSHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
327cac2a27cSHenry Tieman 	0x45, 0x00, 0x00, 0x20, 0x00, 0x01, 0x00, 0x00,
328cac2a27cSHenry Tieman 	0x40, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
329cac2a27cSHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
330cac2a27cSHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
331cac2a27cSHenry Tieman };
332cac2a27cSHenry Tieman 
333cac2a27cSHenry Tieman static const u8 ice_fdir_ip4_tun_pkt[] = {
334cac2a27cSHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
335cac2a27cSHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
336cac2a27cSHenry Tieman 	0x00, 0x46, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
337cac2a27cSHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
338cac2a27cSHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
339cac2a27cSHenry Tieman 	0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
340cac2a27cSHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
341cac2a27cSHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
342cac2a27cSHenry Tieman 	0x45, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00,
343cac2a27cSHenry Tieman 	0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
344cac2a27cSHenry Tieman 	0x00, 0x00, 0x00, 0x00,
345cac2a27cSHenry Tieman };
346cac2a27cSHenry Tieman 
347165d80d6SHenry Tieman static const u8 ice_fdir_tcp6_tun_pkt[] = {
348165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
349165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
350165d80d6SHenry Tieman 	0x00, 0x6e, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
351165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
352165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
353165d80d6SHenry Tieman 	0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
354165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
355165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd,
356165d80d6SHenry Tieman 	0x60, 0x00, 0x00, 0x00, 0x00, 0x14, 0x06, 0x40,
357165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
358165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
359165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
360165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
361165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
362165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x20, 0x00,
363165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00,
364165d80d6SHenry Tieman };
365165d80d6SHenry Tieman 
366165d80d6SHenry Tieman static const u8 ice_fdir_udp6_tun_pkt[] = {
367165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
368165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
369165d80d6SHenry Tieman 	0x00, 0x62, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
370165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
371165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
372165d80d6SHenry Tieman 	0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
373165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
374165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd,
375165d80d6SHenry Tieman 	0x60, 0x00, 0x00, 0x00, 0x00, 0x08, 0x11, 0x40,
376165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
377165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
378165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
379165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
380165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
381165d80d6SHenry Tieman };
382165d80d6SHenry Tieman 
383165d80d6SHenry Tieman static const u8 ice_fdir_sctp6_tun_pkt[] = {
384165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
385165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
386165d80d6SHenry Tieman 	0x00, 0x66, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
387165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
388165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
389165d80d6SHenry Tieman 	0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
390165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
391165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd,
392165d80d6SHenry Tieman 	0x60, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x84, 0x40,
393165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
394165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
395165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
396165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
397165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
398165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00,
399165d80d6SHenry Tieman };
400165d80d6SHenry Tieman 
401165d80d6SHenry Tieman static const u8 ice_fdir_ip6_tun_pkt[] = {
402165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
403165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
404165d80d6SHenry Tieman 	0x00, 0x5a, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
405165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
406165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
407165d80d6SHenry Tieman 	0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
408165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
409165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd,
410165d80d6SHenry Tieman 	0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3b, 0x40,
411165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
412165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
413165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
414165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
415165d80d6SHenry Tieman };
416165d80d6SHenry Tieman 
417cac2a27cSHenry Tieman /* Flow Director no-op training packet table */
418cac2a27cSHenry Tieman static const struct ice_fdir_base_pkt ice_fdir_pkt[] = {
419cac2a27cSHenry Tieman 	{
420cac2a27cSHenry Tieman 		ICE_FLTR_PTYPE_NONF_IPV4_TCP,
421cac2a27cSHenry Tieman 		sizeof(ice_fdir_tcpv4_pkt), ice_fdir_tcpv4_pkt,
422cac2a27cSHenry Tieman 		sizeof(ice_fdir_tcp4_tun_pkt), ice_fdir_tcp4_tun_pkt,
423cac2a27cSHenry Tieman 	},
424cac2a27cSHenry Tieman 	{
425cac2a27cSHenry Tieman 		ICE_FLTR_PTYPE_NONF_IPV4_UDP,
426cac2a27cSHenry Tieman 		sizeof(ice_fdir_udpv4_pkt), ice_fdir_udpv4_pkt,
427cac2a27cSHenry Tieman 		sizeof(ice_fdir_udp4_tun_pkt), ice_fdir_udp4_tun_pkt,
428cac2a27cSHenry Tieman 	},
429cac2a27cSHenry Tieman 	{
430cac2a27cSHenry Tieman 		ICE_FLTR_PTYPE_NONF_IPV4_SCTP,
431cac2a27cSHenry Tieman 		sizeof(ice_fdir_sctpv4_pkt), ice_fdir_sctpv4_pkt,
432cac2a27cSHenry Tieman 		sizeof(ice_fdir_sctp4_tun_pkt), ice_fdir_sctp4_tun_pkt,
433cac2a27cSHenry Tieman 	},
434cac2a27cSHenry Tieman 	{
435cac2a27cSHenry Tieman 		ICE_FLTR_PTYPE_NONF_IPV4_OTHER,
436cac2a27cSHenry Tieman 		sizeof(ice_fdir_ipv4_pkt), ice_fdir_ipv4_pkt,
437cac2a27cSHenry Tieman 		sizeof(ice_fdir_ip4_tun_pkt), ice_fdir_ip4_tun_pkt,
438cac2a27cSHenry Tieman 	},
439165d80d6SHenry Tieman 	{
440ef9e4cc5SQi Zhang 		ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_UDP,
441ef9e4cc5SQi Zhang 		sizeof(ice_fdir_udp4_gtpu4_pkt),
442ef9e4cc5SQi Zhang 		ice_fdir_udp4_gtpu4_pkt,
443ef9e4cc5SQi Zhang 		sizeof(ice_fdir_udp4_gtpu4_pkt),
444ef9e4cc5SQi Zhang 		ice_fdir_udp4_gtpu4_pkt,
445ef9e4cc5SQi Zhang 	},
446ef9e4cc5SQi Zhang 	{
447ef9e4cc5SQi Zhang 		ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_TCP,
448ef9e4cc5SQi Zhang 		sizeof(ice_fdir_tcp4_gtpu4_pkt),
449ef9e4cc5SQi Zhang 		ice_fdir_tcp4_gtpu4_pkt,
450ef9e4cc5SQi Zhang 		sizeof(ice_fdir_tcp4_gtpu4_pkt),
451ef9e4cc5SQi Zhang 		ice_fdir_tcp4_gtpu4_pkt,
452ef9e4cc5SQi Zhang 	},
453ef9e4cc5SQi Zhang 	{
454ef9e4cc5SQi Zhang 		ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_ICMP,
455ef9e4cc5SQi Zhang 		sizeof(ice_fdir_icmp4_gtpu4_pkt),
456ef9e4cc5SQi Zhang 		ice_fdir_icmp4_gtpu4_pkt,
457ef9e4cc5SQi Zhang 		sizeof(ice_fdir_icmp4_gtpu4_pkt),
458ef9e4cc5SQi Zhang 		ice_fdir_icmp4_gtpu4_pkt,
459ef9e4cc5SQi Zhang 	},
460ef9e4cc5SQi Zhang 	{
461ef9e4cc5SQi Zhang 		ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_OTHER,
462ef9e4cc5SQi Zhang 		sizeof(ice_fdir_ipv4_gtpu4_pkt),
463ef9e4cc5SQi Zhang 		ice_fdir_ipv4_gtpu4_pkt,
464ef9e4cc5SQi Zhang 		sizeof(ice_fdir_ipv4_gtpu4_pkt),
465ef9e4cc5SQi Zhang 		ice_fdir_ipv4_gtpu4_pkt,
466ef9e4cc5SQi Zhang 	},
467ef9e4cc5SQi Zhang 	{
468213528feSQi Zhang 		ICE_FLTR_PTYPE_NONF_IPV4_L2TPV3,
469213528feSQi Zhang 		sizeof(ice_fdir_ipv4_l2tpv3_pkt), ice_fdir_ipv4_l2tpv3_pkt,
470213528feSQi Zhang 		sizeof(ice_fdir_ipv4_l2tpv3_pkt), ice_fdir_ipv4_l2tpv3_pkt,
471213528feSQi Zhang 	},
472213528feSQi Zhang 	{
473213528feSQi Zhang 		ICE_FLTR_PTYPE_NONF_IPV6_L2TPV3,
474213528feSQi Zhang 		sizeof(ice_fdir_ipv6_l2tpv3_pkt), ice_fdir_ipv6_l2tpv3_pkt,
475213528feSQi Zhang 		sizeof(ice_fdir_ipv6_l2tpv3_pkt), ice_fdir_ipv6_l2tpv3_pkt,
476213528feSQi Zhang 	},
477213528feSQi Zhang 	{
478213528feSQi Zhang 		ICE_FLTR_PTYPE_NONF_IPV4_ESP,
479213528feSQi Zhang 		sizeof(ice_fdir_ipv4_esp_pkt), ice_fdir_ipv4_esp_pkt,
480213528feSQi Zhang 		sizeof(ice_fdir_ipv4_esp_pkt), ice_fdir_ipv4_esp_pkt,
481213528feSQi Zhang 	},
482213528feSQi Zhang 	{
483213528feSQi Zhang 		ICE_FLTR_PTYPE_NONF_IPV6_ESP,
484213528feSQi Zhang 		sizeof(ice_fdir_ipv6_esp_pkt), ice_fdir_ipv6_esp_pkt,
485213528feSQi Zhang 		sizeof(ice_fdir_ipv6_esp_pkt), ice_fdir_ipv6_esp_pkt,
486213528feSQi Zhang 	},
487213528feSQi Zhang 	{
488213528feSQi Zhang 		ICE_FLTR_PTYPE_NONF_IPV4_AH,
489213528feSQi Zhang 		sizeof(ice_fdir_ipv4_ah_pkt), ice_fdir_ipv4_ah_pkt,
490213528feSQi Zhang 		sizeof(ice_fdir_ipv4_ah_pkt), ice_fdir_ipv4_ah_pkt,
491213528feSQi Zhang 	},
492213528feSQi Zhang 	{
493213528feSQi Zhang 		ICE_FLTR_PTYPE_NONF_IPV6_AH,
494213528feSQi Zhang 		sizeof(ice_fdir_ipv6_ah_pkt), ice_fdir_ipv6_ah_pkt,
495213528feSQi Zhang 		sizeof(ice_fdir_ipv6_ah_pkt), ice_fdir_ipv6_ah_pkt,
496213528feSQi Zhang 	},
497213528feSQi Zhang 	{
498213528feSQi Zhang 		ICE_FLTR_PTYPE_NONF_IPV4_NAT_T_ESP,
499213528feSQi Zhang 		sizeof(ice_fdir_ipv4_nat_t_esp_pkt),
500213528feSQi Zhang 		ice_fdir_ipv4_nat_t_esp_pkt,
501213528feSQi Zhang 		sizeof(ice_fdir_ipv4_nat_t_esp_pkt),
502213528feSQi Zhang 		ice_fdir_ipv4_nat_t_esp_pkt,
503213528feSQi Zhang 	},
504213528feSQi Zhang 	{
505213528feSQi Zhang 		ICE_FLTR_PTYPE_NONF_IPV6_NAT_T_ESP,
506213528feSQi Zhang 		sizeof(ice_fdir_ipv6_nat_t_esp_pkt),
507213528feSQi Zhang 		ice_fdir_ipv6_nat_t_esp_pkt,
508213528feSQi Zhang 		sizeof(ice_fdir_ipv6_nat_t_esp_pkt),
509213528feSQi Zhang 		ice_fdir_ipv6_nat_t_esp_pkt,
510213528feSQi Zhang 	},
511213528feSQi Zhang 	{
512213528feSQi Zhang 		ICE_FLTR_PTYPE_NONF_IPV4_PFCP_NODE,
513213528feSQi Zhang 		sizeof(ice_fdir_ipv4_pfcp_node_pkt),
514213528feSQi Zhang 		ice_fdir_ipv4_pfcp_node_pkt,
515213528feSQi Zhang 		sizeof(ice_fdir_ipv4_pfcp_node_pkt),
516213528feSQi Zhang 		ice_fdir_ipv4_pfcp_node_pkt,
517213528feSQi Zhang 	},
518213528feSQi Zhang 	{
519213528feSQi Zhang 		ICE_FLTR_PTYPE_NONF_IPV4_PFCP_SESSION,
520213528feSQi Zhang 		sizeof(ice_fdir_ipv4_pfcp_session_pkt),
521213528feSQi Zhang 		ice_fdir_ipv4_pfcp_session_pkt,
522213528feSQi Zhang 		sizeof(ice_fdir_ipv4_pfcp_session_pkt),
523213528feSQi Zhang 		ice_fdir_ipv4_pfcp_session_pkt,
524213528feSQi Zhang 	},
525213528feSQi Zhang 	{
526213528feSQi Zhang 		ICE_FLTR_PTYPE_NONF_IPV6_PFCP_NODE,
527213528feSQi Zhang 		sizeof(ice_fdir_ipv6_pfcp_node_pkt),
528213528feSQi Zhang 		ice_fdir_ipv6_pfcp_node_pkt,
529213528feSQi Zhang 		sizeof(ice_fdir_ipv6_pfcp_node_pkt),
530213528feSQi Zhang 		ice_fdir_ipv6_pfcp_node_pkt,
531213528feSQi Zhang 	},
532213528feSQi Zhang 	{
533213528feSQi Zhang 		ICE_FLTR_PTYPE_NONF_IPV6_PFCP_SESSION,
534213528feSQi Zhang 		sizeof(ice_fdir_ipv6_pfcp_session_pkt),
535213528feSQi Zhang 		ice_fdir_ipv6_pfcp_session_pkt,
536213528feSQi Zhang 		sizeof(ice_fdir_ipv6_pfcp_session_pkt),
537213528feSQi Zhang 		ice_fdir_ipv6_pfcp_session_pkt,
538213528feSQi Zhang 	},
539213528feSQi Zhang 	{
54021606584SQi Zhang 		ICE_FLTR_PTYPE_NON_IP_L2,
54121606584SQi Zhang 		sizeof(ice_fdir_non_ip_l2_pkt), ice_fdir_non_ip_l2_pkt,
54221606584SQi Zhang 		sizeof(ice_fdir_non_ip_l2_pkt), ice_fdir_non_ip_l2_pkt,
54321606584SQi Zhang 	},
54421606584SQi Zhang 	{
545165d80d6SHenry Tieman 		ICE_FLTR_PTYPE_NONF_IPV6_TCP,
546165d80d6SHenry Tieman 		sizeof(ice_fdir_tcpv6_pkt), ice_fdir_tcpv6_pkt,
547165d80d6SHenry Tieman 		sizeof(ice_fdir_tcp6_tun_pkt), ice_fdir_tcp6_tun_pkt,
548165d80d6SHenry Tieman 	},
549165d80d6SHenry Tieman 	{
550165d80d6SHenry Tieman 		ICE_FLTR_PTYPE_NONF_IPV6_UDP,
551165d80d6SHenry Tieman 		sizeof(ice_fdir_udpv6_pkt), ice_fdir_udpv6_pkt,
552165d80d6SHenry Tieman 		sizeof(ice_fdir_udp6_tun_pkt), ice_fdir_udp6_tun_pkt,
553165d80d6SHenry Tieman 	},
554165d80d6SHenry Tieman 	{
555165d80d6SHenry Tieman 		ICE_FLTR_PTYPE_NONF_IPV6_SCTP,
556165d80d6SHenry Tieman 		sizeof(ice_fdir_sctpv6_pkt), ice_fdir_sctpv6_pkt,
557165d80d6SHenry Tieman 		sizeof(ice_fdir_sctp6_tun_pkt), ice_fdir_sctp6_tun_pkt,
558165d80d6SHenry Tieman 	},
559165d80d6SHenry Tieman 	{
560165d80d6SHenry Tieman 		ICE_FLTR_PTYPE_NONF_IPV6_OTHER,
561165d80d6SHenry Tieman 		sizeof(ice_fdir_ipv6_pkt), ice_fdir_ipv6_pkt,
562165d80d6SHenry Tieman 		sizeof(ice_fdir_ip6_tun_pkt), ice_fdir_ip6_tun_pkt,
563165d80d6SHenry Tieman 	},
564cac2a27cSHenry Tieman };
565cac2a27cSHenry Tieman 
566cac2a27cSHenry Tieman #define ICE_FDIR_NUM_PKT ARRAY_SIZE(ice_fdir_pkt)
567cac2a27cSHenry Tieman 
568cac2a27cSHenry Tieman /**
569cac2a27cSHenry Tieman  * ice_set_dflt_val_fd_desc
570cac2a27cSHenry Tieman  * @fd_fltr_ctx: pointer to fd filter descriptor
571cac2a27cSHenry Tieman  */
ice_set_dflt_val_fd_desc(struct ice_fd_fltr_desc_ctx * fd_fltr_ctx)572cac2a27cSHenry Tieman static void ice_set_dflt_val_fd_desc(struct ice_fd_fltr_desc_ctx *fd_fltr_ctx)
573cac2a27cSHenry Tieman {
574cac2a27cSHenry Tieman 	fd_fltr_ctx->comp_q = ICE_FXD_FLTR_QW0_COMP_Q_ZERO;
575cac2a27cSHenry Tieman 	fd_fltr_ctx->comp_report = ICE_FXD_FLTR_QW0_COMP_REPORT_SW_FAIL;
576cac2a27cSHenry Tieman 	fd_fltr_ctx->fd_space = ICE_FXD_FLTR_QW0_FD_SPACE_GUAR_BEST;
577cac2a27cSHenry Tieman 	fd_fltr_ctx->cnt_ena = ICE_FXD_FLTR_QW0_STAT_ENA_PKTS;
578cac2a27cSHenry Tieman 	fd_fltr_ctx->evict_ena = ICE_FXD_FLTR_QW0_EVICT_ENA_TRUE;
579cac2a27cSHenry Tieman 	fd_fltr_ctx->toq = ICE_FXD_FLTR_QW0_TO_Q_EQUALS_QINDEX;
580cac2a27cSHenry Tieman 	fd_fltr_ctx->toq_prio = ICE_FXD_FLTR_QW0_TO_Q_PRIO1;
581cac2a27cSHenry Tieman 	fd_fltr_ctx->dpu_recipe = ICE_FXD_FLTR_QW0_DPU_RECIPE_DFLT;
582cac2a27cSHenry Tieman 	fd_fltr_ctx->drop = ICE_FXD_FLTR_QW0_DROP_NO;
583cac2a27cSHenry Tieman 	fd_fltr_ctx->flex_prio = ICE_FXD_FLTR_QW0_FLEX_PRI_NONE;
584cac2a27cSHenry Tieman 	fd_fltr_ctx->flex_mdid = ICE_FXD_FLTR_QW0_FLEX_MDID0;
585cac2a27cSHenry Tieman 	fd_fltr_ctx->flex_val = ICE_FXD_FLTR_QW0_FLEX_VAL0;
586cac2a27cSHenry Tieman 	fd_fltr_ctx->dtype = ICE_TX_DESC_DTYPE_FLTR_PROG;
587cac2a27cSHenry Tieman 	fd_fltr_ctx->desc_prof_prio = ICE_FXD_FLTR_QW1_PROF_PRIO_ZERO;
588cac2a27cSHenry Tieman 	fd_fltr_ctx->desc_prof = ICE_FXD_FLTR_QW1_PROF_ZERO;
589cac2a27cSHenry Tieman 	fd_fltr_ctx->swap = ICE_FXD_FLTR_QW1_SWAP_SET;
590cac2a27cSHenry Tieman 	fd_fltr_ctx->fdid_prio = ICE_FXD_FLTR_QW1_FDID_PRI_ONE;
591cac2a27cSHenry Tieman 	fd_fltr_ctx->fdid_mdid = ICE_FXD_FLTR_QW1_FDID_MDID_FD;
592cac2a27cSHenry Tieman 	fd_fltr_ctx->fdid = ICE_FXD_FLTR_QW1_FDID_ZERO;
593cac2a27cSHenry Tieman }
594cac2a27cSHenry Tieman 
595cac2a27cSHenry Tieman /**
596cac2a27cSHenry Tieman  * ice_set_fd_desc_val
597cac2a27cSHenry Tieman  * @ctx: pointer to fd filter descriptor context
598cac2a27cSHenry Tieman  * @fdir_desc: populated with fd filter descriptor values
599cac2a27cSHenry Tieman  */
600cac2a27cSHenry Tieman static void
ice_set_fd_desc_val(struct ice_fd_fltr_desc_ctx * ctx,struct ice_fltr_desc * fdir_desc)601cac2a27cSHenry Tieman ice_set_fd_desc_val(struct ice_fd_fltr_desc_ctx *ctx,
602cac2a27cSHenry Tieman 		    struct ice_fltr_desc *fdir_desc)
603cac2a27cSHenry Tieman {
604cac2a27cSHenry Tieman 	u64 qword;
605cac2a27cSHenry Tieman 
606cac2a27cSHenry Tieman 	/* prep QW0 of FD filter programming desc */
607cac2a27cSHenry Tieman 	qword = ((u64)ctx->qindex << ICE_FXD_FLTR_QW0_QINDEX_S) &
608cac2a27cSHenry Tieman 		ICE_FXD_FLTR_QW0_QINDEX_M;
609cac2a27cSHenry Tieman 	qword |= ((u64)ctx->comp_q << ICE_FXD_FLTR_QW0_COMP_Q_S) &
610cac2a27cSHenry Tieman 		 ICE_FXD_FLTR_QW0_COMP_Q_M;
611cac2a27cSHenry Tieman 	qword |= ((u64)ctx->comp_report << ICE_FXD_FLTR_QW0_COMP_REPORT_S) &
612cac2a27cSHenry Tieman 		 ICE_FXD_FLTR_QW0_COMP_REPORT_M;
613cac2a27cSHenry Tieman 	qword |= ((u64)ctx->fd_space << ICE_FXD_FLTR_QW0_FD_SPACE_S) &
614cac2a27cSHenry Tieman 		 ICE_FXD_FLTR_QW0_FD_SPACE_M;
615cac2a27cSHenry Tieman 	qword |= ((u64)ctx->cnt_index << ICE_FXD_FLTR_QW0_STAT_CNT_S) &
616cac2a27cSHenry Tieman 		 ICE_FXD_FLTR_QW0_STAT_CNT_M;
617cac2a27cSHenry Tieman 	qword |= ((u64)ctx->cnt_ena << ICE_FXD_FLTR_QW0_STAT_ENA_S) &
618cac2a27cSHenry Tieman 		 ICE_FXD_FLTR_QW0_STAT_ENA_M;
619cac2a27cSHenry Tieman 	qword |= ((u64)ctx->evict_ena << ICE_FXD_FLTR_QW0_EVICT_ENA_S) &
620cac2a27cSHenry Tieman 		 ICE_FXD_FLTR_QW0_EVICT_ENA_M;
621cac2a27cSHenry Tieman 	qword |= ((u64)ctx->toq << ICE_FXD_FLTR_QW0_TO_Q_S) &
622cac2a27cSHenry Tieman 		 ICE_FXD_FLTR_QW0_TO_Q_M;
623cac2a27cSHenry Tieman 	qword |= ((u64)ctx->toq_prio << ICE_FXD_FLTR_QW0_TO_Q_PRI_S) &
624cac2a27cSHenry Tieman 		 ICE_FXD_FLTR_QW0_TO_Q_PRI_M;
625cac2a27cSHenry Tieman 	qword |= ((u64)ctx->dpu_recipe << ICE_FXD_FLTR_QW0_DPU_RECIPE_S) &
626cac2a27cSHenry Tieman 		 ICE_FXD_FLTR_QW0_DPU_RECIPE_M;
627cac2a27cSHenry Tieman 	qword |= ((u64)ctx->drop << ICE_FXD_FLTR_QW0_DROP_S) &
628cac2a27cSHenry Tieman 		 ICE_FXD_FLTR_QW0_DROP_M;
629cac2a27cSHenry Tieman 	qword |= ((u64)ctx->flex_prio << ICE_FXD_FLTR_QW0_FLEX_PRI_S) &
630cac2a27cSHenry Tieman 		 ICE_FXD_FLTR_QW0_FLEX_PRI_M;
631cac2a27cSHenry Tieman 	qword |= ((u64)ctx->flex_mdid << ICE_FXD_FLTR_QW0_FLEX_MDID_S) &
632cac2a27cSHenry Tieman 		 ICE_FXD_FLTR_QW0_FLEX_MDID_M;
633cac2a27cSHenry Tieman 	qword |= ((u64)ctx->flex_val << ICE_FXD_FLTR_QW0_FLEX_VAL_S) &
634cac2a27cSHenry Tieman 		 ICE_FXD_FLTR_QW0_FLEX_VAL_M;
635cac2a27cSHenry Tieman 	fdir_desc->qidx_compq_space_stat = cpu_to_le64(qword);
636cac2a27cSHenry Tieman 
637cac2a27cSHenry Tieman 	/* prep QW1 of FD filter programming desc */
638cac2a27cSHenry Tieman 	qword = ((u64)ctx->dtype << ICE_FXD_FLTR_QW1_DTYPE_S) &
639cac2a27cSHenry Tieman 		ICE_FXD_FLTR_QW1_DTYPE_M;
640cac2a27cSHenry Tieman 	qword |= ((u64)ctx->pcmd << ICE_FXD_FLTR_QW1_PCMD_S) &
641cac2a27cSHenry Tieman 		 ICE_FXD_FLTR_QW1_PCMD_M;
642cac2a27cSHenry Tieman 	qword |= ((u64)ctx->desc_prof_prio << ICE_FXD_FLTR_QW1_PROF_PRI_S) &
643cac2a27cSHenry Tieman 		 ICE_FXD_FLTR_QW1_PROF_PRI_M;
644cac2a27cSHenry Tieman 	qword |= ((u64)ctx->desc_prof << ICE_FXD_FLTR_QW1_PROF_S) &
645cac2a27cSHenry Tieman 		 ICE_FXD_FLTR_QW1_PROF_M;
646cac2a27cSHenry Tieman 	qword |= ((u64)ctx->fd_vsi << ICE_FXD_FLTR_QW1_FD_VSI_S) &
647cac2a27cSHenry Tieman 		 ICE_FXD_FLTR_QW1_FD_VSI_M;
648cac2a27cSHenry Tieman 	qword |= ((u64)ctx->swap << ICE_FXD_FLTR_QW1_SWAP_S) &
649cac2a27cSHenry Tieman 		 ICE_FXD_FLTR_QW1_SWAP_M;
650cac2a27cSHenry Tieman 	qword |= ((u64)ctx->fdid_prio << ICE_FXD_FLTR_QW1_FDID_PRI_S) &
651cac2a27cSHenry Tieman 		 ICE_FXD_FLTR_QW1_FDID_PRI_M;
652cac2a27cSHenry Tieman 	qword |= ((u64)ctx->fdid_mdid << ICE_FXD_FLTR_QW1_FDID_MDID_S) &
653cac2a27cSHenry Tieman 		 ICE_FXD_FLTR_QW1_FDID_MDID_M;
654cac2a27cSHenry Tieman 	qword |= ((u64)ctx->fdid << ICE_FXD_FLTR_QW1_FDID_S) &
655cac2a27cSHenry Tieman 		 ICE_FXD_FLTR_QW1_FDID_M;
656cac2a27cSHenry Tieman 	fdir_desc->dtype_cmd_vsi_fdid = cpu_to_le64(qword);
657cac2a27cSHenry Tieman }
658cac2a27cSHenry Tieman 
659cac2a27cSHenry Tieman /**
660cac2a27cSHenry Tieman  * ice_fdir_get_prgm_desc - set a fdir descriptor from a fdir filter struct
661cac2a27cSHenry Tieman  * @hw: pointer to the hardware structure
662cac2a27cSHenry Tieman  * @input: filter
663cac2a27cSHenry Tieman  * @fdesc: filter descriptor
664cac2a27cSHenry Tieman  * @add: if add is true, this is an add operation, false implies delete
665cac2a27cSHenry Tieman  */
666cac2a27cSHenry Tieman void
ice_fdir_get_prgm_desc(struct ice_hw * hw,struct ice_fdir_fltr * input,struct ice_fltr_desc * fdesc,bool add)667cac2a27cSHenry Tieman ice_fdir_get_prgm_desc(struct ice_hw *hw, struct ice_fdir_fltr *input,
668cac2a27cSHenry Tieman 		       struct ice_fltr_desc *fdesc, bool add)
669cac2a27cSHenry Tieman {
670cac2a27cSHenry Tieman 	struct ice_fd_fltr_desc_ctx fdir_fltr_ctx = { 0 };
671cac2a27cSHenry Tieman 
672cac2a27cSHenry Tieman 	/* set default context info */
673cac2a27cSHenry Tieman 	ice_set_dflt_val_fd_desc(&fdir_fltr_ctx);
674cac2a27cSHenry Tieman 
675cac2a27cSHenry Tieman 	/* change sideband filtering values */
676cac2a27cSHenry Tieman 	fdir_fltr_ctx.fdid = input->fltr_id;
677cac2a27cSHenry Tieman 	if (input->dest_ctl == ICE_FLTR_PRGM_DESC_DEST_DROP_PKT) {
678cac2a27cSHenry Tieman 		fdir_fltr_ctx.drop = ICE_FXD_FLTR_QW0_DROP_YES;
679cac2a27cSHenry Tieman 		fdir_fltr_ctx.qindex = 0;
680346bf250SQi Zhang 	} else if (input->dest_ctl ==
681346bf250SQi Zhang 		   ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_OTHER) {
682346bf250SQi Zhang 		fdir_fltr_ctx.drop = ICE_FXD_FLTR_QW0_DROP_NO;
683346bf250SQi Zhang 		fdir_fltr_ctx.qindex = 0;
684cac2a27cSHenry Tieman 	} else {
685346bf250SQi Zhang 		if (input->dest_ctl ==
686346bf250SQi Zhang 		    ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_QGROUP)
687346bf250SQi Zhang 			fdir_fltr_ctx.toq = input->q_region;
688cac2a27cSHenry Tieman 		fdir_fltr_ctx.drop = ICE_FXD_FLTR_QW0_DROP_NO;
689cac2a27cSHenry Tieman 		fdir_fltr_ctx.qindex = input->q_index;
690cac2a27cSHenry Tieman 	}
6911f7ea1cdSQi Zhang 	fdir_fltr_ctx.cnt_ena = input->cnt_ena;
692cac2a27cSHenry Tieman 	fdir_fltr_ctx.cnt_index = input->cnt_index;
693cac2a27cSHenry Tieman 	fdir_fltr_ctx.fd_vsi = ice_get_hw_vsi_num(hw, input->dest_vsi);
694cac2a27cSHenry Tieman 	fdir_fltr_ctx.evict_ena = ICE_FXD_FLTR_QW0_EVICT_ENA_FALSE;
695346bf250SQi Zhang 	if (input->dest_ctl == ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_OTHER)
696346bf250SQi Zhang 		fdir_fltr_ctx.toq_prio = 0;
697346bf250SQi Zhang 	else
698cac2a27cSHenry Tieman 		fdir_fltr_ctx.toq_prio = 3;
699cac2a27cSHenry Tieman 	fdir_fltr_ctx.pcmd = add ? ICE_FXD_FLTR_QW1_PCMD_ADD :
700cac2a27cSHenry Tieman 		ICE_FXD_FLTR_QW1_PCMD_REMOVE;
701cac2a27cSHenry Tieman 	fdir_fltr_ctx.swap = ICE_FXD_FLTR_QW1_SWAP_NOT_SET;
702cac2a27cSHenry Tieman 	fdir_fltr_ctx.comp_q = ICE_FXD_FLTR_QW0_COMP_Q_ZERO;
7031f7ea1cdSQi Zhang 	fdir_fltr_ctx.comp_report = input->comp_report;
7041f7ea1cdSQi Zhang 	fdir_fltr_ctx.fdid_prio = input->fdid_prio;
705cac2a27cSHenry Tieman 	fdir_fltr_ctx.desc_prof = 1;
706cac2a27cSHenry Tieman 	fdir_fltr_ctx.desc_prof_prio = 3;
707cac2a27cSHenry Tieman 	ice_set_fd_desc_val(&fdir_fltr_ctx, fdesc);
708cac2a27cSHenry Tieman }
709cac2a27cSHenry Tieman 
710148beb61SHenry Tieman /**
711148beb61SHenry Tieman  * ice_alloc_fd_res_cntr - obtain counter resource for FD type
712148beb61SHenry Tieman  * @hw: pointer to the hardware structure
713148beb61SHenry Tieman  * @cntr_id: returns counter index
714148beb61SHenry Tieman  */
ice_alloc_fd_res_cntr(struct ice_hw * hw,u16 * cntr_id)7155e24d598STony Nguyen int ice_alloc_fd_res_cntr(struct ice_hw *hw, u16 *cntr_id)
716148beb61SHenry Tieman {
717148beb61SHenry Tieman 	return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_COUNTER_BLOCK,
718148beb61SHenry Tieman 				  ICE_AQC_RES_TYPE_FLAG_DEDICATED, 1, cntr_id);
719148beb61SHenry Tieman }
720148beb61SHenry Tieman 
721148beb61SHenry Tieman /**
722148beb61SHenry Tieman  * ice_free_fd_res_cntr - Free counter resource for FD type
723148beb61SHenry Tieman  * @hw: pointer to the hardware structure
724148beb61SHenry Tieman  * @cntr_id: counter index to be freed
725148beb61SHenry Tieman  */
ice_free_fd_res_cntr(struct ice_hw * hw,u16 cntr_id)7265e24d598STony Nguyen int ice_free_fd_res_cntr(struct ice_hw *hw, u16 cntr_id)
727148beb61SHenry Tieman {
728148beb61SHenry Tieman 	return ice_free_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_COUNTER_BLOCK,
729148beb61SHenry Tieman 				 ICE_AQC_RES_TYPE_FLAG_DEDICATED, 1, cntr_id);
730148beb61SHenry Tieman }
731148beb61SHenry Tieman 
732148beb61SHenry Tieman /**
733148beb61SHenry Tieman  * ice_alloc_fd_guar_item - allocate resource for FD guaranteed entries
734148beb61SHenry Tieman  * @hw: pointer to the hardware structure
735148beb61SHenry Tieman  * @cntr_id: returns counter index
736148beb61SHenry Tieman  * @num_fltr: number of filter entries to be allocated
737148beb61SHenry Tieman  */
ice_alloc_fd_guar_item(struct ice_hw * hw,u16 * cntr_id,u16 num_fltr)738*5518ac2aSTony Nguyen int ice_alloc_fd_guar_item(struct ice_hw *hw, u16 *cntr_id, u16 num_fltr)
739148beb61SHenry Tieman {
740148beb61SHenry Tieman 	return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_GUARANTEED_ENTRIES,
741148beb61SHenry Tieman 				  ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr,
742148beb61SHenry Tieman 				  cntr_id);
743148beb61SHenry Tieman }
744148beb61SHenry Tieman 
745148beb61SHenry Tieman /**
746148beb61SHenry Tieman  * ice_alloc_fd_shrd_item - allocate resource for flow director shared entries
747148beb61SHenry Tieman  * @hw: pointer to the hardware structure
748148beb61SHenry Tieman  * @cntr_id: returns counter index
749148beb61SHenry Tieman  * @num_fltr: number of filter entries to be allocated
750148beb61SHenry Tieman  */
ice_alloc_fd_shrd_item(struct ice_hw * hw,u16 * cntr_id,u16 num_fltr)751*5518ac2aSTony Nguyen int ice_alloc_fd_shrd_item(struct ice_hw *hw, u16 *cntr_id, u16 num_fltr)
752148beb61SHenry Tieman {
753148beb61SHenry Tieman 	return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_SHARED_ENTRIES,
754148beb61SHenry Tieman 				  ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr,
755148beb61SHenry Tieman 				  cntr_id);
756148beb61SHenry Tieman }
7574ab95646SHenry Tieman 
7584ab95646SHenry Tieman /**
7594ab95646SHenry Tieman  * ice_get_fdir_cnt_all - get the number of Flow Director filters
7604ab95646SHenry Tieman  * @hw: hardware data structure
7614ab95646SHenry Tieman  *
7624ab95646SHenry Tieman  * Returns the number of filters available on device
7634ab95646SHenry Tieman  */
ice_get_fdir_cnt_all(struct ice_hw * hw)7644ab95646SHenry Tieman int ice_get_fdir_cnt_all(struct ice_hw *hw)
7654ab95646SHenry Tieman {
7664ab95646SHenry Tieman 	return hw->func_caps.fd_fltr_guar + hw->func_caps.fd_fltr_best_effort;
7674ab95646SHenry Tieman }
7684ab95646SHenry Tieman 
7694ab95646SHenry Tieman /**
770165d80d6SHenry Tieman  * ice_pkt_insert_ipv6_addr - insert a be32 IPv6 address into a memory buffer
771165d80d6SHenry Tieman  * @pkt: packet buffer
772165d80d6SHenry Tieman  * @offset: offset into buffer
773165d80d6SHenry Tieman  * @addr: IPv6 address to convert and insert into pkt at offset
774165d80d6SHenry Tieman  */
ice_pkt_insert_ipv6_addr(u8 * pkt,int offset,__be32 * addr)775165d80d6SHenry Tieman static void ice_pkt_insert_ipv6_addr(u8 *pkt, int offset, __be32 *addr)
776165d80d6SHenry Tieman {
777165d80d6SHenry Tieman 	int idx;
778165d80d6SHenry Tieman 
779165d80d6SHenry Tieman 	for (idx = 0; idx < ICE_IPV6_ADDR_LEN_AS_U32; idx++)
780165d80d6SHenry Tieman 		memcpy(pkt + offset + idx * sizeof(*addr), &addr[idx],
781165d80d6SHenry Tieman 		       sizeof(*addr));
782165d80d6SHenry Tieman }
783165d80d6SHenry Tieman 
784165d80d6SHenry Tieman /**
785ef9e4cc5SQi Zhang  * ice_pkt_insert_u6_qfi - insert a u6 value QFI into a memory buffer for GTPU
786ef9e4cc5SQi Zhang  * @pkt: packet buffer
787ef9e4cc5SQi Zhang  * @offset: offset into buffer
788ef9e4cc5SQi Zhang  * @data: 8 bit value to convert and insert into pkt at offset
789ef9e4cc5SQi Zhang  *
790ef9e4cc5SQi Zhang  * This function is designed for inserting QFI (6 bits) for GTPU.
791ef9e4cc5SQi Zhang  */
ice_pkt_insert_u6_qfi(u8 * pkt,int offset,u8 data)792ef9e4cc5SQi Zhang static void ice_pkt_insert_u6_qfi(u8 *pkt, int offset, u8 data)
793ef9e4cc5SQi Zhang {
794ef9e4cc5SQi Zhang 	u8 ret;
795ef9e4cc5SQi Zhang 
796ef9e4cc5SQi Zhang 	ret = (data & 0x3F) + (*(pkt + offset) & 0xC0);
797ef9e4cc5SQi Zhang 	memcpy(pkt + offset, &ret, sizeof(ret));
798ef9e4cc5SQi Zhang }
799ef9e4cc5SQi Zhang 
800ef9e4cc5SQi Zhang /**
801b199dddbSQi Zhang  * ice_pkt_insert_u8 - insert a u8 value into a memory buffer.
802b199dddbSQi Zhang  * @pkt: packet buffer
803b199dddbSQi Zhang  * @offset: offset into buffer
804b199dddbSQi Zhang  * @data: 8 bit value to convert and insert into pkt at offset
805b199dddbSQi Zhang  */
ice_pkt_insert_u8(u8 * pkt,int offset,u8 data)806b199dddbSQi Zhang static void ice_pkt_insert_u8(u8 *pkt, int offset, u8 data)
807b199dddbSQi Zhang {
808b199dddbSQi Zhang 	memcpy(pkt + offset, &data, sizeof(data));
809b199dddbSQi Zhang }
810b199dddbSQi Zhang 
811b199dddbSQi Zhang /**
812b199dddbSQi Zhang  * ice_pkt_insert_u8_tc - insert a u8 value into a memory buffer for TC ipv6.
813b199dddbSQi Zhang  * @pkt: packet buffer
814b199dddbSQi Zhang  * @offset: offset into buffer
815b199dddbSQi Zhang  * @data: 8 bit value to convert and insert into pkt at offset
816b199dddbSQi Zhang  *
817b199dddbSQi Zhang  * This function is designed for inserting Traffic Class (TC) for IPv6,
818b199dddbSQi Zhang  * since that TC is not aligned in number of bytes. Here we split it out
819b199dddbSQi Zhang  * into two part and fill each byte with data copy from pkt, then insert
820b199dddbSQi Zhang  * the two bytes data one by one.
821b199dddbSQi Zhang  */
ice_pkt_insert_u8_tc(u8 * pkt,int offset,u8 data)822b199dddbSQi Zhang static void ice_pkt_insert_u8_tc(u8 *pkt, int offset, u8 data)
823b199dddbSQi Zhang {
824b199dddbSQi Zhang 	u8 high, low;
825b199dddbSQi Zhang 
826b199dddbSQi Zhang 	high = (data >> 4) + (*(pkt + offset) & 0xF0);
827b199dddbSQi Zhang 	memcpy(pkt + offset, &high, sizeof(high));
828b199dddbSQi Zhang 
829b199dddbSQi Zhang 	low = (*(pkt + offset + 1) & 0x0F) + ((data & 0x0F) << 4);
830b199dddbSQi Zhang 	memcpy(pkt + offset + 1, &low, sizeof(low));
831b199dddbSQi Zhang }
832b199dddbSQi Zhang 
833b199dddbSQi Zhang /**
834cac2a27cSHenry Tieman  * ice_pkt_insert_u16 - insert a be16 value into a memory buffer
835cac2a27cSHenry Tieman  * @pkt: packet buffer
836cac2a27cSHenry Tieman  * @offset: offset into buffer
837cac2a27cSHenry Tieman  * @data: 16 bit value to convert and insert into pkt at offset
838cac2a27cSHenry Tieman  */
ice_pkt_insert_u16(u8 * pkt,int offset,__be16 data)839cac2a27cSHenry Tieman static void ice_pkt_insert_u16(u8 *pkt, int offset, __be16 data)
840cac2a27cSHenry Tieman {
841cac2a27cSHenry Tieman 	memcpy(pkt + offset, &data, sizeof(data));
842cac2a27cSHenry Tieman }
843cac2a27cSHenry Tieman 
844cac2a27cSHenry Tieman /**
845cac2a27cSHenry Tieman  * ice_pkt_insert_u32 - insert a be32 value into a memory buffer
846cac2a27cSHenry Tieman  * @pkt: packet buffer
847cac2a27cSHenry Tieman  * @offset: offset into buffer
848cac2a27cSHenry Tieman  * @data: 32 bit value to convert and insert into pkt at offset
849cac2a27cSHenry Tieman  */
ice_pkt_insert_u32(u8 * pkt,int offset,__be32 data)850cac2a27cSHenry Tieman static void ice_pkt_insert_u32(u8 *pkt, int offset, __be32 data)
851cac2a27cSHenry Tieman {
852cac2a27cSHenry Tieman 	memcpy(pkt + offset, &data, sizeof(data));
853cac2a27cSHenry Tieman }
854cac2a27cSHenry Tieman 
855cac2a27cSHenry Tieman /**
856390bd141SQi Zhang  * ice_pkt_insert_mac_addr - insert a MAC addr into a memory buffer.
857390bd141SQi Zhang  * @pkt: packet buffer
858390bd141SQi Zhang  * @addr: MAC address to convert and insert into pkt at offset
859390bd141SQi Zhang  */
ice_pkt_insert_mac_addr(u8 * pkt,u8 * addr)860390bd141SQi Zhang static void ice_pkt_insert_mac_addr(u8 *pkt, u8 *addr)
861390bd141SQi Zhang {
862390bd141SQi Zhang 	ether_addr_copy(pkt, addr);
863390bd141SQi Zhang }
864390bd141SQi Zhang 
865390bd141SQi Zhang /**
866cac2a27cSHenry Tieman  * ice_fdir_get_gen_prgm_pkt - generate a training packet
867cac2a27cSHenry Tieman  * @hw: pointer to the hardware structure
868cac2a27cSHenry Tieman  * @input: flow director filter data structure
869cac2a27cSHenry Tieman  * @pkt: pointer to return filter packet
870cac2a27cSHenry Tieman  * @frag: generate a fragment packet
871cac2a27cSHenry Tieman  * @tun: true implies generate a tunnel packet
872cac2a27cSHenry Tieman  */
8735e24d598STony Nguyen int
ice_fdir_get_gen_prgm_pkt(struct ice_hw * hw,struct ice_fdir_fltr * input,u8 * pkt,bool frag,bool tun)874cac2a27cSHenry Tieman ice_fdir_get_gen_prgm_pkt(struct ice_hw *hw, struct ice_fdir_fltr *input,
875cac2a27cSHenry Tieman 			  u8 *pkt, bool frag, bool tun)
876cac2a27cSHenry Tieman {
877cac2a27cSHenry Tieman 	enum ice_fltr_ptype flow;
878cac2a27cSHenry Tieman 	u16 tnl_port;
879cac2a27cSHenry Tieman 	u8 *loc;
880cac2a27cSHenry Tieman 	u16 idx;
881cac2a27cSHenry Tieman 
882cac2a27cSHenry Tieman 	if (input->flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER) {
883165d80d6SHenry Tieman 		switch (input->ip.v4.proto) {
884cac2a27cSHenry Tieman 		case IPPROTO_TCP:
885cac2a27cSHenry Tieman 			flow = ICE_FLTR_PTYPE_NONF_IPV4_TCP;
886cac2a27cSHenry Tieman 			break;
887cac2a27cSHenry Tieman 		case IPPROTO_UDP:
888cac2a27cSHenry Tieman 			flow = ICE_FLTR_PTYPE_NONF_IPV4_UDP;
889cac2a27cSHenry Tieman 			break;
890cac2a27cSHenry Tieman 		case IPPROTO_SCTP:
891cac2a27cSHenry Tieman 			flow = ICE_FLTR_PTYPE_NONF_IPV4_SCTP;
892cac2a27cSHenry Tieman 			break;
893b199dddbSQi Zhang 		default:
894cac2a27cSHenry Tieman 			flow = ICE_FLTR_PTYPE_NONF_IPV4_OTHER;
895cac2a27cSHenry Tieman 			break;
896cac2a27cSHenry Tieman 		}
897165d80d6SHenry Tieman 	} else if (input->flow_type == ICE_FLTR_PTYPE_NONF_IPV6_OTHER) {
898165d80d6SHenry Tieman 		switch (input->ip.v6.proto) {
899165d80d6SHenry Tieman 		case IPPROTO_TCP:
900165d80d6SHenry Tieman 			flow = ICE_FLTR_PTYPE_NONF_IPV6_TCP;
901165d80d6SHenry Tieman 			break;
902165d80d6SHenry Tieman 		case IPPROTO_UDP:
903165d80d6SHenry Tieman 			flow = ICE_FLTR_PTYPE_NONF_IPV6_UDP;
904165d80d6SHenry Tieman 			break;
905165d80d6SHenry Tieman 		case IPPROTO_SCTP:
906165d80d6SHenry Tieman 			flow = ICE_FLTR_PTYPE_NONF_IPV6_SCTP;
907165d80d6SHenry Tieman 			break;
908b199dddbSQi Zhang 		default:
909165d80d6SHenry Tieman 			flow = ICE_FLTR_PTYPE_NONF_IPV6_OTHER;
910165d80d6SHenry Tieman 			break;
911165d80d6SHenry Tieman 		}
912cac2a27cSHenry Tieman 	} else {
913cac2a27cSHenry Tieman 		flow = input->flow_type;
914cac2a27cSHenry Tieman 	}
915cac2a27cSHenry Tieman 
916cac2a27cSHenry Tieman 	for (idx = 0; idx < ICE_FDIR_NUM_PKT; idx++)
917cac2a27cSHenry Tieman 		if (ice_fdir_pkt[idx].flow == flow)
918cac2a27cSHenry Tieman 			break;
919cac2a27cSHenry Tieman 	if (idx == ICE_FDIR_NUM_PKT)
920d54699e2STony Nguyen 		return -EINVAL;
921cac2a27cSHenry Tieman 	if (!tun) {
922cac2a27cSHenry Tieman 		memcpy(pkt, ice_fdir_pkt[idx].pkt, ice_fdir_pkt[idx].pkt_len);
923cac2a27cSHenry Tieman 		loc = pkt;
924cac2a27cSHenry Tieman 	} else {
925de6acd1cSMichal Swiatkowski 		if (!ice_get_open_tunnel_port(hw, &tnl_port, TNL_ALL))
926d54699e2STony Nguyen 			return -ENOENT;
927cac2a27cSHenry Tieman 		if (!ice_fdir_pkt[idx].tun_pkt)
928d54699e2STony Nguyen 			return -EINVAL;
929cac2a27cSHenry Tieman 		memcpy(pkt, ice_fdir_pkt[idx].tun_pkt,
930cac2a27cSHenry Tieman 		       ice_fdir_pkt[idx].tun_pkt_len);
931cac2a27cSHenry Tieman 		ice_pkt_insert_u16(pkt, ICE_IPV4_UDP_DST_PORT_OFFSET,
932cac2a27cSHenry Tieman 				   htons(tnl_port));
933cac2a27cSHenry Tieman 		loc = &pkt[ICE_FDIR_TUN_PKT_OFF];
934cac2a27cSHenry Tieman 	}
935cac2a27cSHenry Tieman 
936cac2a27cSHenry Tieman 	/* Reverse the src and dst, since the HW expects them to be from Tx
937cac2a27cSHenry Tieman 	 * perspective. The input from user is from Rx filter perspective.
938cac2a27cSHenry Tieman 	 */
939cac2a27cSHenry Tieman 	switch (flow) {
940cac2a27cSHenry Tieman 	case ICE_FLTR_PTYPE_NONF_IPV4_TCP:
941cac2a27cSHenry Tieman 		ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
942165d80d6SHenry Tieman 				   input->ip.v4.src_ip);
943cac2a27cSHenry Tieman 		ice_pkt_insert_u16(loc, ICE_IPV4_TCP_DST_PORT_OFFSET,
944165d80d6SHenry Tieman 				   input->ip.v4.src_port);
945cac2a27cSHenry Tieman 		ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
946165d80d6SHenry Tieman 				   input->ip.v4.dst_ip);
947cac2a27cSHenry Tieman 		ice_pkt_insert_u16(loc, ICE_IPV4_TCP_SRC_PORT_OFFSET,
948165d80d6SHenry Tieman 				   input->ip.v4.dst_port);
949b199dddbSQi Zhang 		ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
950b199dddbSQi Zhang 		ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
951390bd141SQi Zhang 		ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
952cac2a27cSHenry Tieman 		if (frag)
953b37e4e94SJeff Guo 			loc[20] = ICE_FDIR_IPV4_PKT_FLAG_MF;
954cac2a27cSHenry Tieman 		break;
955cac2a27cSHenry Tieman 	case ICE_FLTR_PTYPE_NONF_IPV4_UDP:
956cac2a27cSHenry Tieman 		ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
957165d80d6SHenry Tieman 				   input->ip.v4.src_ip);
958cac2a27cSHenry Tieman 		ice_pkt_insert_u16(loc, ICE_IPV4_UDP_DST_PORT_OFFSET,
959165d80d6SHenry Tieman 				   input->ip.v4.src_port);
960cac2a27cSHenry Tieman 		ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
961165d80d6SHenry Tieman 				   input->ip.v4.dst_ip);
962cac2a27cSHenry Tieman 		ice_pkt_insert_u16(loc, ICE_IPV4_UDP_SRC_PORT_OFFSET,
963165d80d6SHenry Tieman 				   input->ip.v4.dst_port);
964b199dddbSQi Zhang 		ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
965b199dddbSQi Zhang 		ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
966390bd141SQi Zhang 		ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
967390bd141SQi Zhang 		ice_pkt_insert_mac_addr(loc + ETH_ALEN,
968390bd141SQi Zhang 					input->ext_data.src_mac);
969cac2a27cSHenry Tieman 		break;
970cac2a27cSHenry Tieman 	case ICE_FLTR_PTYPE_NONF_IPV4_SCTP:
971cac2a27cSHenry Tieman 		ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
972165d80d6SHenry Tieman 				   input->ip.v4.src_ip);
973cac2a27cSHenry Tieman 		ice_pkt_insert_u16(loc, ICE_IPV4_SCTP_DST_PORT_OFFSET,
974165d80d6SHenry Tieman 				   input->ip.v4.src_port);
975cac2a27cSHenry Tieman 		ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
976165d80d6SHenry Tieman 				   input->ip.v4.dst_ip);
977cac2a27cSHenry Tieman 		ice_pkt_insert_u16(loc, ICE_IPV4_SCTP_SRC_PORT_OFFSET,
978165d80d6SHenry Tieman 				   input->ip.v4.dst_port);
979b199dddbSQi Zhang 		ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
980b199dddbSQi Zhang 		ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
981390bd141SQi Zhang 		ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
982cac2a27cSHenry Tieman 		break;
983cac2a27cSHenry Tieman 	case ICE_FLTR_PTYPE_NONF_IPV4_OTHER:
984cac2a27cSHenry Tieman 		ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
985165d80d6SHenry Tieman 				   input->ip.v4.src_ip);
986cac2a27cSHenry Tieman 		ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
987165d80d6SHenry Tieman 				   input->ip.v4.dst_ip);
988b199dddbSQi Zhang 		ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
989b199dddbSQi Zhang 		ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
990b199dddbSQi Zhang 		ice_pkt_insert_u8(loc, ICE_IPV4_PROTO_OFFSET,
991b199dddbSQi Zhang 				  input->ip.v4.proto);
992390bd141SQi Zhang 		ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
993cac2a27cSHenry Tieman 		break;
994ef9e4cc5SQi Zhang 	case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_UDP:
995ef9e4cc5SQi Zhang 	case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_TCP:
996ef9e4cc5SQi Zhang 	case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_ICMP:
997ef9e4cc5SQi Zhang 	case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_OTHER:
998ef9e4cc5SQi Zhang 		ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
999ef9e4cc5SQi Zhang 				   input->ip.v4.src_ip);
1000ef9e4cc5SQi Zhang 		ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1001ef9e4cc5SQi Zhang 				   input->ip.v4.dst_ip);
1002ef9e4cc5SQi Zhang 		ice_pkt_insert_u32(loc, ICE_IPV4_GTPU_TEID_OFFSET,
1003ef9e4cc5SQi Zhang 				   input->gtpu_data.teid);
1004ef9e4cc5SQi Zhang 		ice_pkt_insert_u6_qfi(loc, ICE_IPV4_GTPU_QFI_OFFSET,
1005ef9e4cc5SQi Zhang 				      input->gtpu_data.qfi);
1006ef9e4cc5SQi Zhang 		break;
1007213528feSQi Zhang 	case ICE_FLTR_PTYPE_NONF_IPV4_L2TPV3:
1008213528feSQi Zhang 		ice_pkt_insert_u32(loc, ICE_IPV4_L2TPV3_SESS_ID_OFFSET,
1009213528feSQi Zhang 				   input->l2tpv3_data.session_id);
1010213528feSQi Zhang 		break;
1011213528feSQi Zhang 	case ICE_FLTR_PTYPE_NONF_IPV6_L2TPV3:
1012213528feSQi Zhang 		ice_pkt_insert_u32(loc, ICE_IPV6_L2TPV3_SESS_ID_OFFSET,
1013213528feSQi Zhang 				   input->l2tpv3_data.session_id);
1014213528feSQi Zhang 		break;
1015213528feSQi Zhang 	case ICE_FLTR_PTYPE_NONF_IPV4_ESP:
1016213528feSQi Zhang 		ice_pkt_insert_u32(loc, ICE_IPV4_ESP_SPI_OFFSET,
1017213528feSQi Zhang 				   input->ip.v4.sec_parm_idx);
1018213528feSQi Zhang 		break;
1019213528feSQi Zhang 	case ICE_FLTR_PTYPE_NONF_IPV6_ESP:
1020213528feSQi Zhang 		ice_pkt_insert_u32(loc, ICE_IPV6_ESP_SPI_OFFSET,
1021213528feSQi Zhang 				   input->ip.v6.sec_parm_idx);
1022213528feSQi Zhang 		break;
1023213528feSQi Zhang 	case ICE_FLTR_PTYPE_NONF_IPV4_AH:
1024213528feSQi Zhang 		ice_pkt_insert_u32(loc, ICE_IPV4_AH_SPI_OFFSET,
1025213528feSQi Zhang 				   input->ip.v4.sec_parm_idx);
1026213528feSQi Zhang 		break;
1027213528feSQi Zhang 	case ICE_FLTR_PTYPE_NONF_IPV6_AH:
1028213528feSQi Zhang 		ice_pkt_insert_u32(loc, ICE_IPV6_AH_SPI_OFFSET,
1029213528feSQi Zhang 				   input->ip.v6.sec_parm_idx);
1030213528feSQi Zhang 		break;
1031213528feSQi Zhang 	case ICE_FLTR_PTYPE_NONF_IPV4_NAT_T_ESP:
1032213528feSQi Zhang 		ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1033213528feSQi Zhang 				   input->ip.v4.src_ip);
1034213528feSQi Zhang 		ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1035213528feSQi Zhang 				   input->ip.v4.dst_ip);
1036213528feSQi Zhang 		ice_pkt_insert_u32(loc, ICE_IPV4_NAT_T_ESP_SPI_OFFSET,
1037213528feSQi Zhang 				   input->ip.v4.sec_parm_idx);
1038213528feSQi Zhang 		break;
1039213528feSQi Zhang 	case ICE_FLTR_PTYPE_NONF_IPV6_NAT_T_ESP:
1040213528feSQi Zhang 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1041213528feSQi Zhang 					 input->ip.v6.src_ip);
1042213528feSQi Zhang 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1043213528feSQi Zhang 					 input->ip.v6.dst_ip);
1044213528feSQi Zhang 		ice_pkt_insert_u32(loc, ICE_IPV6_NAT_T_ESP_SPI_OFFSET,
1045213528feSQi Zhang 				   input->ip.v6.sec_parm_idx);
1046213528feSQi Zhang 		break;
1047213528feSQi Zhang 	case ICE_FLTR_PTYPE_NONF_IPV4_PFCP_NODE:
1048213528feSQi Zhang 	case ICE_FLTR_PTYPE_NONF_IPV4_PFCP_SESSION:
1049213528feSQi Zhang 		ice_pkt_insert_u16(loc, ICE_IPV4_UDP_SRC_PORT_OFFSET,
1050213528feSQi Zhang 				   input->ip.v4.dst_port);
1051213528feSQi Zhang 		break;
1052213528feSQi Zhang 	case ICE_FLTR_PTYPE_NONF_IPV6_PFCP_NODE:
1053213528feSQi Zhang 	case ICE_FLTR_PTYPE_NONF_IPV6_PFCP_SESSION:
1054213528feSQi Zhang 		ice_pkt_insert_u16(loc, ICE_IPV6_UDP_SRC_PORT_OFFSET,
1055213528feSQi Zhang 				   input->ip.v6.dst_port);
1056213528feSQi Zhang 		break;
105721606584SQi Zhang 	case ICE_FLTR_PTYPE_NON_IP_L2:
105821606584SQi Zhang 		ice_pkt_insert_u16(loc, ICE_MAC_ETHTYPE_OFFSET,
105921606584SQi Zhang 				   input->ext_data.ether_type);
106021606584SQi Zhang 		break;
1061165d80d6SHenry Tieman 	case ICE_FLTR_PTYPE_NONF_IPV6_TCP:
1062165d80d6SHenry Tieman 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1063165d80d6SHenry Tieman 					 input->ip.v6.src_ip);
1064165d80d6SHenry Tieman 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1065165d80d6SHenry Tieman 					 input->ip.v6.dst_ip);
1066165d80d6SHenry Tieman 		ice_pkt_insert_u16(loc, ICE_IPV6_TCP_DST_PORT_OFFSET,
1067165d80d6SHenry Tieman 				   input->ip.v6.src_port);
1068165d80d6SHenry Tieman 		ice_pkt_insert_u16(loc, ICE_IPV6_TCP_SRC_PORT_OFFSET,
1069165d80d6SHenry Tieman 				   input->ip.v6.dst_port);
1070b199dddbSQi Zhang 		ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
1071b199dddbSQi Zhang 		ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
1072390bd141SQi Zhang 		ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1073165d80d6SHenry Tieman 		break;
1074165d80d6SHenry Tieman 	case ICE_FLTR_PTYPE_NONF_IPV6_UDP:
1075165d80d6SHenry Tieman 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1076165d80d6SHenry Tieman 					 input->ip.v6.src_ip);
1077165d80d6SHenry Tieman 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1078165d80d6SHenry Tieman 					 input->ip.v6.dst_ip);
1079165d80d6SHenry Tieman 		ice_pkt_insert_u16(loc, ICE_IPV6_UDP_DST_PORT_OFFSET,
1080165d80d6SHenry Tieman 				   input->ip.v6.src_port);
1081165d80d6SHenry Tieman 		ice_pkt_insert_u16(loc, ICE_IPV6_UDP_SRC_PORT_OFFSET,
1082165d80d6SHenry Tieman 				   input->ip.v6.dst_port);
1083b199dddbSQi Zhang 		ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
1084b199dddbSQi Zhang 		ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
1085390bd141SQi Zhang 		ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1086165d80d6SHenry Tieman 		break;
1087165d80d6SHenry Tieman 	case ICE_FLTR_PTYPE_NONF_IPV6_SCTP:
1088165d80d6SHenry Tieman 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1089165d80d6SHenry Tieman 					 input->ip.v6.src_ip);
1090165d80d6SHenry Tieman 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1091165d80d6SHenry Tieman 					 input->ip.v6.dst_ip);
1092165d80d6SHenry Tieman 		ice_pkt_insert_u16(loc, ICE_IPV6_SCTP_DST_PORT_OFFSET,
1093165d80d6SHenry Tieman 				   input->ip.v6.src_port);
1094165d80d6SHenry Tieman 		ice_pkt_insert_u16(loc, ICE_IPV6_SCTP_SRC_PORT_OFFSET,
1095165d80d6SHenry Tieman 				   input->ip.v6.dst_port);
1096b199dddbSQi Zhang 		ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
1097b199dddbSQi Zhang 		ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
1098390bd141SQi Zhang 		ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1099165d80d6SHenry Tieman 		break;
1100165d80d6SHenry Tieman 	case ICE_FLTR_PTYPE_NONF_IPV6_OTHER:
1101165d80d6SHenry Tieman 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1102165d80d6SHenry Tieman 					 input->ip.v6.src_ip);
1103165d80d6SHenry Tieman 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1104165d80d6SHenry Tieman 					 input->ip.v6.dst_ip);
1105b199dddbSQi Zhang 		ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
1106b199dddbSQi Zhang 		ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
1107b199dddbSQi Zhang 		ice_pkt_insert_u8(loc, ICE_IPV6_PROTO_OFFSET,
1108b199dddbSQi Zhang 				  input->ip.v6.proto);
1109390bd141SQi Zhang 		ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1110165d80d6SHenry Tieman 		break;
1111cac2a27cSHenry Tieman 	default:
1112d54699e2STony Nguyen 		return -EINVAL;
1113cac2a27cSHenry Tieman 	}
1114cac2a27cSHenry Tieman 
11152c57ffcbSHenry Tieman 	if (input->flex_fltr)
11162c57ffcbSHenry Tieman 		ice_pkt_insert_u16(loc, input->flex_offset, input->flex_word);
11172c57ffcbSHenry Tieman 
1118cac2a27cSHenry Tieman 	return 0;
1119cac2a27cSHenry Tieman }
1120cac2a27cSHenry Tieman 
1121cac2a27cSHenry Tieman /**
1122cac2a27cSHenry Tieman  * ice_fdir_has_frag - does flow type have 2 ptypes
1123cac2a27cSHenry Tieman  * @flow: flow ptype
1124cac2a27cSHenry Tieman  *
1125cac2a27cSHenry Tieman  * returns true is there is a fragment packet for this ptype
1126cac2a27cSHenry Tieman  */
ice_fdir_has_frag(enum ice_fltr_ptype flow)1127cac2a27cSHenry Tieman bool ice_fdir_has_frag(enum ice_fltr_ptype flow)
1128cac2a27cSHenry Tieman {
1129cac2a27cSHenry Tieman 	if (flow == ICE_FLTR_PTYPE_NONF_IPV4_OTHER)
1130cac2a27cSHenry Tieman 		return true;
1131cac2a27cSHenry Tieman 	else
1132cac2a27cSHenry Tieman 		return false;
1133cac2a27cSHenry Tieman }
1134cac2a27cSHenry Tieman 
1135cac2a27cSHenry Tieman /**
1136ef860480STony Nguyen  * ice_fdir_find_fltr_by_idx - find filter with idx
11374ab95646SHenry Tieman  * @hw: pointer to hardware structure
11384ab95646SHenry Tieman  * @fltr_idx: index to find.
11394ab95646SHenry Tieman  *
11404ab95646SHenry Tieman  * Returns pointer to filter if found or null
11414ab95646SHenry Tieman  */
11424ab95646SHenry Tieman struct ice_fdir_fltr *
ice_fdir_find_fltr_by_idx(struct ice_hw * hw,u32 fltr_idx)11434ab95646SHenry Tieman ice_fdir_find_fltr_by_idx(struct ice_hw *hw, u32 fltr_idx)
11444ab95646SHenry Tieman {
11454ab95646SHenry Tieman 	struct ice_fdir_fltr *rule;
11464ab95646SHenry Tieman 
11474ab95646SHenry Tieman 	list_for_each_entry(rule, &hw->fdir_list_head, fltr_node) {
11484ab95646SHenry Tieman 		/* rule ID found in the list */
11494ab95646SHenry Tieman 		if (fltr_idx == rule->fltr_id)
11504ab95646SHenry Tieman 			return rule;
11514ab95646SHenry Tieman 		if (fltr_idx < rule->fltr_id)
11524ab95646SHenry Tieman 			break;
11534ab95646SHenry Tieman 	}
11544ab95646SHenry Tieman 	return NULL;
11554ab95646SHenry Tieman }
1156cac2a27cSHenry Tieman 
1157cac2a27cSHenry Tieman /**
1158cac2a27cSHenry Tieman  * ice_fdir_list_add_fltr - add a new node to the flow director filter list
1159cac2a27cSHenry Tieman  * @hw: hardware structure
1160cac2a27cSHenry Tieman  * @fltr: filter node to add to structure
1161cac2a27cSHenry Tieman  */
ice_fdir_list_add_fltr(struct ice_hw * hw,struct ice_fdir_fltr * fltr)1162cac2a27cSHenry Tieman void ice_fdir_list_add_fltr(struct ice_hw *hw, struct ice_fdir_fltr *fltr)
1163cac2a27cSHenry Tieman {
1164cac2a27cSHenry Tieman 	struct ice_fdir_fltr *rule, *parent = NULL;
1165cac2a27cSHenry Tieman 
1166cac2a27cSHenry Tieman 	list_for_each_entry(rule, &hw->fdir_list_head, fltr_node) {
1167cac2a27cSHenry Tieman 		/* rule ID found or pass its spot in the list */
1168cac2a27cSHenry Tieman 		if (rule->fltr_id >= fltr->fltr_id)
1169cac2a27cSHenry Tieman 			break;
1170cac2a27cSHenry Tieman 		parent = rule;
1171cac2a27cSHenry Tieman 	}
1172cac2a27cSHenry Tieman 
1173cac2a27cSHenry Tieman 	if (parent)
1174cac2a27cSHenry Tieman 		list_add(&fltr->fltr_node, &parent->fltr_node);
1175cac2a27cSHenry Tieman 	else
1176cac2a27cSHenry Tieman 		list_add(&fltr->fltr_node, &hw->fdir_list_head);
1177cac2a27cSHenry Tieman }
1178cac2a27cSHenry Tieman 
1179cac2a27cSHenry Tieman /**
1180cac2a27cSHenry Tieman  * ice_fdir_update_cntrs - increment / decrement filter counter
1181cac2a27cSHenry Tieman  * @hw: pointer to hardware structure
1182cac2a27cSHenry Tieman  * @flow: filter flow type
1183cac2a27cSHenry Tieman  * @add: true implies filters added
1184cac2a27cSHenry Tieman  */
1185cac2a27cSHenry Tieman void
ice_fdir_update_cntrs(struct ice_hw * hw,enum ice_fltr_ptype flow,bool add)1186cac2a27cSHenry Tieman ice_fdir_update_cntrs(struct ice_hw *hw, enum ice_fltr_ptype flow, bool add)
1187cac2a27cSHenry Tieman {
1188cac2a27cSHenry Tieman 	int incr;
1189cac2a27cSHenry Tieman 
1190cac2a27cSHenry Tieman 	incr = add ? 1 : -1;
1191cac2a27cSHenry Tieman 	hw->fdir_active_fltr += incr;
1192cac2a27cSHenry Tieman 
1193cac2a27cSHenry Tieman 	if (flow == ICE_FLTR_PTYPE_NONF_NONE || flow >= ICE_FLTR_PTYPE_MAX)
1194cac2a27cSHenry Tieman 		ice_debug(hw, ICE_DBG_SW, "Unknown filter type %d\n", flow);
1195cac2a27cSHenry Tieman 	else
1196cac2a27cSHenry Tieman 		hw->fdir_fltr_cnt[flow] += incr;
1197cac2a27cSHenry Tieman }
1198cac2a27cSHenry Tieman 
1199cac2a27cSHenry Tieman /**
1200165d80d6SHenry Tieman  * ice_cmp_ipv6_addr - compare 2 IP v6 addresses
1201165d80d6SHenry Tieman  * @a: IP v6 address
1202165d80d6SHenry Tieman  * @b: IP v6 address
1203165d80d6SHenry Tieman  *
1204165d80d6SHenry Tieman  * Returns 0 on equal, returns non-0 if different
1205165d80d6SHenry Tieman  */
ice_cmp_ipv6_addr(__be32 * a,__be32 * b)1206165d80d6SHenry Tieman static int ice_cmp_ipv6_addr(__be32 *a, __be32 *b)
1207165d80d6SHenry Tieman {
1208165d80d6SHenry Tieman 	return memcmp(a, b, 4 * sizeof(__be32));
1209165d80d6SHenry Tieman }
1210165d80d6SHenry Tieman 
1211165d80d6SHenry Tieman /**
1212cac2a27cSHenry Tieman  * ice_fdir_comp_rules - compare 2 filters
1213cac2a27cSHenry Tieman  * @a: a Flow Director filter data structure
1214cac2a27cSHenry Tieman  * @b: a Flow Director filter data structure
1215165d80d6SHenry Tieman  * @v6: bool true if v6 filter
1216cac2a27cSHenry Tieman  *
1217cac2a27cSHenry Tieman  * Returns true if the filters match
1218cac2a27cSHenry Tieman  */
1219cac2a27cSHenry Tieman static bool
ice_fdir_comp_rules(struct ice_fdir_fltr * a,struct ice_fdir_fltr * b,bool v6)1220165d80d6SHenry Tieman ice_fdir_comp_rules(struct ice_fdir_fltr *a,  struct ice_fdir_fltr *b, bool v6)
1221cac2a27cSHenry Tieman {
1222cac2a27cSHenry Tieman 	enum ice_fltr_ptype flow_type = a->flow_type;
1223cac2a27cSHenry Tieman 
1224cac2a27cSHenry Tieman 	/* The calling function already checks that the two filters have the
1225cac2a27cSHenry Tieman 	 * same flow_type.
1226cac2a27cSHenry Tieman 	 */
1227165d80d6SHenry Tieman 	if (!v6) {
1228cac2a27cSHenry Tieman 		if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_TCP ||
1229cac2a27cSHenry Tieman 		    flow_type == ICE_FLTR_PTYPE_NONF_IPV4_UDP ||
1230cac2a27cSHenry Tieman 		    flow_type == ICE_FLTR_PTYPE_NONF_IPV4_SCTP) {
1231165d80d6SHenry Tieman 			if (a->ip.v4.dst_ip == b->ip.v4.dst_ip &&
1232165d80d6SHenry Tieman 			    a->ip.v4.src_ip == b->ip.v4.src_ip &&
1233165d80d6SHenry Tieman 			    a->ip.v4.dst_port == b->ip.v4.dst_port &&
1234165d80d6SHenry Tieman 			    a->ip.v4.src_port == b->ip.v4.src_port)
1235cac2a27cSHenry Tieman 				return true;
1236cac2a27cSHenry Tieman 		} else if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER) {
1237165d80d6SHenry Tieman 			if (a->ip.v4.dst_ip == b->ip.v4.dst_ip &&
1238165d80d6SHenry Tieman 			    a->ip.v4.src_ip == b->ip.v4.src_ip &&
1239165d80d6SHenry Tieman 			    a->ip.v4.l4_header == b->ip.v4.l4_header &&
1240165d80d6SHenry Tieman 			    a->ip.v4.proto == b->ip.v4.proto &&
1241165d80d6SHenry Tieman 			    a->ip.v4.ip_ver == b->ip.v4.ip_ver &&
1242165d80d6SHenry Tieman 			    a->ip.v4.tos == b->ip.v4.tos)
1243cac2a27cSHenry Tieman 				return true;
1244cac2a27cSHenry Tieman 		}
1245165d80d6SHenry Tieman 	} else {
1246165d80d6SHenry Tieman 		if (flow_type == ICE_FLTR_PTYPE_NONF_IPV6_UDP ||
1247165d80d6SHenry Tieman 		    flow_type == ICE_FLTR_PTYPE_NONF_IPV6_TCP ||
1248165d80d6SHenry Tieman 		    flow_type == ICE_FLTR_PTYPE_NONF_IPV6_SCTP) {
1249165d80d6SHenry Tieman 			if (a->ip.v6.dst_port == b->ip.v6.dst_port &&
1250165d80d6SHenry Tieman 			    a->ip.v6.src_port == b->ip.v6.src_port &&
1251165d80d6SHenry Tieman 			    !ice_cmp_ipv6_addr(a->ip.v6.dst_ip,
1252165d80d6SHenry Tieman 					       b->ip.v6.dst_ip) &&
1253165d80d6SHenry Tieman 			    !ice_cmp_ipv6_addr(a->ip.v6.src_ip,
1254165d80d6SHenry Tieman 					       b->ip.v6.src_ip))
1255165d80d6SHenry Tieman 				return true;
1256165d80d6SHenry Tieman 		} else if (flow_type == ICE_FLTR_PTYPE_NONF_IPV6_OTHER) {
1257165d80d6SHenry Tieman 			if (a->ip.v6.dst_port == b->ip.v6.dst_port &&
1258165d80d6SHenry Tieman 			    a->ip.v6.src_port == b->ip.v6.src_port)
1259165d80d6SHenry Tieman 				return true;
1260165d80d6SHenry Tieman 		}
1261165d80d6SHenry Tieman 	}
1262cac2a27cSHenry Tieman 
1263cac2a27cSHenry Tieman 	return false;
1264cac2a27cSHenry Tieman }
1265cac2a27cSHenry Tieman 
1266cac2a27cSHenry Tieman /**
1267cac2a27cSHenry Tieman  * ice_fdir_is_dup_fltr - test if filter is already in list for PF
1268cac2a27cSHenry Tieman  * @hw: hardware data structure
1269cac2a27cSHenry Tieman  * @input: Flow Director filter data structure
1270cac2a27cSHenry Tieman  *
1271cac2a27cSHenry Tieman  * Returns true if the filter is found in the list
1272cac2a27cSHenry Tieman  */
ice_fdir_is_dup_fltr(struct ice_hw * hw,struct ice_fdir_fltr * input)1273cac2a27cSHenry Tieman bool ice_fdir_is_dup_fltr(struct ice_hw *hw, struct ice_fdir_fltr *input)
1274cac2a27cSHenry Tieman {
1275cac2a27cSHenry Tieman 	struct ice_fdir_fltr *rule;
1276cac2a27cSHenry Tieman 	bool ret = false;
1277cac2a27cSHenry Tieman 
1278cac2a27cSHenry Tieman 	list_for_each_entry(rule, &hw->fdir_list_head, fltr_node) {
1279cac2a27cSHenry Tieman 		enum ice_fltr_ptype flow_type;
1280cac2a27cSHenry Tieman 
1281cac2a27cSHenry Tieman 		if (rule->flow_type != input->flow_type)
1282cac2a27cSHenry Tieman 			continue;
1283cac2a27cSHenry Tieman 
1284cac2a27cSHenry Tieman 		flow_type = input->flow_type;
1285cac2a27cSHenry Tieman 		if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_TCP ||
1286cac2a27cSHenry Tieman 		    flow_type == ICE_FLTR_PTYPE_NONF_IPV4_UDP ||
1287cac2a27cSHenry Tieman 		    flow_type == ICE_FLTR_PTYPE_NONF_IPV4_SCTP ||
1288cac2a27cSHenry Tieman 		    flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER)
1289165d80d6SHenry Tieman 			ret = ice_fdir_comp_rules(rule, input, false);
1290165d80d6SHenry Tieman 		else
1291165d80d6SHenry Tieman 			ret = ice_fdir_comp_rules(rule, input, true);
1292cac2a27cSHenry Tieman 		if (ret) {
1293cac2a27cSHenry Tieman 			if (rule->fltr_id == input->fltr_id &&
1294cac2a27cSHenry Tieman 			    rule->q_index != input->q_index)
1295cac2a27cSHenry Tieman 				ret = false;
1296cac2a27cSHenry Tieman 			else
1297cac2a27cSHenry Tieman 				break;
1298cac2a27cSHenry Tieman 		}
1299cac2a27cSHenry Tieman 	}
1300cac2a27cSHenry Tieman 
1301cac2a27cSHenry Tieman 	return ret;
1302cac2a27cSHenry Tieman }
1303