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;
377*346bf250SQi Zhang 	} else if (input->dest_ctl ==
378*346bf250SQi Zhang 		   ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_OTHER) {
379*346bf250SQi Zhang 		fdir_fltr_ctx.drop = ICE_FXD_FLTR_QW0_DROP_NO;
380*346bf250SQi Zhang 		fdir_fltr_ctx.qindex = 0;
381cac2a27cSHenry Tieman 	} else {
382*346bf250SQi Zhang 		if (input->dest_ctl ==
383*346bf250SQi Zhang 		    ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_QGROUP)
384*346bf250SQi Zhang 			fdir_fltr_ctx.toq = input->q_region;
385cac2a27cSHenry Tieman 		fdir_fltr_ctx.drop = ICE_FXD_FLTR_QW0_DROP_NO;
386cac2a27cSHenry Tieman 		fdir_fltr_ctx.qindex = input->q_index;
387cac2a27cSHenry Tieman 	}
3881f7ea1cdSQi Zhang 	fdir_fltr_ctx.cnt_ena = input->cnt_ena;
389cac2a27cSHenry Tieman 	fdir_fltr_ctx.cnt_index = input->cnt_index;
390cac2a27cSHenry Tieman 	fdir_fltr_ctx.fd_vsi = ice_get_hw_vsi_num(hw, input->dest_vsi);
391cac2a27cSHenry Tieman 	fdir_fltr_ctx.evict_ena = ICE_FXD_FLTR_QW0_EVICT_ENA_FALSE;
392*346bf250SQi Zhang 	if (input->dest_ctl == ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_OTHER)
393*346bf250SQi Zhang 		fdir_fltr_ctx.toq_prio = 0;
394*346bf250SQi Zhang 	else
395cac2a27cSHenry Tieman 		fdir_fltr_ctx.toq_prio = 3;
396cac2a27cSHenry Tieman 	fdir_fltr_ctx.pcmd = add ? ICE_FXD_FLTR_QW1_PCMD_ADD :
397cac2a27cSHenry Tieman 		ICE_FXD_FLTR_QW1_PCMD_REMOVE;
398cac2a27cSHenry Tieman 	fdir_fltr_ctx.swap = ICE_FXD_FLTR_QW1_SWAP_NOT_SET;
399cac2a27cSHenry Tieman 	fdir_fltr_ctx.comp_q = ICE_FXD_FLTR_QW0_COMP_Q_ZERO;
4001f7ea1cdSQi Zhang 	fdir_fltr_ctx.comp_report = input->comp_report;
4011f7ea1cdSQi Zhang 	fdir_fltr_ctx.fdid_prio = input->fdid_prio;
402cac2a27cSHenry Tieman 	fdir_fltr_ctx.desc_prof = 1;
403cac2a27cSHenry Tieman 	fdir_fltr_ctx.desc_prof_prio = 3;
404cac2a27cSHenry Tieman 	ice_set_fd_desc_val(&fdir_fltr_ctx, fdesc);
405cac2a27cSHenry Tieman }
406cac2a27cSHenry Tieman 
407148beb61SHenry Tieman /**
408148beb61SHenry Tieman  * ice_alloc_fd_res_cntr - obtain counter resource for FD type
409148beb61SHenry Tieman  * @hw: pointer to the hardware structure
410148beb61SHenry Tieman  * @cntr_id: returns counter index
411148beb61SHenry Tieman  */
412148beb61SHenry Tieman enum ice_status ice_alloc_fd_res_cntr(struct ice_hw *hw, u16 *cntr_id)
413148beb61SHenry Tieman {
414148beb61SHenry Tieman 	return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_COUNTER_BLOCK,
415148beb61SHenry Tieman 				  ICE_AQC_RES_TYPE_FLAG_DEDICATED, 1, cntr_id);
416148beb61SHenry Tieman }
417148beb61SHenry Tieman 
418148beb61SHenry Tieman /**
419148beb61SHenry Tieman  * ice_free_fd_res_cntr - Free counter resource for FD type
420148beb61SHenry Tieman  * @hw: pointer to the hardware structure
421148beb61SHenry Tieman  * @cntr_id: counter index to be freed
422148beb61SHenry Tieman  */
423148beb61SHenry Tieman enum ice_status ice_free_fd_res_cntr(struct ice_hw *hw, u16 cntr_id)
424148beb61SHenry Tieman {
425148beb61SHenry Tieman 	return ice_free_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_COUNTER_BLOCK,
426148beb61SHenry Tieman 				 ICE_AQC_RES_TYPE_FLAG_DEDICATED, 1, cntr_id);
427148beb61SHenry Tieman }
428148beb61SHenry Tieman 
429148beb61SHenry Tieman /**
430148beb61SHenry Tieman  * ice_alloc_fd_guar_item - allocate resource for FD guaranteed entries
431148beb61SHenry Tieman  * @hw: pointer to the hardware structure
432148beb61SHenry Tieman  * @cntr_id: returns counter index
433148beb61SHenry Tieman  * @num_fltr: number of filter entries to be allocated
434148beb61SHenry Tieman  */
435148beb61SHenry Tieman enum ice_status
436148beb61SHenry Tieman ice_alloc_fd_guar_item(struct ice_hw *hw, u16 *cntr_id, u16 num_fltr)
437148beb61SHenry Tieman {
438148beb61SHenry Tieman 	return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_GUARANTEED_ENTRIES,
439148beb61SHenry Tieman 				  ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr,
440148beb61SHenry Tieman 				  cntr_id);
441148beb61SHenry Tieman }
442148beb61SHenry Tieman 
443148beb61SHenry Tieman /**
444148beb61SHenry Tieman  * ice_alloc_fd_shrd_item - allocate resource for flow director shared entries
445148beb61SHenry Tieman  * @hw: pointer to the hardware structure
446148beb61SHenry Tieman  * @cntr_id: returns counter index
447148beb61SHenry Tieman  * @num_fltr: number of filter entries to be allocated
448148beb61SHenry Tieman  */
449148beb61SHenry Tieman enum ice_status
450148beb61SHenry Tieman ice_alloc_fd_shrd_item(struct ice_hw *hw, u16 *cntr_id, u16 num_fltr)
451148beb61SHenry Tieman {
452148beb61SHenry Tieman 	return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_SHARED_ENTRIES,
453148beb61SHenry Tieman 				  ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr,
454148beb61SHenry Tieman 				  cntr_id);
455148beb61SHenry Tieman }
4564ab95646SHenry Tieman 
4574ab95646SHenry Tieman /**
4584ab95646SHenry Tieman  * ice_get_fdir_cnt_all - get the number of Flow Director filters
4594ab95646SHenry Tieman  * @hw: hardware data structure
4604ab95646SHenry Tieman  *
4614ab95646SHenry Tieman  * Returns the number of filters available on device
4624ab95646SHenry Tieman  */
4634ab95646SHenry Tieman int ice_get_fdir_cnt_all(struct ice_hw *hw)
4644ab95646SHenry Tieman {
4654ab95646SHenry Tieman 	return hw->func_caps.fd_fltr_guar + hw->func_caps.fd_fltr_best_effort;
4664ab95646SHenry Tieman }
4674ab95646SHenry Tieman 
4684ab95646SHenry Tieman /**
469165d80d6SHenry Tieman  * ice_pkt_insert_ipv6_addr - insert a be32 IPv6 address into a memory buffer
470165d80d6SHenry Tieman  * @pkt: packet buffer
471165d80d6SHenry Tieman  * @offset: offset into buffer
472165d80d6SHenry Tieman  * @addr: IPv6 address to convert and insert into pkt at offset
473165d80d6SHenry Tieman  */
474165d80d6SHenry Tieman static void ice_pkt_insert_ipv6_addr(u8 *pkt, int offset, __be32 *addr)
475165d80d6SHenry Tieman {
476165d80d6SHenry Tieman 	int idx;
477165d80d6SHenry Tieman 
478165d80d6SHenry Tieman 	for (idx = 0; idx < ICE_IPV6_ADDR_LEN_AS_U32; idx++)
479165d80d6SHenry Tieman 		memcpy(pkt + offset + idx * sizeof(*addr), &addr[idx],
480165d80d6SHenry Tieman 		       sizeof(*addr));
481165d80d6SHenry Tieman }
482165d80d6SHenry Tieman 
483165d80d6SHenry Tieman /**
484b199dddbSQi Zhang  * ice_pkt_insert_u8 - insert a u8 value into a memory buffer.
485b199dddbSQi Zhang  * @pkt: packet buffer
486b199dddbSQi Zhang  * @offset: offset into buffer
487b199dddbSQi Zhang  * @data: 8 bit value to convert and insert into pkt at offset
488b199dddbSQi Zhang  */
489b199dddbSQi Zhang static void ice_pkt_insert_u8(u8 *pkt, int offset, u8 data)
490b199dddbSQi Zhang {
491b199dddbSQi Zhang 	memcpy(pkt + offset, &data, sizeof(data));
492b199dddbSQi Zhang }
493b199dddbSQi Zhang 
494b199dddbSQi Zhang /**
495b199dddbSQi Zhang  * ice_pkt_insert_u8_tc - insert a u8 value into a memory buffer for TC ipv6.
496b199dddbSQi Zhang  * @pkt: packet buffer
497b199dddbSQi Zhang  * @offset: offset into buffer
498b199dddbSQi Zhang  * @data: 8 bit value to convert and insert into pkt at offset
499b199dddbSQi Zhang  *
500b199dddbSQi Zhang  * This function is designed for inserting Traffic Class (TC) for IPv6,
501b199dddbSQi Zhang  * since that TC is not aligned in number of bytes. Here we split it out
502b199dddbSQi Zhang  * into two part and fill each byte with data copy from pkt, then insert
503b199dddbSQi Zhang  * the two bytes data one by one.
504b199dddbSQi Zhang  */
505b199dddbSQi Zhang static void ice_pkt_insert_u8_tc(u8 *pkt, int offset, u8 data)
506b199dddbSQi Zhang {
507b199dddbSQi Zhang 	u8 high, low;
508b199dddbSQi Zhang 
509b199dddbSQi Zhang 	high = (data >> 4) + (*(pkt + offset) & 0xF0);
510b199dddbSQi Zhang 	memcpy(pkt + offset, &high, sizeof(high));
511b199dddbSQi Zhang 
512b199dddbSQi Zhang 	low = (*(pkt + offset + 1) & 0x0F) + ((data & 0x0F) << 4);
513b199dddbSQi Zhang 	memcpy(pkt + offset + 1, &low, sizeof(low));
514b199dddbSQi Zhang }
515b199dddbSQi Zhang 
516b199dddbSQi Zhang /**
517cac2a27cSHenry Tieman  * ice_pkt_insert_u16 - insert a be16 value into a memory buffer
518cac2a27cSHenry Tieman  * @pkt: packet buffer
519cac2a27cSHenry Tieman  * @offset: offset into buffer
520cac2a27cSHenry Tieman  * @data: 16 bit value to convert and insert into pkt at offset
521cac2a27cSHenry Tieman  */
522cac2a27cSHenry Tieman static void ice_pkt_insert_u16(u8 *pkt, int offset, __be16 data)
523cac2a27cSHenry Tieman {
524cac2a27cSHenry Tieman 	memcpy(pkt + offset, &data, sizeof(data));
525cac2a27cSHenry Tieman }
526cac2a27cSHenry Tieman 
527cac2a27cSHenry Tieman /**
528cac2a27cSHenry Tieman  * ice_pkt_insert_u32 - insert a be32 value into a memory buffer
529cac2a27cSHenry Tieman  * @pkt: packet buffer
530cac2a27cSHenry Tieman  * @offset: offset into buffer
531cac2a27cSHenry Tieman  * @data: 32 bit value to convert and insert into pkt at offset
532cac2a27cSHenry Tieman  */
533cac2a27cSHenry Tieman static void ice_pkt_insert_u32(u8 *pkt, int offset, __be32 data)
534cac2a27cSHenry Tieman {
535cac2a27cSHenry Tieman 	memcpy(pkt + offset, &data, sizeof(data));
536cac2a27cSHenry Tieman }
537cac2a27cSHenry Tieman 
538cac2a27cSHenry Tieman /**
539390bd141SQi Zhang  * ice_pkt_insert_mac_addr - insert a MAC addr into a memory buffer.
540390bd141SQi Zhang  * @pkt: packet buffer
541390bd141SQi Zhang  * @addr: MAC address to convert and insert into pkt at offset
542390bd141SQi Zhang  */
543390bd141SQi Zhang static void ice_pkt_insert_mac_addr(u8 *pkt, u8 *addr)
544390bd141SQi Zhang {
545390bd141SQi Zhang 	ether_addr_copy(pkt, addr);
546390bd141SQi Zhang }
547390bd141SQi Zhang 
548390bd141SQi Zhang /**
549cac2a27cSHenry Tieman  * ice_fdir_get_gen_prgm_pkt - generate a training packet
550cac2a27cSHenry Tieman  * @hw: pointer to the hardware structure
551cac2a27cSHenry Tieman  * @input: flow director filter data structure
552cac2a27cSHenry Tieman  * @pkt: pointer to return filter packet
553cac2a27cSHenry Tieman  * @frag: generate a fragment packet
554cac2a27cSHenry Tieman  * @tun: true implies generate a tunnel packet
555cac2a27cSHenry Tieman  */
556cac2a27cSHenry Tieman enum ice_status
557cac2a27cSHenry Tieman ice_fdir_get_gen_prgm_pkt(struct ice_hw *hw, struct ice_fdir_fltr *input,
558cac2a27cSHenry Tieman 			  u8 *pkt, bool frag, bool tun)
559cac2a27cSHenry Tieman {
560cac2a27cSHenry Tieman 	enum ice_fltr_ptype flow;
561cac2a27cSHenry Tieman 	u16 tnl_port;
562cac2a27cSHenry Tieman 	u8 *loc;
563cac2a27cSHenry Tieman 	u16 idx;
564cac2a27cSHenry Tieman 
565cac2a27cSHenry Tieman 	if (input->flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER) {
566165d80d6SHenry Tieman 		switch (input->ip.v4.proto) {
567cac2a27cSHenry Tieman 		case IPPROTO_TCP:
568cac2a27cSHenry Tieman 			flow = ICE_FLTR_PTYPE_NONF_IPV4_TCP;
569cac2a27cSHenry Tieman 			break;
570cac2a27cSHenry Tieman 		case IPPROTO_UDP:
571cac2a27cSHenry Tieman 			flow = ICE_FLTR_PTYPE_NONF_IPV4_UDP;
572cac2a27cSHenry Tieman 			break;
573cac2a27cSHenry Tieman 		case IPPROTO_SCTP:
574cac2a27cSHenry Tieman 			flow = ICE_FLTR_PTYPE_NONF_IPV4_SCTP;
575cac2a27cSHenry Tieman 			break;
576b199dddbSQi Zhang 		default:
577cac2a27cSHenry Tieman 			flow = ICE_FLTR_PTYPE_NONF_IPV4_OTHER;
578cac2a27cSHenry Tieman 			break;
579cac2a27cSHenry Tieman 		}
580165d80d6SHenry Tieman 	} else if (input->flow_type == ICE_FLTR_PTYPE_NONF_IPV6_OTHER) {
581165d80d6SHenry Tieman 		switch (input->ip.v6.proto) {
582165d80d6SHenry Tieman 		case IPPROTO_TCP:
583165d80d6SHenry Tieman 			flow = ICE_FLTR_PTYPE_NONF_IPV6_TCP;
584165d80d6SHenry Tieman 			break;
585165d80d6SHenry Tieman 		case IPPROTO_UDP:
586165d80d6SHenry Tieman 			flow = ICE_FLTR_PTYPE_NONF_IPV6_UDP;
587165d80d6SHenry Tieman 			break;
588165d80d6SHenry Tieman 		case IPPROTO_SCTP:
589165d80d6SHenry Tieman 			flow = ICE_FLTR_PTYPE_NONF_IPV6_SCTP;
590165d80d6SHenry Tieman 			break;
591b199dddbSQi Zhang 		default:
592165d80d6SHenry Tieman 			flow = ICE_FLTR_PTYPE_NONF_IPV6_OTHER;
593165d80d6SHenry Tieman 			break;
594165d80d6SHenry Tieman 		}
595cac2a27cSHenry Tieman 	} else {
596cac2a27cSHenry Tieman 		flow = input->flow_type;
597cac2a27cSHenry Tieman 	}
598cac2a27cSHenry Tieman 
599cac2a27cSHenry Tieman 	for (idx = 0; idx < ICE_FDIR_NUM_PKT; idx++)
600cac2a27cSHenry Tieman 		if (ice_fdir_pkt[idx].flow == flow)
601cac2a27cSHenry Tieman 			break;
602cac2a27cSHenry Tieman 	if (idx == ICE_FDIR_NUM_PKT)
603cac2a27cSHenry Tieman 		return ICE_ERR_PARAM;
604cac2a27cSHenry Tieman 	if (!tun) {
605cac2a27cSHenry Tieman 		memcpy(pkt, ice_fdir_pkt[idx].pkt, ice_fdir_pkt[idx].pkt_len);
606cac2a27cSHenry Tieman 		loc = pkt;
607cac2a27cSHenry Tieman 	} else {
608f049b826SJakub Kicinski 		if (!ice_get_open_tunnel_port(hw, &tnl_port))
609cac2a27cSHenry Tieman 			return ICE_ERR_DOES_NOT_EXIST;
610cac2a27cSHenry Tieman 		if (!ice_fdir_pkt[idx].tun_pkt)
611cac2a27cSHenry Tieman 			return ICE_ERR_PARAM;
612cac2a27cSHenry Tieman 		memcpy(pkt, ice_fdir_pkt[idx].tun_pkt,
613cac2a27cSHenry Tieman 		       ice_fdir_pkt[idx].tun_pkt_len);
614cac2a27cSHenry Tieman 		ice_pkt_insert_u16(pkt, ICE_IPV4_UDP_DST_PORT_OFFSET,
615cac2a27cSHenry Tieman 				   htons(tnl_port));
616cac2a27cSHenry Tieman 		loc = &pkt[ICE_FDIR_TUN_PKT_OFF];
617cac2a27cSHenry Tieman 	}
618cac2a27cSHenry Tieman 
619cac2a27cSHenry Tieman 	/* Reverse the src and dst, since the HW expects them to be from Tx
620cac2a27cSHenry Tieman 	 * perspective. The input from user is from Rx filter perspective.
621cac2a27cSHenry Tieman 	 */
622cac2a27cSHenry Tieman 	switch (flow) {
623cac2a27cSHenry Tieman 	case ICE_FLTR_PTYPE_NONF_IPV4_TCP:
624cac2a27cSHenry Tieman 		ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
625165d80d6SHenry Tieman 				   input->ip.v4.src_ip);
626cac2a27cSHenry Tieman 		ice_pkt_insert_u16(loc, ICE_IPV4_TCP_DST_PORT_OFFSET,
627165d80d6SHenry Tieman 				   input->ip.v4.src_port);
628cac2a27cSHenry Tieman 		ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
629165d80d6SHenry Tieman 				   input->ip.v4.dst_ip);
630cac2a27cSHenry Tieman 		ice_pkt_insert_u16(loc, ICE_IPV4_TCP_SRC_PORT_OFFSET,
631165d80d6SHenry Tieman 				   input->ip.v4.dst_port);
632b199dddbSQi Zhang 		ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
633b199dddbSQi Zhang 		ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
634390bd141SQi Zhang 		ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
635cac2a27cSHenry Tieman 		if (frag)
636cac2a27cSHenry Tieman 			loc[20] = ICE_FDIR_IPV4_PKT_FLAG_DF;
637cac2a27cSHenry Tieman 		break;
638cac2a27cSHenry Tieman 	case ICE_FLTR_PTYPE_NONF_IPV4_UDP:
639cac2a27cSHenry Tieman 		ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
640165d80d6SHenry Tieman 				   input->ip.v4.src_ip);
641cac2a27cSHenry Tieman 		ice_pkt_insert_u16(loc, ICE_IPV4_UDP_DST_PORT_OFFSET,
642165d80d6SHenry Tieman 				   input->ip.v4.src_port);
643cac2a27cSHenry Tieman 		ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
644165d80d6SHenry Tieman 				   input->ip.v4.dst_ip);
645cac2a27cSHenry Tieman 		ice_pkt_insert_u16(loc, ICE_IPV4_UDP_SRC_PORT_OFFSET,
646165d80d6SHenry Tieman 				   input->ip.v4.dst_port);
647b199dddbSQi Zhang 		ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
648b199dddbSQi Zhang 		ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
649390bd141SQi Zhang 		ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
650390bd141SQi Zhang 		ice_pkt_insert_mac_addr(loc + ETH_ALEN,
651390bd141SQi Zhang 					input->ext_data.src_mac);
652cac2a27cSHenry Tieman 		break;
653cac2a27cSHenry Tieman 	case ICE_FLTR_PTYPE_NONF_IPV4_SCTP:
654cac2a27cSHenry Tieman 		ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
655165d80d6SHenry Tieman 				   input->ip.v4.src_ip);
656cac2a27cSHenry Tieman 		ice_pkt_insert_u16(loc, ICE_IPV4_SCTP_DST_PORT_OFFSET,
657165d80d6SHenry Tieman 				   input->ip.v4.src_port);
658cac2a27cSHenry Tieman 		ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
659165d80d6SHenry Tieman 				   input->ip.v4.dst_ip);
660cac2a27cSHenry Tieman 		ice_pkt_insert_u16(loc, ICE_IPV4_SCTP_SRC_PORT_OFFSET,
661165d80d6SHenry Tieman 				   input->ip.v4.dst_port);
662b199dddbSQi Zhang 		ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
663b199dddbSQi Zhang 		ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
664390bd141SQi Zhang 		ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
665cac2a27cSHenry Tieman 		break;
666cac2a27cSHenry Tieman 	case ICE_FLTR_PTYPE_NONF_IPV4_OTHER:
667cac2a27cSHenry Tieman 		ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
668165d80d6SHenry Tieman 				   input->ip.v4.src_ip);
669cac2a27cSHenry Tieman 		ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
670165d80d6SHenry Tieman 				   input->ip.v4.dst_ip);
671b199dddbSQi Zhang 		ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
672b199dddbSQi Zhang 		ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
673b199dddbSQi Zhang 		ice_pkt_insert_u8(loc, ICE_IPV4_PROTO_OFFSET,
674b199dddbSQi Zhang 				  input->ip.v4.proto);
675390bd141SQi Zhang 		ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
676cac2a27cSHenry Tieman 		break;
677165d80d6SHenry Tieman 	case ICE_FLTR_PTYPE_NONF_IPV6_TCP:
678165d80d6SHenry Tieman 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
679165d80d6SHenry Tieman 					 input->ip.v6.src_ip);
680165d80d6SHenry Tieman 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
681165d80d6SHenry Tieman 					 input->ip.v6.dst_ip);
682165d80d6SHenry Tieman 		ice_pkt_insert_u16(loc, ICE_IPV6_TCP_DST_PORT_OFFSET,
683165d80d6SHenry Tieman 				   input->ip.v6.src_port);
684165d80d6SHenry Tieman 		ice_pkt_insert_u16(loc, ICE_IPV6_TCP_SRC_PORT_OFFSET,
685165d80d6SHenry Tieman 				   input->ip.v6.dst_port);
686b199dddbSQi Zhang 		ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
687b199dddbSQi Zhang 		ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
688390bd141SQi Zhang 		ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
689165d80d6SHenry Tieman 		break;
690165d80d6SHenry Tieman 	case ICE_FLTR_PTYPE_NONF_IPV6_UDP:
691165d80d6SHenry Tieman 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
692165d80d6SHenry Tieman 					 input->ip.v6.src_ip);
693165d80d6SHenry Tieman 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
694165d80d6SHenry Tieman 					 input->ip.v6.dst_ip);
695165d80d6SHenry Tieman 		ice_pkt_insert_u16(loc, ICE_IPV6_UDP_DST_PORT_OFFSET,
696165d80d6SHenry Tieman 				   input->ip.v6.src_port);
697165d80d6SHenry Tieman 		ice_pkt_insert_u16(loc, ICE_IPV6_UDP_SRC_PORT_OFFSET,
698165d80d6SHenry Tieman 				   input->ip.v6.dst_port);
699b199dddbSQi Zhang 		ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
700b199dddbSQi Zhang 		ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
701390bd141SQi Zhang 		ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
702165d80d6SHenry Tieman 		break;
703165d80d6SHenry Tieman 	case ICE_FLTR_PTYPE_NONF_IPV6_SCTP:
704165d80d6SHenry Tieman 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
705165d80d6SHenry Tieman 					 input->ip.v6.src_ip);
706165d80d6SHenry Tieman 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
707165d80d6SHenry Tieman 					 input->ip.v6.dst_ip);
708165d80d6SHenry Tieman 		ice_pkt_insert_u16(loc, ICE_IPV6_SCTP_DST_PORT_OFFSET,
709165d80d6SHenry Tieman 				   input->ip.v6.src_port);
710165d80d6SHenry Tieman 		ice_pkt_insert_u16(loc, ICE_IPV6_SCTP_SRC_PORT_OFFSET,
711165d80d6SHenry Tieman 				   input->ip.v6.dst_port);
712b199dddbSQi Zhang 		ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
713b199dddbSQi Zhang 		ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
714390bd141SQi Zhang 		ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
715165d80d6SHenry Tieman 		break;
716165d80d6SHenry Tieman 	case ICE_FLTR_PTYPE_NONF_IPV6_OTHER:
717165d80d6SHenry Tieman 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
718165d80d6SHenry Tieman 					 input->ip.v6.src_ip);
719165d80d6SHenry Tieman 		ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
720165d80d6SHenry Tieman 					 input->ip.v6.dst_ip);
721b199dddbSQi Zhang 		ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
722b199dddbSQi Zhang 		ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
723b199dddbSQi Zhang 		ice_pkt_insert_u8(loc, ICE_IPV6_PROTO_OFFSET,
724b199dddbSQi Zhang 				  input->ip.v6.proto);
725390bd141SQi Zhang 		ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
726165d80d6SHenry Tieman 		break;
727cac2a27cSHenry Tieman 	default:
728cac2a27cSHenry Tieman 		return ICE_ERR_PARAM;
729cac2a27cSHenry Tieman 	}
730cac2a27cSHenry Tieman 
7312c57ffcbSHenry Tieman 	if (input->flex_fltr)
7322c57ffcbSHenry Tieman 		ice_pkt_insert_u16(loc, input->flex_offset, input->flex_word);
7332c57ffcbSHenry Tieman 
734cac2a27cSHenry Tieman 	return 0;
735cac2a27cSHenry Tieman }
736cac2a27cSHenry Tieman 
737cac2a27cSHenry Tieman /**
738cac2a27cSHenry Tieman  * ice_fdir_has_frag - does flow type have 2 ptypes
739cac2a27cSHenry Tieman  * @flow: flow ptype
740cac2a27cSHenry Tieman  *
741cac2a27cSHenry Tieman  * returns true is there is a fragment packet for this ptype
742cac2a27cSHenry Tieman  */
743cac2a27cSHenry Tieman bool ice_fdir_has_frag(enum ice_fltr_ptype flow)
744cac2a27cSHenry Tieman {
745cac2a27cSHenry Tieman 	if (flow == ICE_FLTR_PTYPE_NONF_IPV4_OTHER)
746cac2a27cSHenry Tieman 		return true;
747cac2a27cSHenry Tieman 	else
748cac2a27cSHenry Tieman 		return false;
749cac2a27cSHenry Tieman }
750cac2a27cSHenry Tieman 
751cac2a27cSHenry Tieman /**
7524ab95646SHenry Tieman  * ice_fdir_find_by_idx - find filter with idx
7534ab95646SHenry Tieman  * @hw: pointer to hardware structure
7544ab95646SHenry Tieman  * @fltr_idx: index to find.
7554ab95646SHenry Tieman  *
7564ab95646SHenry Tieman  * Returns pointer to filter if found or null
7574ab95646SHenry Tieman  */
7584ab95646SHenry Tieman struct ice_fdir_fltr *
7594ab95646SHenry Tieman ice_fdir_find_fltr_by_idx(struct ice_hw *hw, u32 fltr_idx)
7604ab95646SHenry Tieman {
7614ab95646SHenry Tieman 	struct ice_fdir_fltr *rule;
7624ab95646SHenry Tieman 
7634ab95646SHenry Tieman 	list_for_each_entry(rule, &hw->fdir_list_head, fltr_node) {
7644ab95646SHenry Tieman 		/* rule ID found in the list */
7654ab95646SHenry Tieman 		if (fltr_idx == rule->fltr_id)
7664ab95646SHenry Tieman 			return rule;
7674ab95646SHenry Tieman 		if (fltr_idx < rule->fltr_id)
7684ab95646SHenry Tieman 			break;
7694ab95646SHenry Tieman 	}
7704ab95646SHenry Tieman 	return NULL;
7714ab95646SHenry Tieman }
772cac2a27cSHenry Tieman 
773cac2a27cSHenry Tieman /**
774cac2a27cSHenry Tieman  * ice_fdir_list_add_fltr - add a new node to the flow director filter list
775cac2a27cSHenry Tieman  * @hw: hardware structure
776cac2a27cSHenry Tieman  * @fltr: filter node to add to structure
777cac2a27cSHenry Tieman  */
778cac2a27cSHenry Tieman void ice_fdir_list_add_fltr(struct ice_hw *hw, struct ice_fdir_fltr *fltr)
779cac2a27cSHenry Tieman {
780cac2a27cSHenry Tieman 	struct ice_fdir_fltr *rule, *parent = NULL;
781cac2a27cSHenry Tieman 
782cac2a27cSHenry Tieman 	list_for_each_entry(rule, &hw->fdir_list_head, fltr_node) {
783cac2a27cSHenry Tieman 		/* rule ID found or pass its spot in the list */
784cac2a27cSHenry Tieman 		if (rule->fltr_id >= fltr->fltr_id)
785cac2a27cSHenry Tieman 			break;
786cac2a27cSHenry Tieman 		parent = rule;
787cac2a27cSHenry Tieman 	}
788cac2a27cSHenry Tieman 
789cac2a27cSHenry Tieman 	if (parent)
790cac2a27cSHenry Tieman 		list_add(&fltr->fltr_node, &parent->fltr_node);
791cac2a27cSHenry Tieman 	else
792cac2a27cSHenry Tieman 		list_add(&fltr->fltr_node, &hw->fdir_list_head);
793cac2a27cSHenry Tieman }
794cac2a27cSHenry Tieman 
795cac2a27cSHenry Tieman /**
796cac2a27cSHenry Tieman  * ice_fdir_update_cntrs - increment / decrement filter counter
797cac2a27cSHenry Tieman  * @hw: pointer to hardware structure
798cac2a27cSHenry Tieman  * @flow: filter flow type
799cac2a27cSHenry Tieman  * @add: true implies filters added
800cac2a27cSHenry Tieman  */
801cac2a27cSHenry Tieman void
802cac2a27cSHenry Tieman ice_fdir_update_cntrs(struct ice_hw *hw, enum ice_fltr_ptype flow, bool add)
803cac2a27cSHenry Tieman {
804cac2a27cSHenry Tieman 	int incr;
805cac2a27cSHenry Tieman 
806cac2a27cSHenry Tieman 	incr = add ? 1 : -1;
807cac2a27cSHenry Tieman 	hw->fdir_active_fltr += incr;
808cac2a27cSHenry Tieman 
809cac2a27cSHenry Tieman 	if (flow == ICE_FLTR_PTYPE_NONF_NONE || flow >= ICE_FLTR_PTYPE_MAX)
810cac2a27cSHenry Tieman 		ice_debug(hw, ICE_DBG_SW, "Unknown filter type %d\n", flow);
811cac2a27cSHenry Tieman 	else
812cac2a27cSHenry Tieman 		hw->fdir_fltr_cnt[flow] += incr;
813cac2a27cSHenry Tieman }
814cac2a27cSHenry Tieman 
815cac2a27cSHenry Tieman /**
816165d80d6SHenry Tieman  * ice_cmp_ipv6_addr - compare 2 IP v6 addresses
817165d80d6SHenry Tieman  * @a: IP v6 address
818165d80d6SHenry Tieman  * @b: IP v6 address
819165d80d6SHenry Tieman  *
820165d80d6SHenry Tieman  * Returns 0 on equal, returns non-0 if different
821165d80d6SHenry Tieman  */
822165d80d6SHenry Tieman static int ice_cmp_ipv6_addr(__be32 *a, __be32 *b)
823165d80d6SHenry Tieman {
824165d80d6SHenry Tieman 	return memcmp(a, b, 4 * sizeof(__be32));
825165d80d6SHenry Tieman }
826165d80d6SHenry Tieman 
827165d80d6SHenry Tieman /**
828cac2a27cSHenry Tieman  * ice_fdir_comp_rules - compare 2 filters
829cac2a27cSHenry Tieman  * @a: a Flow Director filter data structure
830cac2a27cSHenry Tieman  * @b: a Flow Director filter data structure
831165d80d6SHenry Tieman  * @v6: bool true if v6 filter
832cac2a27cSHenry Tieman  *
833cac2a27cSHenry Tieman  * Returns true if the filters match
834cac2a27cSHenry Tieman  */
835cac2a27cSHenry Tieman static bool
836165d80d6SHenry Tieman ice_fdir_comp_rules(struct ice_fdir_fltr *a,  struct ice_fdir_fltr *b, bool v6)
837cac2a27cSHenry Tieman {
838cac2a27cSHenry Tieman 	enum ice_fltr_ptype flow_type = a->flow_type;
839cac2a27cSHenry Tieman 
840cac2a27cSHenry Tieman 	/* The calling function already checks that the two filters have the
841cac2a27cSHenry Tieman 	 * same flow_type.
842cac2a27cSHenry Tieman 	 */
843165d80d6SHenry Tieman 	if (!v6) {
844cac2a27cSHenry Tieman 		if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_TCP ||
845cac2a27cSHenry Tieman 		    flow_type == ICE_FLTR_PTYPE_NONF_IPV4_UDP ||
846cac2a27cSHenry Tieman 		    flow_type == ICE_FLTR_PTYPE_NONF_IPV4_SCTP) {
847165d80d6SHenry Tieman 			if (a->ip.v4.dst_ip == b->ip.v4.dst_ip &&
848165d80d6SHenry Tieman 			    a->ip.v4.src_ip == b->ip.v4.src_ip &&
849165d80d6SHenry Tieman 			    a->ip.v4.dst_port == b->ip.v4.dst_port &&
850165d80d6SHenry Tieman 			    a->ip.v4.src_port == b->ip.v4.src_port)
851cac2a27cSHenry Tieman 				return true;
852cac2a27cSHenry Tieman 		} else if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER) {
853165d80d6SHenry Tieman 			if (a->ip.v4.dst_ip == b->ip.v4.dst_ip &&
854165d80d6SHenry Tieman 			    a->ip.v4.src_ip == b->ip.v4.src_ip &&
855165d80d6SHenry Tieman 			    a->ip.v4.l4_header == b->ip.v4.l4_header &&
856165d80d6SHenry Tieman 			    a->ip.v4.proto == b->ip.v4.proto &&
857165d80d6SHenry Tieman 			    a->ip.v4.ip_ver == b->ip.v4.ip_ver &&
858165d80d6SHenry Tieman 			    a->ip.v4.tos == b->ip.v4.tos)
859cac2a27cSHenry Tieman 				return true;
860cac2a27cSHenry Tieman 		}
861165d80d6SHenry Tieman 	} else {
862165d80d6SHenry Tieman 		if (flow_type == ICE_FLTR_PTYPE_NONF_IPV6_UDP ||
863165d80d6SHenry Tieman 		    flow_type == ICE_FLTR_PTYPE_NONF_IPV6_TCP ||
864165d80d6SHenry Tieman 		    flow_type == ICE_FLTR_PTYPE_NONF_IPV6_SCTP) {
865165d80d6SHenry Tieman 			if (a->ip.v6.dst_port == b->ip.v6.dst_port &&
866165d80d6SHenry Tieman 			    a->ip.v6.src_port == b->ip.v6.src_port &&
867165d80d6SHenry Tieman 			    !ice_cmp_ipv6_addr(a->ip.v6.dst_ip,
868165d80d6SHenry Tieman 					       b->ip.v6.dst_ip) &&
869165d80d6SHenry Tieman 			    !ice_cmp_ipv6_addr(a->ip.v6.src_ip,
870165d80d6SHenry Tieman 					       b->ip.v6.src_ip))
871165d80d6SHenry Tieman 				return true;
872165d80d6SHenry Tieman 		} else if (flow_type == ICE_FLTR_PTYPE_NONF_IPV6_OTHER) {
873165d80d6SHenry Tieman 			if (a->ip.v6.dst_port == b->ip.v6.dst_port &&
874165d80d6SHenry Tieman 			    a->ip.v6.src_port == b->ip.v6.src_port)
875165d80d6SHenry Tieman 				return true;
876165d80d6SHenry Tieman 		}
877165d80d6SHenry Tieman 	}
878cac2a27cSHenry Tieman 
879cac2a27cSHenry Tieman 	return false;
880cac2a27cSHenry Tieman }
881cac2a27cSHenry Tieman 
882cac2a27cSHenry Tieman /**
883cac2a27cSHenry Tieman  * ice_fdir_is_dup_fltr - test if filter is already in list for PF
884cac2a27cSHenry Tieman  * @hw: hardware data structure
885cac2a27cSHenry Tieman  * @input: Flow Director filter data structure
886cac2a27cSHenry Tieman  *
887cac2a27cSHenry Tieman  * Returns true if the filter is found in the list
888cac2a27cSHenry Tieman  */
889cac2a27cSHenry Tieman bool ice_fdir_is_dup_fltr(struct ice_hw *hw, struct ice_fdir_fltr *input)
890cac2a27cSHenry Tieman {
891cac2a27cSHenry Tieman 	struct ice_fdir_fltr *rule;
892cac2a27cSHenry Tieman 	bool ret = false;
893cac2a27cSHenry Tieman 
894cac2a27cSHenry Tieman 	list_for_each_entry(rule, &hw->fdir_list_head, fltr_node) {
895cac2a27cSHenry Tieman 		enum ice_fltr_ptype flow_type;
896cac2a27cSHenry Tieman 
897cac2a27cSHenry Tieman 		if (rule->flow_type != input->flow_type)
898cac2a27cSHenry Tieman 			continue;
899cac2a27cSHenry Tieman 
900cac2a27cSHenry Tieman 		flow_type = input->flow_type;
901cac2a27cSHenry Tieman 		if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_TCP ||
902cac2a27cSHenry Tieman 		    flow_type == ICE_FLTR_PTYPE_NONF_IPV4_UDP ||
903cac2a27cSHenry Tieman 		    flow_type == ICE_FLTR_PTYPE_NONF_IPV4_SCTP ||
904cac2a27cSHenry Tieman 		    flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER)
905165d80d6SHenry Tieman 			ret = ice_fdir_comp_rules(rule, input, false);
906165d80d6SHenry Tieman 		else
907165d80d6SHenry Tieman 			ret = ice_fdir_comp_rules(rule, input, true);
908cac2a27cSHenry Tieman 		if (ret) {
909cac2a27cSHenry Tieman 			if (rule->fltr_id == input->fltr_id &&
910cac2a27cSHenry Tieman 			    rule->q_index != input->q_index)
911cac2a27cSHenry Tieman 				ret = false;
912cac2a27cSHenry Tieman 			else
913cac2a27cSHenry Tieman 				break;
914cac2a27cSHenry Tieman 		}
915cac2a27cSHenry Tieman 	}
916cac2a27cSHenry Tieman 
917cac2a27cSHenry Tieman 	return ret;
918cac2a27cSHenry Tieman }
919