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 
43165d80d6SHenry Tieman static const u8 ice_fdir_tcpv6_pkt[] = {
44165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
45165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
46165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x14, 0x06, 0x40, 0x00, 0x00,
47165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
48165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
49165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
50165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
51165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
52165d80d6SHenry Tieman 	0x00, 0x00, 0x50, 0x00, 0x20, 0x00, 0x00, 0x00,
53165d80d6SHenry Tieman 	0x00, 0x00,
54165d80d6SHenry Tieman };
55165d80d6SHenry Tieman 
56165d80d6SHenry Tieman static const u8 ice_fdir_udpv6_pkt[] = {
57165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
58165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
59165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x08, 0x11, 0x40, 0x00, 0x00,
60165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
61165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
62165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
63165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
64165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x08, 0x00, 0x00,
65165d80d6SHenry Tieman };
66165d80d6SHenry Tieman 
67165d80d6SHenry Tieman static const u8 ice_fdir_sctpv6_pkt[] = {
68165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
69165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
70165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x0C, 0x84, 0x40, 0x00, 0x00,
71165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
72165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
73165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
74165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
75165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
76165d80d6SHenry Tieman 	0x00, 0x00,
77165d80d6SHenry Tieman };
78165d80d6SHenry Tieman 
79165d80d6SHenry Tieman static const u8 ice_fdir_ipv6_pkt[] = {
80165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
81165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
82165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x3B, 0x40, 0x00, 0x00,
83165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
84165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
85165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
86165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
87165d80d6SHenry Tieman };
88165d80d6SHenry Tieman 
89cac2a27cSHenry Tieman static const u8 ice_fdir_tcp4_tun_pkt[] = {
90cac2a27cSHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
91cac2a27cSHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
92cac2a27cSHenry Tieman 	0x00, 0x5a, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
93cac2a27cSHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
94cac2a27cSHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
95cac2a27cSHenry Tieman 	0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
96cac2a27cSHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
97cac2a27cSHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
98cac2a27cSHenry Tieman 	0x45, 0x00, 0x00, 0x28, 0x00, 0x00, 0x40, 0x00,
99cac2a27cSHenry Tieman 	0x40, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
100cac2a27cSHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
101cac2a27cSHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
102cac2a27cSHenry Tieman 	0x50, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00,
103cac2a27cSHenry Tieman };
104cac2a27cSHenry Tieman 
105cac2a27cSHenry Tieman static const u8 ice_fdir_udp4_tun_pkt[] = {
106cac2a27cSHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
107cac2a27cSHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
108cac2a27cSHenry Tieman 	0x00, 0x4e, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
109cac2a27cSHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
110cac2a27cSHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
111cac2a27cSHenry Tieman 	0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
112cac2a27cSHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
113cac2a27cSHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
114cac2a27cSHenry Tieman 	0x45, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x40, 0x00,
115cac2a27cSHenry Tieman 	0x40, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
116cac2a27cSHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
117cac2a27cSHenry Tieman 	0x00, 0x00, 0x00, 0x00,
118cac2a27cSHenry Tieman };
119cac2a27cSHenry Tieman 
120cac2a27cSHenry Tieman static const u8 ice_fdir_sctp4_tun_pkt[] = {
121cac2a27cSHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
122cac2a27cSHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
123cac2a27cSHenry Tieman 	0x00, 0x52, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
124cac2a27cSHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
125cac2a27cSHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
126cac2a27cSHenry Tieman 	0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
127cac2a27cSHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
128cac2a27cSHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
129cac2a27cSHenry Tieman 	0x45, 0x00, 0x00, 0x20, 0x00, 0x01, 0x00, 0x00,
130cac2a27cSHenry Tieman 	0x40, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
131cac2a27cSHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
132cac2a27cSHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
133cac2a27cSHenry Tieman };
134cac2a27cSHenry Tieman 
135cac2a27cSHenry Tieman static const u8 ice_fdir_ip4_tun_pkt[] = {
136cac2a27cSHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
137cac2a27cSHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
138cac2a27cSHenry Tieman 	0x00, 0x46, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
139cac2a27cSHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
140cac2a27cSHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
141cac2a27cSHenry Tieman 	0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
142cac2a27cSHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
143cac2a27cSHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
144cac2a27cSHenry Tieman 	0x45, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00,
145cac2a27cSHenry Tieman 	0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
146cac2a27cSHenry Tieman 	0x00, 0x00, 0x00, 0x00,
147cac2a27cSHenry Tieman };
148cac2a27cSHenry Tieman 
149165d80d6SHenry Tieman static const u8 ice_fdir_tcp6_tun_pkt[] = {
150165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
151165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
152165d80d6SHenry Tieman 	0x00, 0x6e, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
153165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
154165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
155165d80d6SHenry Tieman 	0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
156165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
157165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd,
158165d80d6SHenry Tieman 	0x60, 0x00, 0x00, 0x00, 0x00, 0x14, 0x06, 0x40,
159165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
160165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
161165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
162165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
163165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
164165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x20, 0x00,
165165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00,
166165d80d6SHenry Tieman };
167165d80d6SHenry Tieman 
168165d80d6SHenry Tieman static const u8 ice_fdir_udp6_tun_pkt[] = {
169165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
170165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
171165d80d6SHenry Tieman 	0x00, 0x62, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
172165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
173165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
174165d80d6SHenry Tieman 	0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
175165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
176165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd,
177165d80d6SHenry Tieman 	0x60, 0x00, 0x00, 0x00, 0x00, 0x08, 0x11, 0x40,
178165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
179165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
180165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
181165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
182165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
183165d80d6SHenry Tieman };
184165d80d6SHenry Tieman 
185165d80d6SHenry Tieman static const u8 ice_fdir_sctp6_tun_pkt[] = {
186165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
187165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
188165d80d6SHenry Tieman 	0x00, 0x66, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
189165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
190165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
191165d80d6SHenry Tieman 	0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
192165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
193165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd,
194165d80d6SHenry Tieman 	0x60, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x84, 0x40,
195165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
196165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
197165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
198165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
199165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
200165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00,
201165d80d6SHenry Tieman };
202165d80d6SHenry Tieman 
203165d80d6SHenry Tieman static const u8 ice_fdir_ip6_tun_pkt[] = {
204165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
205165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
206165d80d6SHenry Tieman 	0x00, 0x5a, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
207165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
208165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
209165d80d6SHenry Tieman 	0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
210165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
211165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd,
212165d80d6SHenry Tieman 	0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3b, 0x40,
213165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
214165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
215165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
216165d80d6SHenry Tieman 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
217165d80d6SHenry Tieman };
218165d80d6SHenry Tieman 
219cac2a27cSHenry Tieman /* Flow Director no-op training packet table */
220cac2a27cSHenry Tieman static const struct ice_fdir_base_pkt ice_fdir_pkt[] = {
221cac2a27cSHenry Tieman 	{
222cac2a27cSHenry Tieman 		ICE_FLTR_PTYPE_NONF_IPV4_TCP,
223cac2a27cSHenry Tieman 		sizeof(ice_fdir_tcpv4_pkt), ice_fdir_tcpv4_pkt,
224cac2a27cSHenry Tieman 		sizeof(ice_fdir_tcp4_tun_pkt), ice_fdir_tcp4_tun_pkt,
225cac2a27cSHenry Tieman 	},
226cac2a27cSHenry Tieman 	{
227cac2a27cSHenry Tieman 		ICE_FLTR_PTYPE_NONF_IPV4_UDP,
228cac2a27cSHenry Tieman 		sizeof(ice_fdir_udpv4_pkt), ice_fdir_udpv4_pkt,
229cac2a27cSHenry Tieman 		sizeof(ice_fdir_udp4_tun_pkt), ice_fdir_udp4_tun_pkt,
230cac2a27cSHenry Tieman 	},
231cac2a27cSHenry Tieman 	{
232cac2a27cSHenry Tieman 		ICE_FLTR_PTYPE_NONF_IPV4_SCTP,
233cac2a27cSHenry Tieman 		sizeof(ice_fdir_sctpv4_pkt), ice_fdir_sctpv4_pkt,
234cac2a27cSHenry Tieman 		sizeof(ice_fdir_sctp4_tun_pkt), ice_fdir_sctp4_tun_pkt,
235cac2a27cSHenry Tieman 	},
236cac2a27cSHenry Tieman 	{
237cac2a27cSHenry Tieman 		ICE_FLTR_PTYPE_NONF_IPV4_OTHER,
238cac2a27cSHenry Tieman 		sizeof(ice_fdir_ipv4_pkt), ice_fdir_ipv4_pkt,
239cac2a27cSHenry Tieman 		sizeof(ice_fdir_ip4_tun_pkt), ice_fdir_ip4_tun_pkt,
240cac2a27cSHenry Tieman 	},
241165d80d6SHenry Tieman 	{
242165d80d6SHenry Tieman 		ICE_FLTR_PTYPE_NONF_IPV6_TCP,
243165d80d6SHenry Tieman 		sizeof(ice_fdir_tcpv6_pkt), ice_fdir_tcpv6_pkt,
244165d80d6SHenry Tieman 		sizeof(ice_fdir_tcp6_tun_pkt), ice_fdir_tcp6_tun_pkt,
245165d80d6SHenry Tieman 	},
246165d80d6SHenry Tieman 	{
247165d80d6SHenry Tieman 		ICE_FLTR_PTYPE_NONF_IPV6_UDP,
248165d80d6SHenry Tieman 		sizeof(ice_fdir_udpv6_pkt), ice_fdir_udpv6_pkt,
249165d80d6SHenry Tieman 		sizeof(ice_fdir_udp6_tun_pkt), ice_fdir_udp6_tun_pkt,
250165d80d6SHenry Tieman 	},
251165d80d6SHenry Tieman 	{
252165d80d6SHenry Tieman 		ICE_FLTR_PTYPE_NONF_IPV6_SCTP,
253165d80d6SHenry Tieman 		sizeof(ice_fdir_sctpv6_pkt), ice_fdir_sctpv6_pkt,
254165d80d6SHenry Tieman 		sizeof(ice_fdir_sctp6_tun_pkt), ice_fdir_sctp6_tun_pkt,
255165d80d6SHenry Tieman 	},
256165d80d6SHenry Tieman 	{
257165d80d6SHenry Tieman 		ICE_FLTR_PTYPE_NONF_IPV6_OTHER,
258165d80d6SHenry Tieman 		sizeof(ice_fdir_ipv6_pkt), ice_fdir_ipv6_pkt,
259165d80d6SHenry Tieman 		sizeof(ice_fdir_ip6_tun_pkt), ice_fdir_ip6_tun_pkt,
260165d80d6SHenry Tieman 	},
261cac2a27cSHenry Tieman };
262cac2a27cSHenry Tieman 
263cac2a27cSHenry Tieman #define ICE_FDIR_NUM_PKT ARRAY_SIZE(ice_fdir_pkt)
264cac2a27cSHenry Tieman 
265cac2a27cSHenry Tieman /**
266cac2a27cSHenry Tieman  * ice_set_dflt_val_fd_desc
267cac2a27cSHenry Tieman  * @fd_fltr_ctx: pointer to fd filter descriptor
268cac2a27cSHenry Tieman  */
269cac2a27cSHenry Tieman static void ice_set_dflt_val_fd_desc(struct ice_fd_fltr_desc_ctx *fd_fltr_ctx)
270cac2a27cSHenry Tieman {
271cac2a27cSHenry Tieman 	fd_fltr_ctx->comp_q = ICE_FXD_FLTR_QW0_COMP_Q_ZERO;
272cac2a27cSHenry Tieman 	fd_fltr_ctx->comp_report = ICE_FXD_FLTR_QW0_COMP_REPORT_SW_FAIL;
273cac2a27cSHenry Tieman 	fd_fltr_ctx->fd_space = ICE_FXD_FLTR_QW0_FD_SPACE_GUAR_BEST;
274cac2a27cSHenry Tieman 	fd_fltr_ctx->cnt_ena = ICE_FXD_FLTR_QW0_STAT_ENA_PKTS;
275cac2a27cSHenry Tieman 	fd_fltr_ctx->evict_ena = ICE_FXD_FLTR_QW0_EVICT_ENA_TRUE;
276cac2a27cSHenry Tieman 	fd_fltr_ctx->toq = ICE_FXD_FLTR_QW0_TO_Q_EQUALS_QINDEX;
277cac2a27cSHenry Tieman 	fd_fltr_ctx->toq_prio = ICE_FXD_FLTR_QW0_TO_Q_PRIO1;
278cac2a27cSHenry Tieman 	fd_fltr_ctx->dpu_recipe = ICE_FXD_FLTR_QW0_DPU_RECIPE_DFLT;
279cac2a27cSHenry Tieman 	fd_fltr_ctx->drop = ICE_FXD_FLTR_QW0_DROP_NO;
280cac2a27cSHenry Tieman 	fd_fltr_ctx->flex_prio = ICE_FXD_FLTR_QW0_FLEX_PRI_NONE;
281cac2a27cSHenry Tieman 	fd_fltr_ctx->flex_mdid = ICE_FXD_FLTR_QW0_FLEX_MDID0;
282cac2a27cSHenry Tieman 	fd_fltr_ctx->flex_val = ICE_FXD_FLTR_QW0_FLEX_VAL0;
283cac2a27cSHenry Tieman 	fd_fltr_ctx->dtype = ICE_TX_DESC_DTYPE_FLTR_PROG;
284cac2a27cSHenry Tieman 	fd_fltr_ctx->desc_prof_prio = ICE_FXD_FLTR_QW1_PROF_PRIO_ZERO;
285cac2a27cSHenry Tieman 	fd_fltr_ctx->desc_prof = ICE_FXD_FLTR_QW1_PROF_ZERO;
286cac2a27cSHenry Tieman 	fd_fltr_ctx->swap = ICE_FXD_FLTR_QW1_SWAP_SET;
287cac2a27cSHenry Tieman 	fd_fltr_ctx->fdid_prio = ICE_FXD_FLTR_QW1_FDID_PRI_ONE;
288cac2a27cSHenry Tieman 	fd_fltr_ctx->fdid_mdid = ICE_FXD_FLTR_QW1_FDID_MDID_FD;
289cac2a27cSHenry Tieman 	fd_fltr_ctx->fdid = ICE_FXD_FLTR_QW1_FDID_ZERO;
290cac2a27cSHenry Tieman }
291cac2a27cSHenry Tieman 
292cac2a27cSHenry Tieman /**
293cac2a27cSHenry Tieman  * ice_set_fd_desc_val
294cac2a27cSHenry Tieman  * @ctx: pointer to fd filter descriptor context
295cac2a27cSHenry Tieman  * @fdir_desc: populated with fd filter descriptor values
296cac2a27cSHenry Tieman  */
297cac2a27cSHenry Tieman static void
298cac2a27cSHenry Tieman ice_set_fd_desc_val(struct ice_fd_fltr_desc_ctx *ctx,
299cac2a27cSHenry Tieman 		    struct ice_fltr_desc *fdir_desc)
300cac2a27cSHenry Tieman {
301cac2a27cSHenry Tieman 	u64 qword;
302cac2a27cSHenry Tieman 
303cac2a27cSHenry Tieman 	/* prep QW0 of FD filter programming desc */
304cac2a27cSHenry Tieman 	qword = ((u64)ctx->qindex << ICE_FXD_FLTR_QW0_QINDEX_S) &
305cac2a27cSHenry Tieman 		ICE_FXD_FLTR_QW0_QINDEX_M;
306cac2a27cSHenry Tieman 	qword |= ((u64)ctx->comp_q << ICE_FXD_FLTR_QW0_COMP_Q_S) &
307cac2a27cSHenry Tieman 		 ICE_FXD_FLTR_QW0_COMP_Q_M;
308cac2a27cSHenry Tieman 	qword |= ((u64)ctx->comp_report << ICE_FXD_FLTR_QW0_COMP_REPORT_S) &
309cac2a27cSHenry Tieman 		 ICE_FXD_FLTR_QW0_COMP_REPORT_M;
310cac2a27cSHenry Tieman 	qword |= ((u64)ctx->fd_space << ICE_FXD_FLTR_QW0_FD_SPACE_S) &
311cac2a27cSHenry Tieman 		 ICE_FXD_FLTR_QW0_FD_SPACE_M;
312cac2a27cSHenry Tieman 	qword |= ((u64)ctx->cnt_index << ICE_FXD_FLTR_QW0_STAT_CNT_S) &
313cac2a27cSHenry Tieman 		 ICE_FXD_FLTR_QW0_STAT_CNT_M;
314cac2a27cSHenry Tieman 	qword |= ((u64)ctx->cnt_ena << ICE_FXD_FLTR_QW0_STAT_ENA_S) &
315cac2a27cSHenry Tieman 		 ICE_FXD_FLTR_QW0_STAT_ENA_M;
316cac2a27cSHenry Tieman 	qword |= ((u64)ctx->evict_ena << ICE_FXD_FLTR_QW0_EVICT_ENA_S) &
317cac2a27cSHenry Tieman 		 ICE_FXD_FLTR_QW0_EVICT_ENA_M;
318cac2a27cSHenry Tieman 	qword |= ((u64)ctx->toq << ICE_FXD_FLTR_QW0_TO_Q_S) &
319cac2a27cSHenry Tieman 		 ICE_FXD_FLTR_QW0_TO_Q_M;
320cac2a27cSHenry Tieman 	qword |= ((u64)ctx->toq_prio << ICE_FXD_FLTR_QW0_TO_Q_PRI_S) &
321cac2a27cSHenry Tieman 		 ICE_FXD_FLTR_QW0_TO_Q_PRI_M;
322cac2a27cSHenry Tieman 	qword |= ((u64)ctx->dpu_recipe << ICE_FXD_FLTR_QW0_DPU_RECIPE_S) &
323cac2a27cSHenry Tieman 		 ICE_FXD_FLTR_QW0_DPU_RECIPE_M;
324cac2a27cSHenry Tieman 	qword |= ((u64)ctx->drop << ICE_FXD_FLTR_QW0_DROP_S) &
325cac2a27cSHenry Tieman 		 ICE_FXD_FLTR_QW0_DROP_M;
326cac2a27cSHenry Tieman 	qword |= ((u64)ctx->flex_prio << ICE_FXD_FLTR_QW0_FLEX_PRI_S) &
327cac2a27cSHenry Tieman 		 ICE_FXD_FLTR_QW0_FLEX_PRI_M;
328cac2a27cSHenry Tieman 	qword |= ((u64)ctx->flex_mdid << ICE_FXD_FLTR_QW0_FLEX_MDID_S) &
329cac2a27cSHenry Tieman 		 ICE_FXD_FLTR_QW0_FLEX_MDID_M;
330cac2a27cSHenry Tieman 	qword |= ((u64)ctx->flex_val << ICE_FXD_FLTR_QW0_FLEX_VAL_S) &
331cac2a27cSHenry Tieman 		 ICE_FXD_FLTR_QW0_FLEX_VAL_M;
332cac2a27cSHenry Tieman 	fdir_desc->qidx_compq_space_stat = cpu_to_le64(qword);
333cac2a27cSHenry Tieman 
334cac2a27cSHenry Tieman 	/* prep QW1 of FD filter programming desc */
335cac2a27cSHenry Tieman 	qword = ((u64)ctx->dtype << ICE_FXD_FLTR_QW1_DTYPE_S) &
336cac2a27cSHenry Tieman 		ICE_FXD_FLTR_QW1_DTYPE_M;
337cac2a27cSHenry Tieman 	qword |= ((u64)ctx->pcmd << ICE_FXD_FLTR_QW1_PCMD_S) &
338cac2a27cSHenry Tieman 		 ICE_FXD_FLTR_QW1_PCMD_M;
339cac2a27cSHenry Tieman 	qword |= ((u64)ctx->desc_prof_prio << ICE_FXD_FLTR_QW1_PROF_PRI_S) &
340cac2a27cSHenry Tieman 		 ICE_FXD_FLTR_QW1_PROF_PRI_M;
341cac2a27cSHenry Tieman 	qword |= ((u64)ctx->desc_prof << ICE_FXD_FLTR_QW1_PROF_S) &
342cac2a27cSHenry Tieman 		 ICE_FXD_FLTR_QW1_PROF_M;
343cac2a27cSHenry Tieman 	qword |= ((u64)ctx->fd_vsi << ICE_FXD_FLTR_QW1_FD_VSI_S) &
344cac2a27cSHenry Tieman 		 ICE_FXD_FLTR_QW1_FD_VSI_M;
345cac2a27cSHenry Tieman 	qword |= ((u64)ctx->swap << ICE_FXD_FLTR_QW1_SWAP_S) &
346cac2a27cSHenry Tieman 		 ICE_FXD_FLTR_QW1_SWAP_M;
347cac2a27cSHenry Tieman 	qword |= ((u64)ctx->fdid_prio << ICE_FXD_FLTR_QW1_FDID_PRI_S) &
348cac2a27cSHenry Tieman 		 ICE_FXD_FLTR_QW1_FDID_PRI_M;
349cac2a27cSHenry Tieman 	qword |= ((u64)ctx->fdid_mdid << ICE_FXD_FLTR_QW1_FDID_MDID_S) &
350cac2a27cSHenry Tieman 		 ICE_FXD_FLTR_QW1_FDID_MDID_M;
351cac2a27cSHenry Tieman 	qword |= ((u64)ctx->fdid << ICE_FXD_FLTR_QW1_FDID_S) &
352cac2a27cSHenry Tieman 		 ICE_FXD_FLTR_QW1_FDID_M;
353cac2a27cSHenry Tieman 	fdir_desc->dtype_cmd_vsi_fdid = cpu_to_le64(qword);
354cac2a27cSHenry Tieman }
355cac2a27cSHenry Tieman 
356cac2a27cSHenry Tieman /**
357cac2a27cSHenry Tieman  * ice_fdir_get_prgm_desc - set a fdir descriptor from a fdir filter struct
358cac2a27cSHenry Tieman  * @hw: pointer to the hardware structure
359cac2a27cSHenry Tieman  * @input: filter
360cac2a27cSHenry Tieman  * @fdesc: filter descriptor
361cac2a27cSHenry Tieman  * @add: if add is true, this is an add operation, false implies delete
362cac2a27cSHenry Tieman  */
363cac2a27cSHenry Tieman void
364cac2a27cSHenry Tieman ice_fdir_get_prgm_desc(struct ice_hw *hw, struct ice_fdir_fltr *input,
365cac2a27cSHenry Tieman 		       struct ice_fltr_desc *fdesc, bool add)
366cac2a27cSHenry Tieman {
367cac2a27cSHenry Tieman 	struct ice_fd_fltr_desc_ctx fdir_fltr_ctx = { 0 };
368cac2a27cSHenry Tieman 
369cac2a27cSHenry Tieman 	/* set default context info */
370cac2a27cSHenry Tieman 	ice_set_dflt_val_fd_desc(&fdir_fltr_ctx);
371cac2a27cSHenry Tieman 
372cac2a27cSHenry Tieman 	/* change sideband filtering values */
373cac2a27cSHenry Tieman 	fdir_fltr_ctx.fdid = input->fltr_id;
374cac2a27cSHenry Tieman 	if (input->dest_ctl == ICE_FLTR_PRGM_DESC_DEST_DROP_PKT) {
375cac2a27cSHenry Tieman 		fdir_fltr_ctx.drop = ICE_FXD_FLTR_QW0_DROP_YES;
376cac2a27cSHenry Tieman 		fdir_fltr_ctx.qindex = 0;
377cac2a27cSHenry Tieman 	} else {
378cac2a27cSHenry Tieman 		fdir_fltr_ctx.drop = ICE_FXD_FLTR_QW0_DROP_NO;
379cac2a27cSHenry Tieman 		fdir_fltr_ctx.qindex = input->q_index;
380cac2a27cSHenry Tieman 	}
381cac2a27cSHenry Tieman 	fdir_fltr_ctx.cnt_ena = ICE_FXD_FLTR_QW0_STAT_ENA_PKTS;
382cac2a27cSHenry Tieman 	fdir_fltr_ctx.cnt_index = input->cnt_index;
383cac2a27cSHenry Tieman 	fdir_fltr_ctx.fd_vsi = ice_get_hw_vsi_num(hw, input->dest_vsi);
384cac2a27cSHenry Tieman 	fdir_fltr_ctx.evict_ena = ICE_FXD_FLTR_QW0_EVICT_ENA_FALSE;
385cac2a27cSHenry Tieman 	fdir_fltr_ctx.toq_prio = 3;
386cac2a27cSHenry Tieman 	fdir_fltr_ctx.pcmd = add ? ICE_FXD_FLTR_QW1_PCMD_ADD :
387cac2a27cSHenry Tieman 		ICE_FXD_FLTR_QW1_PCMD_REMOVE;
388cac2a27cSHenry Tieman 	fdir_fltr_ctx.swap = ICE_FXD_FLTR_QW1_SWAP_NOT_SET;
389cac2a27cSHenry Tieman 	fdir_fltr_ctx.comp_q = ICE_FXD_FLTR_QW0_COMP_Q_ZERO;
390cac2a27cSHenry Tieman 	fdir_fltr_ctx.comp_report = ICE_FXD_FLTR_QW0_COMP_REPORT_SW_FAIL;
391cac2a27cSHenry Tieman 	fdir_fltr_ctx.fdid_prio = 3;
392cac2a27cSHenry Tieman 	fdir_fltr_ctx.desc_prof = 1;
393cac2a27cSHenry Tieman 	fdir_fltr_ctx.desc_prof_prio = 3;
394cac2a27cSHenry Tieman 	ice_set_fd_desc_val(&fdir_fltr_ctx, fdesc);
395cac2a27cSHenry Tieman }
396cac2a27cSHenry Tieman 
397148beb61SHenry Tieman /**
398148beb61SHenry Tieman  * ice_alloc_fd_res_cntr - obtain counter resource for FD type
399148beb61SHenry Tieman  * @hw: pointer to the hardware structure
400148beb61SHenry Tieman  * @cntr_id: returns counter index
401148beb61SHenry Tieman  */
402148beb61SHenry Tieman enum ice_status ice_alloc_fd_res_cntr(struct ice_hw *hw, u16 *cntr_id)
403148beb61SHenry Tieman {
404148beb61SHenry Tieman 	return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_COUNTER_BLOCK,
405148beb61SHenry Tieman 				  ICE_AQC_RES_TYPE_FLAG_DEDICATED, 1, cntr_id);
406148beb61SHenry Tieman }
407148beb61SHenry Tieman 
408148beb61SHenry Tieman /**
409148beb61SHenry Tieman  * ice_free_fd_res_cntr - Free counter resource for FD type
410148beb61SHenry Tieman  * @hw: pointer to the hardware structure
411148beb61SHenry Tieman  * @cntr_id: counter index to be freed
412148beb61SHenry Tieman  */
413148beb61SHenry Tieman enum ice_status ice_free_fd_res_cntr(struct ice_hw *hw, u16 cntr_id)
414148beb61SHenry Tieman {
415148beb61SHenry Tieman 	return ice_free_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_COUNTER_BLOCK,
416148beb61SHenry Tieman 				 ICE_AQC_RES_TYPE_FLAG_DEDICATED, 1, cntr_id);
417148beb61SHenry Tieman }
418148beb61SHenry Tieman 
419148beb61SHenry Tieman /**
420148beb61SHenry Tieman  * ice_alloc_fd_guar_item - allocate resource for FD guaranteed entries
421148beb61SHenry Tieman  * @hw: pointer to the hardware structure
422148beb61SHenry Tieman  * @cntr_id: returns counter index
423148beb61SHenry Tieman  * @num_fltr: number of filter entries to be allocated
424148beb61SHenry Tieman  */
425148beb61SHenry Tieman enum ice_status
426148beb61SHenry Tieman ice_alloc_fd_guar_item(struct ice_hw *hw, u16 *cntr_id, u16 num_fltr)
427148beb61SHenry Tieman {
428148beb61SHenry Tieman 	return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_GUARANTEED_ENTRIES,
429148beb61SHenry Tieman 				  ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr,
430148beb61SHenry Tieman 				  cntr_id);
431148beb61SHenry Tieman }
432148beb61SHenry Tieman 
433148beb61SHenry Tieman /**
434148beb61SHenry Tieman  * ice_alloc_fd_shrd_item - allocate resource for flow director shared entries
435148beb61SHenry Tieman  * @hw: pointer to the hardware structure
436148beb61SHenry Tieman  * @cntr_id: returns counter index
437148beb61SHenry Tieman  * @num_fltr: number of filter entries to be allocated
438148beb61SHenry Tieman  */
439148beb61SHenry Tieman enum ice_status
440148beb61SHenry Tieman ice_alloc_fd_shrd_item(struct ice_hw *hw, u16 *cntr_id, u16 num_fltr)
441148beb61SHenry Tieman {
442148beb61SHenry Tieman 	return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_SHARED_ENTRIES,
443148beb61SHenry Tieman 				  ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr,
444148beb61SHenry Tieman 				  cntr_id);
445148beb61SHenry Tieman }
4464ab95646SHenry Tieman 
4474ab95646SHenry Tieman /**
4484ab95646SHenry Tieman  * ice_get_fdir_cnt_all - get the number of Flow Director filters
4494ab95646SHenry Tieman  * @hw: hardware data structure
4504ab95646SHenry Tieman  *
4514ab95646SHenry Tieman  * Returns the number of filters available on device
4524ab95646SHenry Tieman  */
4534ab95646SHenry Tieman int ice_get_fdir_cnt_all(struct ice_hw *hw)
4544ab95646SHenry Tieman {
4554ab95646SHenry Tieman 	return hw->func_caps.fd_fltr_guar + hw->func_caps.fd_fltr_best_effort;
4564ab95646SHenry Tieman }
4574ab95646SHenry Tieman 
4584ab95646SHenry Tieman /**
459165d80d6SHenry Tieman  * ice_pkt_insert_ipv6_addr - insert a be32 IPv6 address into a memory buffer
460165d80d6SHenry Tieman  * @pkt: packet buffer
461165d80d6SHenry Tieman  * @offset: offset into buffer
462165d80d6SHenry Tieman  * @addr: IPv6 address to convert and insert into pkt at offset
463165d80d6SHenry Tieman  */
464165d80d6SHenry Tieman static void ice_pkt_insert_ipv6_addr(u8 *pkt, int offset, __be32 *addr)
465165d80d6SHenry Tieman {
466165d80d6SHenry Tieman 	int idx;
467165d80d6SHenry Tieman 
468165d80d6SHenry Tieman 	for (idx = 0; idx < ICE_IPV6_ADDR_LEN_AS_U32; idx++)
469165d80d6SHenry Tieman 		memcpy(pkt + offset + idx * sizeof(*addr), &addr[idx],
470165d80d6SHenry Tieman 		       sizeof(*addr));
471165d80d6SHenry Tieman }
472165d80d6SHenry Tieman 
473165d80d6SHenry Tieman /**
474cac2a27cSHenry Tieman  * ice_pkt_insert_u16 - insert a be16 value into a memory buffer
475cac2a27cSHenry Tieman  * @pkt: packet buffer
476cac2a27cSHenry Tieman  * @offset: offset into buffer
477cac2a27cSHenry Tieman  * @data: 16 bit value to convert and insert into pkt at offset
478cac2a27cSHenry Tieman  */
479cac2a27cSHenry Tieman static void ice_pkt_insert_u16(u8 *pkt, int offset, __be16 data)
480cac2a27cSHenry Tieman {
481cac2a27cSHenry Tieman 	memcpy(pkt + offset, &data, sizeof(data));
482cac2a27cSHenry Tieman }
483cac2a27cSHenry Tieman 
484cac2a27cSHenry Tieman /**
485cac2a27cSHenry Tieman  * ice_pkt_insert_u32 - insert a be32 value into a memory buffer
486cac2a27cSHenry Tieman  * @pkt: packet buffer
487cac2a27cSHenry Tieman  * @offset: offset into buffer
488cac2a27cSHenry Tieman  * @data: 32 bit value to convert and insert into pkt at offset
489cac2a27cSHenry Tieman  */
490cac2a27cSHenry Tieman static void ice_pkt_insert_u32(u8 *pkt, int offset, __be32 data)
491cac2a27cSHenry Tieman {
492cac2a27cSHenry Tieman 	memcpy(pkt + offset, &data, sizeof(data));
493cac2a27cSHenry Tieman }
494cac2a27cSHenry Tieman 
495cac2a27cSHenry Tieman /**
496cac2a27cSHenry Tieman  * ice_fdir_get_gen_prgm_pkt - generate a training packet
497cac2a27cSHenry Tieman  * @hw: pointer to the hardware structure
498cac2a27cSHenry Tieman  * @input: flow director filter data structure
499cac2a27cSHenry Tieman  * @pkt: pointer to return filter packet
500cac2a27cSHenry Tieman  * @frag: generate a fragment packet
501cac2a27cSHenry Tieman  * @tun: true implies generate a tunnel packet
502cac2a27cSHenry Tieman  */
503cac2a27cSHenry Tieman enum ice_status
504cac2a27cSHenry Tieman ice_fdir_get_gen_prgm_pkt(struct ice_hw *hw, struct ice_fdir_fltr *input,
505cac2a27cSHenry Tieman 			  u8 *pkt, bool frag, bool tun)
506cac2a27cSHenry Tieman {
507cac2a27cSHenry Tieman 	enum ice_fltr_ptype flow;
508cac2a27cSHenry Tieman 	u16 tnl_port;
509cac2a27cSHenry Tieman 	u8 *loc;
510cac2a27cSHenry Tieman 	u16 idx;
511cac2a27cSHenry Tieman 
512cac2a27cSHenry Tieman 	if (input->flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER) {
513165d80d6SHenry Tieman 		switch (input->ip.v4.proto) {
514cac2a27cSHenry Tieman 		case IPPROTO_TCP:
515cac2a27cSHenry Tieman 			flow = ICE_FLTR_PTYPE_NONF_IPV4_TCP;
516cac2a27cSHenry Tieman 			break;
517cac2a27cSHenry Tieman 		case IPPROTO_UDP:
518cac2a27cSHenry Tieman 			flow = ICE_FLTR_PTYPE_NONF_IPV4_UDP;
519cac2a27cSHenry Tieman 			break;
520cac2a27cSHenry Tieman 		case IPPROTO_SCTP:
521cac2a27cSHenry Tieman 			flow = ICE_FLTR_PTYPE_NONF_IPV4_SCTP;
522cac2a27cSHenry Tieman 			break;
523cac2a27cSHenry Tieman 		case IPPROTO_IP:
524cac2a27cSHenry Tieman 			flow = ICE_FLTR_PTYPE_NONF_IPV4_OTHER;
525cac2a27cSHenry Tieman 			break;
526cac2a27cSHenry Tieman 		default:
527cac2a27cSHenry Tieman 			return ICE_ERR_PARAM;
528cac2a27cSHenry Tieman 		}
529165d80d6SHenry Tieman 	} else if (input->flow_type == ICE_FLTR_PTYPE_NONF_IPV6_OTHER) {
530165d80d6SHenry Tieman 		switch (input->ip.v6.proto) {
531165d80d6SHenry Tieman 		case IPPROTO_TCP:
532165d80d6SHenry Tieman 			flow = ICE_FLTR_PTYPE_NONF_IPV6_TCP;
533165d80d6SHenry Tieman 			break;
534165d80d6SHenry Tieman 		case IPPROTO_UDP:
535165d80d6SHenry Tieman 			flow = ICE_FLTR_PTYPE_NONF_IPV6_UDP;
536165d80d6SHenry Tieman 			break;
537165d80d6SHenry Tieman 		case IPPROTO_SCTP:
538165d80d6SHenry Tieman 			flow = ICE_FLTR_PTYPE_NONF_IPV6_SCTP;
539165d80d6SHenry Tieman 			break;
540165d80d6SHenry Tieman 		case IPPROTO_IP:
541165d80d6SHenry Tieman 			flow = ICE_FLTR_PTYPE_NONF_IPV6_OTHER;
542165d80d6SHenry Tieman 			break;
543165d80d6SHenry Tieman 		default:
544165d80d6SHenry Tieman 			return ICE_ERR_PARAM;
545165d80d6SHenry Tieman 		}
546cac2a27cSHenry Tieman 	} else {
547cac2a27cSHenry Tieman 		flow = input->flow_type;
548cac2a27cSHenry Tieman 	}
549cac2a27cSHenry Tieman 
550cac2a27cSHenry Tieman 	for (idx = 0; idx < ICE_FDIR_NUM_PKT; idx++)
551cac2a27cSHenry Tieman 		if (ice_fdir_pkt[idx].flow == flow)
552cac2a27cSHenry Tieman 			break;
553cac2a27cSHenry Tieman 	if (idx == ICE_FDIR_NUM_PKT)
554cac2a27cSHenry Tieman 		return ICE_ERR_PARAM;
555cac2a27cSHenry Tieman 	if (!tun) {
556cac2a27cSHenry Tieman 		memcpy(pkt, ice_fdir_pkt[idx].pkt, ice_fdir_pkt[idx].pkt_len);
557cac2a27cSHenry Tieman 		loc = pkt;
558cac2a27cSHenry Tieman 	} else {
559cac2a27cSHenry Tieman 		if (!ice_get_open_tunnel_port(hw, TNL_ALL, &tnl_port))
560cac2a27cSHenry Tieman 			return ICE_ERR_DOES_NOT_EXIST;
561cac2a27cSHenry Tieman 		if (!ice_fdir_pkt[idx].tun_pkt)
562cac2a27cSHenry Tieman 			return ICE_ERR_PARAM;
563cac2a27cSHenry Tieman 		memcpy(pkt, ice_fdir_pkt[idx].tun_pkt,
564cac2a27cSHenry Tieman 		       ice_fdir_pkt[idx].tun_pkt_len);
565cac2a27cSHenry Tieman 		ice_pkt_insert_u16(pkt, ICE_IPV4_UDP_DST_PORT_OFFSET,
566cac2a27cSHenry Tieman 				   htons(tnl_port));
567cac2a27cSHenry Tieman 		loc = &pkt[ICE_FDIR_TUN_PKT_OFF];
568cac2a27cSHenry Tieman 	}
569cac2a27cSHenry Tieman 
570cac2a27cSHenry Tieman 	/* Reverse the src and dst, since the HW expects them to be from Tx
571cac2a27cSHenry Tieman 	 * perspective. The input from user is from Rx filter perspective.
572cac2a27cSHenry Tieman 	 */
573cac2a27cSHenry Tieman 	switch (flow) {
574cac2a27cSHenry Tieman 	case ICE_FLTR_PTYPE_NONF_IPV4_TCP:
575cac2a27cSHenry Tieman 		ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
576165d80d6SHenry Tieman 				   input->ip.v4.src_ip);
577cac2a27cSHenry Tieman 		ice_pkt_insert_u16(loc, ICE_IPV4_TCP_DST_PORT_OFFSET,
578165d80d6SHenry Tieman 				   input->ip.v4.src_port);
579cac2a27cSHenry Tieman 		ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
580165d80d6SHenry Tieman 				   input->ip.v4.dst_ip);
581cac2a27cSHenry Tieman 		ice_pkt_insert_u16(loc, ICE_IPV4_TCP_SRC_PORT_OFFSET,
582165d80d6SHenry Tieman 				   input->ip.v4.dst_port);
583cac2a27cSHenry Tieman 		if (frag)
584cac2a27cSHenry Tieman 			loc[20] = ICE_FDIR_IPV4_PKT_FLAG_DF;
585cac2a27cSHenry Tieman 		break;
586cac2a27cSHenry Tieman 	case ICE_FLTR_PTYPE_NONF_IPV4_UDP:
587cac2a27cSHenry Tieman 		ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
588165d80d6SHenry Tieman 				   input->ip.v4.src_ip);
589cac2a27cSHenry Tieman 		ice_pkt_insert_u16(loc, ICE_IPV4_UDP_DST_PORT_OFFSET,
590165d80d6SHenry Tieman 				   input->ip.v4.src_port);
591cac2a27cSHenry Tieman 		ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
592165d80d6SHenry Tieman 				   input->ip.v4.dst_ip);
593cac2a27cSHenry Tieman 		ice_pkt_insert_u16(loc, ICE_IPV4_UDP_SRC_PORT_OFFSET,
594165d80d6SHenry Tieman 				   input->ip.v4.dst_port);
595cac2a27cSHenry Tieman 		break;
596cac2a27cSHenry Tieman 	case ICE_FLTR_PTYPE_NONF_IPV4_SCTP:
597cac2a27cSHenry Tieman 		ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
598165d80d6SHenry Tieman 				   input->ip.v4.src_ip);
599cac2a27cSHenry Tieman 		ice_pkt_insert_u16(loc, ICE_IPV4_SCTP_DST_PORT_OFFSET,
600165d80d6SHenry Tieman 				   input->ip.v4.src_port);
601cac2a27cSHenry Tieman 		ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
602165d80d6SHenry Tieman 				   input->ip.v4.dst_ip);
603cac2a27cSHenry Tieman 		ice_pkt_insert_u16(loc, ICE_IPV4_SCTP_SRC_PORT_OFFSET,
604165d80d6SHenry Tieman 				   input->ip.v4.dst_port);
605cac2a27cSHenry Tieman 		break;
606cac2a27cSHenry Tieman 	case ICE_FLTR_PTYPE_NONF_IPV4_OTHER:
607cac2a27cSHenry Tieman 		ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
608165d80d6SHenry Tieman 				   input->ip.v4.src_ip);
609cac2a27cSHenry Tieman 		ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
610165d80d6SHenry Tieman 				   input->ip.v4.dst_ip);
611cac2a27cSHenry Tieman 		ice_pkt_insert_u16(loc, ICE_IPV4_PROTO_OFFSET, 0);
612cac2a27cSHenry Tieman 		break;
613165d80d6SHenry Tieman 	case ICE_FLTR_PTYPE_NONF_IPV6_TCP:
614165d80d6SHenry Tieman 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
615165d80d6SHenry Tieman 					 input->ip.v6.src_ip);
616165d80d6SHenry Tieman 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
617165d80d6SHenry Tieman 					 input->ip.v6.dst_ip);
618165d80d6SHenry Tieman 		ice_pkt_insert_u16(loc, ICE_IPV6_TCP_DST_PORT_OFFSET,
619165d80d6SHenry Tieman 				   input->ip.v6.src_port);
620165d80d6SHenry Tieman 		ice_pkt_insert_u16(loc, ICE_IPV6_TCP_SRC_PORT_OFFSET,
621165d80d6SHenry Tieman 				   input->ip.v6.dst_port);
622165d80d6SHenry Tieman 		break;
623165d80d6SHenry Tieman 	case ICE_FLTR_PTYPE_NONF_IPV6_UDP:
624165d80d6SHenry Tieman 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
625165d80d6SHenry Tieman 					 input->ip.v6.src_ip);
626165d80d6SHenry Tieman 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
627165d80d6SHenry Tieman 					 input->ip.v6.dst_ip);
628165d80d6SHenry Tieman 		ice_pkt_insert_u16(loc, ICE_IPV6_UDP_DST_PORT_OFFSET,
629165d80d6SHenry Tieman 				   input->ip.v6.src_port);
630165d80d6SHenry Tieman 		ice_pkt_insert_u16(loc, ICE_IPV6_UDP_SRC_PORT_OFFSET,
631165d80d6SHenry Tieman 				   input->ip.v6.dst_port);
632165d80d6SHenry Tieman 		break;
633165d80d6SHenry Tieman 	case ICE_FLTR_PTYPE_NONF_IPV6_SCTP:
634165d80d6SHenry Tieman 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
635165d80d6SHenry Tieman 					 input->ip.v6.src_ip);
636165d80d6SHenry Tieman 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
637165d80d6SHenry Tieman 					 input->ip.v6.dst_ip);
638165d80d6SHenry Tieman 		ice_pkt_insert_u16(loc, ICE_IPV6_SCTP_DST_PORT_OFFSET,
639165d80d6SHenry Tieman 				   input->ip.v6.src_port);
640165d80d6SHenry Tieman 		ice_pkt_insert_u16(loc, ICE_IPV6_SCTP_SRC_PORT_OFFSET,
641165d80d6SHenry Tieman 				   input->ip.v6.dst_port);
642165d80d6SHenry Tieman 		break;
643165d80d6SHenry Tieman 	case ICE_FLTR_PTYPE_NONF_IPV6_OTHER:
644165d80d6SHenry Tieman 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
645165d80d6SHenry Tieman 					 input->ip.v6.src_ip);
646165d80d6SHenry Tieman 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
647165d80d6SHenry Tieman 					 input->ip.v6.dst_ip);
648165d80d6SHenry Tieman 		break;
649cac2a27cSHenry Tieman 	default:
650cac2a27cSHenry Tieman 		return ICE_ERR_PARAM;
651cac2a27cSHenry Tieman 	}
652cac2a27cSHenry Tieman 
6532c57ffcbSHenry Tieman 	if (input->flex_fltr)
6542c57ffcbSHenry Tieman 		ice_pkt_insert_u16(loc, input->flex_offset, input->flex_word);
6552c57ffcbSHenry Tieman 
656cac2a27cSHenry Tieman 	return 0;
657cac2a27cSHenry Tieman }
658cac2a27cSHenry Tieman 
659cac2a27cSHenry Tieman /**
660cac2a27cSHenry Tieman  * ice_fdir_has_frag - does flow type have 2 ptypes
661cac2a27cSHenry Tieman  * @flow: flow ptype
662cac2a27cSHenry Tieman  *
663cac2a27cSHenry Tieman  * returns true is there is a fragment packet for this ptype
664cac2a27cSHenry Tieman  */
665cac2a27cSHenry Tieman bool ice_fdir_has_frag(enum ice_fltr_ptype flow)
666cac2a27cSHenry Tieman {
667cac2a27cSHenry Tieman 	if (flow == ICE_FLTR_PTYPE_NONF_IPV4_OTHER)
668cac2a27cSHenry Tieman 		return true;
669cac2a27cSHenry Tieman 	else
670cac2a27cSHenry Tieman 		return false;
671cac2a27cSHenry Tieman }
672cac2a27cSHenry Tieman 
673cac2a27cSHenry Tieman /**
6744ab95646SHenry Tieman  * ice_fdir_find_by_idx - find filter with idx
6754ab95646SHenry Tieman  * @hw: pointer to hardware structure
6764ab95646SHenry Tieman  * @fltr_idx: index to find.
6774ab95646SHenry Tieman  *
6784ab95646SHenry Tieman  * Returns pointer to filter if found or null
6794ab95646SHenry Tieman  */
6804ab95646SHenry Tieman struct ice_fdir_fltr *
6814ab95646SHenry Tieman ice_fdir_find_fltr_by_idx(struct ice_hw *hw, u32 fltr_idx)
6824ab95646SHenry Tieman {
6834ab95646SHenry Tieman 	struct ice_fdir_fltr *rule;
6844ab95646SHenry Tieman 
6854ab95646SHenry Tieman 	list_for_each_entry(rule, &hw->fdir_list_head, fltr_node) {
6864ab95646SHenry Tieman 		/* rule ID found in the list */
6874ab95646SHenry Tieman 		if (fltr_idx == rule->fltr_id)
6884ab95646SHenry Tieman 			return rule;
6894ab95646SHenry Tieman 		if (fltr_idx < rule->fltr_id)
6904ab95646SHenry Tieman 			break;
6914ab95646SHenry Tieman 	}
6924ab95646SHenry Tieman 	return NULL;
6934ab95646SHenry Tieman }
694cac2a27cSHenry Tieman 
695cac2a27cSHenry Tieman /**
696cac2a27cSHenry Tieman  * ice_fdir_list_add_fltr - add a new node to the flow director filter list
697cac2a27cSHenry Tieman  * @hw: hardware structure
698cac2a27cSHenry Tieman  * @fltr: filter node to add to structure
699cac2a27cSHenry Tieman  */
700cac2a27cSHenry Tieman void ice_fdir_list_add_fltr(struct ice_hw *hw, struct ice_fdir_fltr *fltr)
701cac2a27cSHenry Tieman {
702cac2a27cSHenry Tieman 	struct ice_fdir_fltr *rule, *parent = NULL;
703cac2a27cSHenry Tieman 
704cac2a27cSHenry Tieman 	list_for_each_entry(rule, &hw->fdir_list_head, fltr_node) {
705cac2a27cSHenry Tieman 		/* rule ID found or pass its spot in the list */
706cac2a27cSHenry Tieman 		if (rule->fltr_id >= fltr->fltr_id)
707cac2a27cSHenry Tieman 			break;
708cac2a27cSHenry Tieman 		parent = rule;
709cac2a27cSHenry Tieman 	}
710cac2a27cSHenry Tieman 
711cac2a27cSHenry Tieman 	if (parent)
712cac2a27cSHenry Tieman 		list_add(&fltr->fltr_node, &parent->fltr_node);
713cac2a27cSHenry Tieman 	else
714cac2a27cSHenry Tieman 		list_add(&fltr->fltr_node, &hw->fdir_list_head);
715cac2a27cSHenry Tieman }
716cac2a27cSHenry Tieman 
717cac2a27cSHenry Tieman /**
718cac2a27cSHenry Tieman  * ice_fdir_update_cntrs - increment / decrement filter counter
719cac2a27cSHenry Tieman  * @hw: pointer to hardware structure
720cac2a27cSHenry Tieman  * @flow: filter flow type
721cac2a27cSHenry Tieman  * @add: true implies filters added
722cac2a27cSHenry Tieman  */
723cac2a27cSHenry Tieman void
724cac2a27cSHenry Tieman ice_fdir_update_cntrs(struct ice_hw *hw, enum ice_fltr_ptype flow, bool add)
725cac2a27cSHenry Tieman {
726cac2a27cSHenry Tieman 	int incr;
727cac2a27cSHenry Tieman 
728cac2a27cSHenry Tieman 	incr = add ? 1 : -1;
729cac2a27cSHenry Tieman 	hw->fdir_active_fltr += incr;
730cac2a27cSHenry Tieman 
731cac2a27cSHenry Tieman 	if (flow == ICE_FLTR_PTYPE_NONF_NONE || flow >= ICE_FLTR_PTYPE_MAX)
732cac2a27cSHenry Tieman 		ice_debug(hw, ICE_DBG_SW, "Unknown filter type %d\n", flow);
733cac2a27cSHenry Tieman 	else
734cac2a27cSHenry Tieman 		hw->fdir_fltr_cnt[flow] += incr;
735cac2a27cSHenry Tieman }
736cac2a27cSHenry Tieman 
737cac2a27cSHenry Tieman /**
738165d80d6SHenry Tieman  * ice_cmp_ipv6_addr - compare 2 IP v6 addresses
739165d80d6SHenry Tieman  * @a: IP v6 address
740165d80d6SHenry Tieman  * @b: IP v6 address
741165d80d6SHenry Tieman  *
742165d80d6SHenry Tieman  * Returns 0 on equal, returns non-0 if different
743165d80d6SHenry Tieman  */
744165d80d6SHenry Tieman static int ice_cmp_ipv6_addr(__be32 *a, __be32 *b)
745165d80d6SHenry Tieman {
746165d80d6SHenry Tieman 	return memcmp(a, b, 4 * sizeof(__be32));
747165d80d6SHenry Tieman }
748165d80d6SHenry Tieman 
749165d80d6SHenry Tieman /**
750cac2a27cSHenry Tieman  * ice_fdir_comp_rules - compare 2 filters
751cac2a27cSHenry Tieman  * @a: a Flow Director filter data structure
752cac2a27cSHenry Tieman  * @b: a Flow Director filter data structure
753165d80d6SHenry Tieman  * @v6: bool true if v6 filter
754cac2a27cSHenry Tieman  *
755cac2a27cSHenry Tieman  * Returns true if the filters match
756cac2a27cSHenry Tieman  */
757cac2a27cSHenry Tieman static bool
758165d80d6SHenry Tieman ice_fdir_comp_rules(struct ice_fdir_fltr *a,  struct ice_fdir_fltr *b, bool v6)
759cac2a27cSHenry Tieman {
760cac2a27cSHenry Tieman 	enum ice_fltr_ptype flow_type = a->flow_type;
761cac2a27cSHenry Tieman 
762cac2a27cSHenry Tieman 	/* The calling function already checks that the two filters have the
763cac2a27cSHenry Tieman 	 * same flow_type.
764cac2a27cSHenry Tieman 	 */
765165d80d6SHenry Tieman 	if (!v6) {
766cac2a27cSHenry Tieman 		if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_TCP ||
767cac2a27cSHenry Tieman 		    flow_type == ICE_FLTR_PTYPE_NONF_IPV4_UDP ||
768cac2a27cSHenry Tieman 		    flow_type == ICE_FLTR_PTYPE_NONF_IPV4_SCTP) {
769165d80d6SHenry Tieman 			if (a->ip.v4.dst_ip == b->ip.v4.dst_ip &&
770165d80d6SHenry Tieman 			    a->ip.v4.src_ip == b->ip.v4.src_ip &&
771165d80d6SHenry Tieman 			    a->ip.v4.dst_port == b->ip.v4.dst_port &&
772165d80d6SHenry Tieman 			    a->ip.v4.src_port == b->ip.v4.src_port)
773cac2a27cSHenry Tieman 				return true;
774cac2a27cSHenry Tieman 		} else if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER) {
775165d80d6SHenry Tieman 			if (a->ip.v4.dst_ip == b->ip.v4.dst_ip &&
776165d80d6SHenry Tieman 			    a->ip.v4.src_ip == b->ip.v4.src_ip &&
777165d80d6SHenry Tieman 			    a->ip.v4.l4_header == b->ip.v4.l4_header &&
778165d80d6SHenry Tieman 			    a->ip.v4.proto == b->ip.v4.proto &&
779165d80d6SHenry Tieman 			    a->ip.v4.ip_ver == b->ip.v4.ip_ver &&
780165d80d6SHenry Tieman 			    a->ip.v4.tos == b->ip.v4.tos)
781cac2a27cSHenry Tieman 				return true;
782cac2a27cSHenry Tieman 		}
783165d80d6SHenry Tieman 	} else {
784165d80d6SHenry Tieman 		if (flow_type == ICE_FLTR_PTYPE_NONF_IPV6_UDP ||
785165d80d6SHenry Tieman 		    flow_type == ICE_FLTR_PTYPE_NONF_IPV6_TCP ||
786165d80d6SHenry Tieman 		    flow_type == ICE_FLTR_PTYPE_NONF_IPV6_SCTP) {
787165d80d6SHenry Tieman 			if (a->ip.v6.dst_port == b->ip.v6.dst_port &&
788165d80d6SHenry Tieman 			    a->ip.v6.src_port == b->ip.v6.src_port &&
789165d80d6SHenry Tieman 			    !ice_cmp_ipv6_addr(a->ip.v6.dst_ip,
790165d80d6SHenry Tieman 					       b->ip.v6.dst_ip) &&
791165d80d6SHenry Tieman 			    !ice_cmp_ipv6_addr(a->ip.v6.src_ip,
792165d80d6SHenry Tieman 					       b->ip.v6.src_ip))
793165d80d6SHenry Tieman 				return true;
794165d80d6SHenry Tieman 		} else if (flow_type == ICE_FLTR_PTYPE_NONF_IPV6_OTHER) {
795165d80d6SHenry Tieman 			if (a->ip.v6.dst_port == b->ip.v6.dst_port &&
796165d80d6SHenry Tieman 			    a->ip.v6.src_port == b->ip.v6.src_port)
797165d80d6SHenry Tieman 				return true;
798165d80d6SHenry Tieman 		}
799165d80d6SHenry Tieman 	}
800cac2a27cSHenry Tieman 
801cac2a27cSHenry Tieman 	return false;
802cac2a27cSHenry Tieman }
803cac2a27cSHenry Tieman 
804cac2a27cSHenry Tieman /**
805cac2a27cSHenry Tieman  * ice_fdir_is_dup_fltr - test if filter is already in list for PF
806cac2a27cSHenry Tieman  * @hw: hardware data structure
807cac2a27cSHenry Tieman  * @input: Flow Director filter data structure
808cac2a27cSHenry Tieman  *
809cac2a27cSHenry Tieman  * Returns true if the filter is found in the list
810cac2a27cSHenry Tieman  */
811cac2a27cSHenry Tieman bool ice_fdir_is_dup_fltr(struct ice_hw *hw, struct ice_fdir_fltr *input)
812cac2a27cSHenry Tieman {
813cac2a27cSHenry Tieman 	struct ice_fdir_fltr *rule;
814cac2a27cSHenry Tieman 	bool ret = false;
815cac2a27cSHenry Tieman 
816cac2a27cSHenry Tieman 	list_for_each_entry(rule, &hw->fdir_list_head, fltr_node) {
817cac2a27cSHenry Tieman 		enum ice_fltr_ptype flow_type;
818cac2a27cSHenry Tieman 
819cac2a27cSHenry Tieman 		if (rule->flow_type != input->flow_type)
820cac2a27cSHenry Tieman 			continue;
821cac2a27cSHenry Tieman 
822cac2a27cSHenry Tieman 		flow_type = input->flow_type;
823cac2a27cSHenry Tieman 		if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_TCP ||
824cac2a27cSHenry Tieman 		    flow_type == ICE_FLTR_PTYPE_NONF_IPV4_UDP ||
825cac2a27cSHenry Tieman 		    flow_type == ICE_FLTR_PTYPE_NONF_IPV4_SCTP ||
826cac2a27cSHenry Tieman 		    flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER)
827165d80d6SHenry Tieman 			ret = ice_fdir_comp_rules(rule, input, false);
828165d80d6SHenry Tieman 		else
829165d80d6SHenry Tieman 			ret = ice_fdir_comp_rules(rule, input, true);
830cac2a27cSHenry Tieman 		if (ret) {
831cac2a27cSHenry Tieman 			if (rule->fltr_id == input->fltr_id &&
832cac2a27cSHenry Tieman 			    rule->q_index != input->q_index)
833cac2a27cSHenry Tieman 				ret = false;
834cac2a27cSHenry Tieman 			else
835cac2a27cSHenry Tieman 				break;
836cac2a27cSHenry Tieman 		}
837cac2a27cSHenry Tieman 	}
838cac2a27cSHenry Tieman 
839cac2a27cSHenry Tieman 	return ret;
840cac2a27cSHenry Tieman }
841