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 /**
496*390bd141SQi Zhang  * ice_pkt_insert_mac_addr - insert a MAC addr into a memory buffer.
497*390bd141SQi Zhang  * @pkt: packet buffer
498*390bd141SQi Zhang  * @addr: MAC address to convert and insert into pkt at offset
499*390bd141SQi Zhang  */
500*390bd141SQi Zhang static void ice_pkt_insert_mac_addr(u8 *pkt, u8 *addr)
501*390bd141SQi Zhang {
502*390bd141SQi Zhang 	ether_addr_copy(pkt, addr);
503*390bd141SQi Zhang }
504*390bd141SQi Zhang 
505*390bd141SQi Zhang /**
506cac2a27cSHenry Tieman  * ice_fdir_get_gen_prgm_pkt - generate a training packet
507cac2a27cSHenry Tieman  * @hw: pointer to the hardware structure
508cac2a27cSHenry Tieman  * @input: flow director filter data structure
509cac2a27cSHenry Tieman  * @pkt: pointer to return filter packet
510cac2a27cSHenry Tieman  * @frag: generate a fragment packet
511cac2a27cSHenry Tieman  * @tun: true implies generate a tunnel packet
512cac2a27cSHenry Tieman  */
513cac2a27cSHenry Tieman enum ice_status
514cac2a27cSHenry Tieman ice_fdir_get_gen_prgm_pkt(struct ice_hw *hw, struct ice_fdir_fltr *input,
515cac2a27cSHenry Tieman 			  u8 *pkt, bool frag, bool tun)
516cac2a27cSHenry Tieman {
517cac2a27cSHenry Tieman 	enum ice_fltr_ptype flow;
518cac2a27cSHenry Tieman 	u16 tnl_port;
519cac2a27cSHenry Tieman 	u8 *loc;
520cac2a27cSHenry Tieman 	u16 idx;
521cac2a27cSHenry Tieman 
522cac2a27cSHenry Tieman 	if (input->flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER) {
523165d80d6SHenry Tieman 		switch (input->ip.v4.proto) {
524cac2a27cSHenry Tieman 		case IPPROTO_TCP:
525cac2a27cSHenry Tieman 			flow = ICE_FLTR_PTYPE_NONF_IPV4_TCP;
526cac2a27cSHenry Tieman 			break;
527cac2a27cSHenry Tieman 		case IPPROTO_UDP:
528cac2a27cSHenry Tieman 			flow = ICE_FLTR_PTYPE_NONF_IPV4_UDP;
529cac2a27cSHenry Tieman 			break;
530cac2a27cSHenry Tieman 		case IPPROTO_SCTP:
531cac2a27cSHenry Tieman 			flow = ICE_FLTR_PTYPE_NONF_IPV4_SCTP;
532cac2a27cSHenry Tieman 			break;
533cac2a27cSHenry Tieman 		case IPPROTO_IP:
534cac2a27cSHenry Tieman 			flow = ICE_FLTR_PTYPE_NONF_IPV4_OTHER;
535cac2a27cSHenry Tieman 			break;
536cac2a27cSHenry Tieman 		default:
537cac2a27cSHenry Tieman 			return ICE_ERR_PARAM;
538cac2a27cSHenry Tieman 		}
539165d80d6SHenry Tieman 	} else if (input->flow_type == ICE_FLTR_PTYPE_NONF_IPV6_OTHER) {
540165d80d6SHenry Tieman 		switch (input->ip.v6.proto) {
541165d80d6SHenry Tieman 		case IPPROTO_TCP:
542165d80d6SHenry Tieman 			flow = ICE_FLTR_PTYPE_NONF_IPV6_TCP;
543165d80d6SHenry Tieman 			break;
544165d80d6SHenry Tieman 		case IPPROTO_UDP:
545165d80d6SHenry Tieman 			flow = ICE_FLTR_PTYPE_NONF_IPV6_UDP;
546165d80d6SHenry Tieman 			break;
547165d80d6SHenry Tieman 		case IPPROTO_SCTP:
548165d80d6SHenry Tieman 			flow = ICE_FLTR_PTYPE_NONF_IPV6_SCTP;
549165d80d6SHenry Tieman 			break;
550165d80d6SHenry Tieman 		case IPPROTO_IP:
551165d80d6SHenry Tieman 			flow = ICE_FLTR_PTYPE_NONF_IPV6_OTHER;
552165d80d6SHenry Tieman 			break;
553165d80d6SHenry Tieman 		default:
554165d80d6SHenry Tieman 			return ICE_ERR_PARAM;
555165d80d6SHenry Tieman 		}
556cac2a27cSHenry Tieman 	} else {
557cac2a27cSHenry Tieman 		flow = input->flow_type;
558cac2a27cSHenry Tieman 	}
559cac2a27cSHenry Tieman 
560cac2a27cSHenry Tieman 	for (idx = 0; idx < ICE_FDIR_NUM_PKT; idx++)
561cac2a27cSHenry Tieman 		if (ice_fdir_pkt[idx].flow == flow)
562cac2a27cSHenry Tieman 			break;
563cac2a27cSHenry Tieman 	if (idx == ICE_FDIR_NUM_PKT)
564cac2a27cSHenry Tieman 		return ICE_ERR_PARAM;
565cac2a27cSHenry Tieman 	if (!tun) {
566cac2a27cSHenry Tieman 		memcpy(pkt, ice_fdir_pkt[idx].pkt, ice_fdir_pkt[idx].pkt_len);
567cac2a27cSHenry Tieman 		loc = pkt;
568cac2a27cSHenry Tieman 	} else {
569f049b826SJakub Kicinski 		if (!ice_get_open_tunnel_port(hw, &tnl_port))
570cac2a27cSHenry Tieman 			return ICE_ERR_DOES_NOT_EXIST;
571cac2a27cSHenry Tieman 		if (!ice_fdir_pkt[idx].tun_pkt)
572cac2a27cSHenry Tieman 			return ICE_ERR_PARAM;
573cac2a27cSHenry Tieman 		memcpy(pkt, ice_fdir_pkt[idx].tun_pkt,
574cac2a27cSHenry Tieman 		       ice_fdir_pkt[idx].tun_pkt_len);
575cac2a27cSHenry Tieman 		ice_pkt_insert_u16(pkt, ICE_IPV4_UDP_DST_PORT_OFFSET,
576cac2a27cSHenry Tieman 				   htons(tnl_port));
577cac2a27cSHenry Tieman 		loc = &pkt[ICE_FDIR_TUN_PKT_OFF];
578cac2a27cSHenry Tieman 	}
579cac2a27cSHenry Tieman 
580cac2a27cSHenry Tieman 	/* Reverse the src and dst, since the HW expects them to be from Tx
581cac2a27cSHenry Tieman 	 * perspective. The input from user is from Rx filter perspective.
582cac2a27cSHenry Tieman 	 */
583cac2a27cSHenry Tieman 	switch (flow) {
584cac2a27cSHenry Tieman 	case ICE_FLTR_PTYPE_NONF_IPV4_TCP:
585cac2a27cSHenry Tieman 		ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
586165d80d6SHenry Tieman 				   input->ip.v4.src_ip);
587cac2a27cSHenry Tieman 		ice_pkt_insert_u16(loc, ICE_IPV4_TCP_DST_PORT_OFFSET,
588165d80d6SHenry Tieman 				   input->ip.v4.src_port);
589cac2a27cSHenry Tieman 		ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
590165d80d6SHenry Tieman 				   input->ip.v4.dst_ip);
591cac2a27cSHenry Tieman 		ice_pkt_insert_u16(loc, ICE_IPV4_TCP_SRC_PORT_OFFSET,
592165d80d6SHenry Tieman 				   input->ip.v4.dst_port);
593*390bd141SQi Zhang 		ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
594cac2a27cSHenry Tieman 		if (frag)
595cac2a27cSHenry Tieman 			loc[20] = ICE_FDIR_IPV4_PKT_FLAG_DF;
596cac2a27cSHenry Tieman 		break;
597cac2a27cSHenry Tieman 	case ICE_FLTR_PTYPE_NONF_IPV4_UDP:
598cac2a27cSHenry Tieman 		ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
599165d80d6SHenry Tieman 				   input->ip.v4.src_ip);
600cac2a27cSHenry Tieman 		ice_pkt_insert_u16(loc, ICE_IPV4_UDP_DST_PORT_OFFSET,
601165d80d6SHenry Tieman 				   input->ip.v4.src_port);
602cac2a27cSHenry Tieman 		ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
603165d80d6SHenry Tieman 				   input->ip.v4.dst_ip);
604cac2a27cSHenry Tieman 		ice_pkt_insert_u16(loc, ICE_IPV4_UDP_SRC_PORT_OFFSET,
605165d80d6SHenry Tieman 				   input->ip.v4.dst_port);
606*390bd141SQi Zhang 		ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
607*390bd141SQi Zhang 		ice_pkt_insert_mac_addr(loc + ETH_ALEN,
608*390bd141SQi Zhang 					input->ext_data.src_mac);
609cac2a27cSHenry Tieman 		break;
610cac2a27cSHenry Tieman 	case ICE_FLTR_PTYPE_NONF_IPV4_SCTP:
611cac2a27cSHenry Tieman 		ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
612165d80d6SHenry Tieman 				   input->ip.v4.src_ip);
613cac2a27cSHenry Tieman 		ice_pkt_insert_u16(loc, ICE_IPV4_SCTP_DST_PORT_OFFSET,
614165d80d6SHenry Tieman 				   input->ip.v4.src_port);
615cac2a27cSHenry Tieman 		ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
616165d80d6SHenry Tieman 				   input->ip.v4.dst_ip);
617cac2a27cSHenry Tieman 		ice_pkt_insert_u16(loc, ICE_IPV4_SCTP_SRC_PORT_OFFSET,
618165d80d6SHenry Tieman 				   input->ip.v4.dst_port);
619*390bd141SQi Zhang 		ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
620cac2a27cSHenry Tieman 		break;
621cac2a27cSHenry Tieman 	case ICE_FLTR_PTYPE_NONF_IPV4_OTHER:
622cac2a27cSHenry Tieman 		ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
623165d80d6SHenry Tieman 				   input->ip.v4.src_ip);
624cac2a27cSHenry Tieman 		ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
625165d80d6SHenry Tieman 				   input->ip.v4.dst_ip);
626cac2a27cSHenry Tieman 		ice_pkt_insert_u16(loc, ICE_IPV4_PROTO_OFFSET, 0);
627*390bd141SQi Zhang 		ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
628cac2a27cSHenry Tieman 		break;
629165d80d6SHenry Tieman 	case ICE_FLTR_PTYPE_NONF_IPV6_TCP:
630165d80d6SHenry Tieman 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
631165d80d6SHenry Tieman 					 input->ip.v6.src_ip);
632165d80d6SHenry Tieman 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
633165d80d6SHenry Tieman 					 input->ip.v6.dst_ip);
634165d80d6SHenry Tieman 		ice_pkt_insert_u16(loc, ICE_IPV6_TCP_DST_PORT_OFFSET,
635165d80d6SHenry Tieman 				   input->ip.v6.src_port);
636165d80d6SHenry Tieman 		ice_pkt_insert_u16(loc, ICE_IPV6_TCP_SRC_PORT_OFFSET,
637165d80d6SHenry Tieman 				   input->ip.v6.dst_port);
638*390bd141SQi Zhang 		ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
639165d80d6SHenry Tieman 		break;
640165d80d6SHenry Tieman 	case ICE_FLTR_PTYPE_NONF_IPV6_UDP:
641165d80d6SHenry Tieman 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
642165d80d6SHenry Tieman 					 input->ip.v6.src_ip);
643165d80d6SHenry Tieman 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
644165d80d6SHenry Tieman 					 input->ip.v6.dst_ip);
645165d80d6SHenry Tieman 		ice_pkt_insert_u16(loc, ICE_IPV6_UDP_DST_PORT_OFFSET,
646165d80d6SHenry Tieman 				   input->ip.v6.src_port);
647165d80d6SHenry Tieman 		ice_pkt_insert_u16(loc, ICE_IPV6_UDP_SRC_PORT_OFFSET,
648165d80d6SHenry Tieman 				   input->ip.v6.dst_port);
649*390bd141SQi Zhang 		ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
650165d80d6SHenry Tieman 		break;
651165d80d6SHenry Tieman 	case ICE_FLTR_PTYPE_NONF_IPV6_SCTP:
652165d80d6SHenry Tieman 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
653165d80d6SHenry Tieman 					 input->ip.v6.src_ip);
654165d80d6SHenry Tieman 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
655165d80d6SHenry Tieman 					 input->ip.v6.dst_ip);
656165d80d6SHenry Tieman 		ice_pkt_insert_u16(loc, ICE_IPV6_SCTP_DST_PORT_OFFSET,
657165d80d6SHenry Tieman 				   input->ip.v6.src_port);
658165d80d6SHenry Tieman 		ice_pkt_insert_u16(loc, ICE_IPV6_SCTP_SRC_PORT_OFFSET,
659165d80d6SHenry Tieman 				   input->ip.v6.dst_port);
660*390bd141SQi Zhang 		ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
661165d80d6SHenry Tieman 		break;
662165d80d6SHenry Tieman 	case ICE_FLTR_PTYPE_NONF_IPV6_OTHER:
663165d80d6SHenry Tieman 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
664165d80d6SHenry Tieman 					 input->ip.v6.src_ip);
665165d80d6SHenry Tieman 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
666165d80d6SHenry Tieman 					 input->ip.v6.dst_ip);
667*390bd141SQi Zhang 		ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
668165d80d6SHenry Tieman 		break;
669cac2a27cSHenry Tieman 	default:
670cac2a27cSHenry Tieman 		return ICE_ERR_PARAM;
671cac2a27cSHenry Tieman 	}
672cac2a27cSHenry Tieman 
6732c57ffcbSHenry Tieman 	if (input->flex_fltr)
6742c57ffcbSHenry Tieman 		ice_pkt_insert_u16(loc, input->flex_offset, input->flex_word);
6752c57ffcbSHenry Tieman 
676cac2a27cSHenry Tieman 	return 0;
677cac2a27cSHenry Tieman }
678cac2a27cSHenry Tieman 
679cac2a27cSHenry Tieman /**
680cac2a27cSHenry Tieman  * ice_fdir_has_frag - does flow type have 2 ptypes
681cac2a27cSHenry Tieman  * @flow: flow ptype
682cac2a27cSHenry Tieman  *
683cac2a27cSHenry Tieman  * returns true is there is a fragment packet for this ptype
684cac2a27cSHenry Tieman  */
685cac2a27cSHenry Tieman bool ice_fdir_has_frag(enum ice_fltr_ptype flow)
686cac2a27cSHenry Tieman {
687cac2a27cSHenry Tieman 	if (flow == ICE_FLTR_PTYPE_NONF_IPV4_OTHER)
688cac2a27cSHenry Tieman 		return true;
689cac2a27cSHenry Tieman 	else
690cac2a27cSHenry Tieman 		return false;
691cac2a27cSHenry Tieman }
692cac2a27cSHenry Tieman 
693cac2a27cSHenry Tieman /**
6944ab95646SHenry Tieman  * ice_fdir_find_by_idx - find filter with idx
6954ab95646SHenry Tieman  * @hw: pointer to hardware structure
6964ab95646SHenry Tieman  * @fltr_idx: index to find.
6974ab95646SHenry Tieman  *
6984ab95646SHenry Tieman  * Returns pointer to filter if found or null
6994ab95646SHenry Tieman  */
7004ab95646SHenry Tieman struct ice_fdir_fltr *
7014ab95646SHenry Tieman ice_fdir_find_fltr_by_idx(struct ice_hw *hw, u32 fltr_idx)
7024ab95646SHenry Tieman {
7034ab95646SHenry Tieman 	struct ice_fdir_fltr *rule;
7044ab95646SHenry Tieman 
7054ab95646SHenry Tieman 	list_for_each_entry(rule, &hw->fdir_list_head, fltr_node) {
7064ab95646SHenry Tieman 		/* rule ID found in the list */
7074ab95646SHenry Tieman 		if (fltr_idx == rule->fltr_id)
7084ab95646SHenry Tieman 			return rule;
7094ab95646SHenry Tieman 		if (fltr_idx < rule->fltr_id)
7104ab95646SHenry Tieman 			break;
7114ab95646SHenry Tieman 	}
7124ab95646SHenry Tieman 	return NULL;
7134ab95646SHenry Tieman }
714cac2a27cSHenry Tieman 
715cac2a27cSHenry Tieman /**
716cac2a27cSHenry Tieman  * ice_fdir_list_add_fltr - add a new node to the flow director filter list
717cac2a27cSHenry Tieman  * @hw: hardware structure
718cac2a27cSHenry Tieman  * @fltr: filter node to add to structure
719cac2a27cSHenry Tieman  */
720cac2a27cSHenry Tieman void ice_fdir_list_add_fltr(struct ice_hw *hw, struct ice_fdir_fltr *fltr)
721cac2a27cSHenry Tieman {
722cac2a27cSHenry Tieman 	struct ice_fdir_fltr *rule, *parent = NULL;
723cac2a27cSHenry Tieman 
724cac2a27cSHenry Tieman 	list_for_each_entry(rule, &hw->fdir_list_head, fltr_node) {
725cac2a27cSHenry Tieman 		/* rule ID found or pass its spot in the list */
726cac2a27cSHenry Tieman 		if (rule->fltr_id >= fltr->fltr_id)
727cac2a27cSHenry Tieman 			break;
728cac2a27cSHenry Tieman 		parent = rule;
729cac2a27cSHenry Tieman 	}
730cac2a27cSHenry Tieman 
731cac2a27cSHenry Tieman 	if (parent)
732cac2a27cSHenry Tieman 		list_add(&fltr->fltr_node, &parent->fltr_node);
733cac2a27cSHenry Tieman 	else
734cac2a27cSHenry Tieman 		list_add(&fltr->fltr_node, &hw->fdir_list_head);
735cac2a27cSHenry Tieman }
736cac2a27cSHenry Tieman 
737cac2a27cSHenry Tieman /**
738cac2a27cSHenry Tieman  * ice_fdir_update_cntrs - increment / decrement filter counter
739cac2a27cSHenry Tieman  * @hw: pointer to hardware structure
740cac2a27cSHenry Tieman  * @flow: filter flow type
741cac2a27cSHenry Tieman  * @add: true implies filters added
742cac2a27cSHenry Tieman  */
743cac2a27cSHenry Tieman void
744cac2a27cSHenry Tieman ice_fdir_update_cntrs(struct ice_hw *hw, enum ice_fltr_ptype flow, bool add)
745cac2a27cSHenry Tieman {
746cac2a27cSHenry Tieman 	int incr;
747cac2a27cSHenry Tieman 
748cac2a27cSHenry Tieman 	incr = add ? 1 : -1;
749cac2a27cSHenry Tieman 	hw->fdir_active_fltr += incr;
750cac2a27cSHenry Tieman 
751cac2a27cSHenry Tieman 	if (flow == ICE_FLTR_PTYPE_NONF_NONE || flow >= ICE_FLTR_PTYPE_MAX)
752cac2a27cSHenry Tieman 		ice_debug(hw, ICE_DBG_SW, "Unknown filter type %d\n", flow);
753cac2a27cSHenry Tieman 	else
754cac2a27cSHenry Tieman 		hw->fdir_fltr_cnt[flow] += incr;
755cac2a27cSHenry Tieman }
756cac2a27cSHenry Tieman 
757cac2a27cSHenry Tieman /**
758165d80d6SHenry Tieman  * ice_cmp_ipv6_addr - compare 2 IP v6 addresses
759165d80d6SHenry Tieman  * @a: IP v6 address
760165d80d6SHenry Tieman  * @b: IP v6 address
761165d80d6SHenry Tieman  *
762165d80d6SHenry Tieman  * Returns 0 on equal, returns non-0 if different
763165d80d6SHenry Tieman  */
764165d80d6SHenry Tieman static int ice_cmp_ipv6_addr(__be32 *a, __be32 *b)
765165d80d6SHenry Tieman {
766165d80d6SHenry Tieman 	return memcmp(a, b, 4 * sizeof(__be32));
767165d80d6SHenry Tieman }
768165d80d6SHenry Tieman 
769165d80d6SHenry Tieman /**
770cac2a27cSHenry Tieman  * ice_fdir_comp_rules - compare 2 filters
771cac2a27cSHenry Tieman  * @a: a Flow Director filter data structure
772cac2a27cSHenry Tieman  * @b: a Flow Director filter data structure
773165d80d6SHenry Tieman  * @v6: bool true if v6 filter
774cac2a27cSHenry Tieman  *
775cac2a27cSHenry Tieman  * Returns true if the filters match
776cac2a27cSHenry Tieman  */
777cac2a27cSHenry Tieman static bool
778165d80d6SHenry Tieman ice_fdir_comp_rules(struct ice_fdir_fltr *a,  struct ice_fdir_fltr *b, bool v6)
779cac2a27cSHenry Tieman {
780cac2a27cSHenry Tieman 	enum ice_fltr_ptype flow_type = a->flow_type;
781cac2a27cSHenry Tieman 
782cac2a27cSHenry Tieman 	/* The calling function already checks that the two filters have the
783cac2a27cSHenry Tieman 	 * same flow_type.
784cac2a27cSHenry Tieman 	 */
785165d80d6SHenry Tieman 	if (!v6) {
786cac2a27cSHenry Tieman 		if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_TCP ||
787cac2a27cSHenry Tieman 		    flow_type == ICE_FLTR_PTYPE_NONF_IPV4_UDP ||
788cac2a27cSHenry Tieman 		    flow_type == ICE_FLTR_PTYPE_NONF_IPV4_SCTP) {
789165d80d6SHenry Tieman 			if (a->ip.v4.dst_ip == b->ip.v4.dst_ip &&
790165d80d6SHenry Tieman 			    a->ip.v4.src_ip == b->ip.v4.src_ip &&
791165d80d6SHenry Tieman 			    a->ip.v4.dst_port == b->ip.v4.dst_port &&
792165d80d6SHenry Tieman 			    a->ip.v4.src_port == b->ip.v4.src_port)
793cac2a27cSHenry Tieman 				return true;
794cac2a27cSHenry Tieman 		} else if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER) {
795165d80d6SHenry Tieman 			if (a->ip.v4.dst_ip == b->ip.v4.dst_ip &&
796165d80d6SHenry Tieman 			    a->ip.v4.src_ip == b->ip.v4.src_ip &&
797165d80d6SHenry Tieman 			    a->ip.v4.l4_header == b->ip.v4.l4_header &&
798165d80d6SHenry Tieman 			    a->ip.v4.proto == b->ip.v4.proto &&
799165d80d6SHenry Tieman 			    a->ip.v4.ip_ver == b->ip.v4.ip_ver &&
800165d80d6SHenry Tieman 			    a->ip.v4.tos == b->ip.v4.tos)
801cac2a27cSHenry Tieman 				return true;
802cac2a27cSHenry Tieman 		}
803165d80d6SHenry Tieman 	} else {
804165d80d6SHenry Tieman 		if (flow_type == ICE_FLTR_PTYPE_NONF_IPV6_UDP ||
805165d80d6SHenry Tieman 		    flow_type == ICE_FLTR_PTYPE_NONF_IPV6_TCP ||
806165d80d6SHenry Tieman 		    flow_type == ICE_FLTR_PTYPE_NONF_IPV6_SCTP) {
807165d80d6SHenry Tieman 			if (a->ip.v6.dst_port == b->ip.v6.dst_port &&
808165d80d6SHenry Tieman 			    a->ip.v6.src_port == b->ip.v6.src_port &&
809165d80d6SHenry Tieman 			    !ice_cmp_ipv6_addr(a->ip.v6.dst_ip,
810165d80d6SHenry Tieman 					       b->ip.v6.dst_ip) &&
811165d80d6SHenry Tieman 			    !ice_cmp_ipv6_addr(a->ip.v6.src_ip,
812165d80d6SHenry Tieman 					       b->ip.v6.src_ip))
813165d80d6SHenry Tieman 				return true;
814165d80d6SHenry Tieman 		} else if (flow_type == ICE_FLTR_PTYPE_NONF_IPV6_OTHER) {
815165d80d6SHenry Tieman 			if (a->ip.v6.dst_port == b->ip.v6.dst_port &&
816165d80d6SHenry Tieman 			    a->ip.v6.src_port == b->ip.v6.src_port)
817165d80d6SHenry Tieman 				return true;
818165d80d6SHenry Tieman 		}
819165d80d6SHenry Tieman 	}
820cac2a27cSHenry Tieman 
821cac2a27cSHenry Tieman 	return false;
822cac2a27cSHenry Tieman }
823cac2a27cSHenry Tieman 
824cac2a27cSHenry Tieman /**
825cac2a27cSHenry Tieman  * ice_fdir_is_dup_fltr - test if filter is already in list for PF
826cac2a27cSHenry Tieman  * @hw: hardware data structure
827cac2a27cSHenry Tieman  * @input: Flow Director filter data structure
828cac2a27cSHenry Tieman  *
829cac2a27cSHenry Tieman  * Returns true if the filter is found in the list
830cac2a27cSHenry Tieman  */
831cac2a27cSHenry Tieman bool ice_fdir_is_dup_fltr(struct ice_hw *hw, struct ice_fdir_fltr *input)
832cac2a27cSHenry Tieman {
833cac2a27cSHenry Tieman 	struct ice_fdir_fltr *rule;
834cac2a27cSHenry Tieman 	bool ret = false;
835cac2a27cSHenry Tieman 
836cac2a27cSHenry Tieman 	list_for_each_entry(rule, &hw->fdir_list_head, fltr_node) {
837cac2a27cSHenry Tieman 		enum ice_fltr_ptype flow_type;
838cac2a27cSHenry Tieman 
839cac2a27cSHenry Tieman 		if (rule->flow_type != input->flow_type)
840cac2a27cSHenry Tieman 			continue;
841cac2a27cSHenry Tieman 
842cac2a27cSHenry Tieman 		flow_type = input->flow_type;
843cac2a27cSHenry Tieman 		if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_TCP ||
844cac2a27cSHenry Tieman 		    flow_type == ICE_FLTR_PTYPE_NONF_IPV4_UDP ||
845cac2a27cSHenry Tieman 		    flow_type == ICE_FLTR_PTYPE_NONF_IPV4_SCTP ||
846cac2a27cSHenry Tieman 		    flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER)
847165d80d6SHenry Tieman 			ret = ice_fdir_comp_rules(rule, input, false);
848165d80d6SHenry Tieman 		else
849165d80d6SHenry Tieman 			ret = ice_fdir_comp_rules(rule, input, true);
850cac2a27cSHenry Tieman 		if (ret) {
851cac2a27cSHenry Tieman 			if (rule->fltr_id == input->fltr_id &&
852cac2a27cSHenry Tieman 			    rule->q_index != input->q_index)
853cac2a27cSHenry Tieman 				ret = false;
854cac2a27cSHenry Tieman 			else
855cac2a27cSHenry Tieman 				break;
856cac2a27cSHenry Tieman 		}
857cac2a27cSHenry Tieman 	}
858cac2a27cSHenry Tieman 
859cac2a27cSHenry Tieman 	return ret;
860cac2a27cSHenry Tieman }
861