Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 /* Copyright (C) 2018-2020, Intel Corporation. */
0003 
0004 #include "ice_common.h"
0005 
0006 /* These are training packet headers used to program flow director filters. */
0007 static const u8 ice_fdir_tcpv4_pkt[] = {
0008     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0009     0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
0010     0x00, 0x28, 0x00, 0x01, 0x00, 0x00, 0x40, 0x06,
0011     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0012     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0013     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00,
0014     0x20, 0x00, 0x00, 0x00, 0x00, 0x00
0015 };
0016 
0017 static const u8 ice_fdir_udpv4_pkt[] = {
0018     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0019     0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
0020     0x00, 0x1C, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
0021     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0022     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0023     0x00, 0x00,
0024 };
0025 
0026 static const u8 ice_fdir_sctpv4_pkt[] = {
0027     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0028     0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
0029     0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x40, 0x84,
0030     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0031     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0032     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0033 };
0034 
0035 static const u8 ice_fdir_ipv4_pkt[] = {
0036     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0037     0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
0038     0x00, 0x14, 0x00, 0x00, 0x40, 0x00, 0x40, 0x10,
0039     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0040     0x00, 0x00
0041 };
0042 
0043 static const u8 ice_fdir_udp4_gtpu4_pkt[] = {
0044     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0045     0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
0046     0x00, 0x4c, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
0047     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0048     0x00, 0x00, 0x08, 0x68, 0x08, 0x68, 0x00, 0x00,
0049     0x00, 0x00, 0x34, 0xff, 0x00, 0x28, 0x00, 0x00,
0050     0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x02, 0x00,
0051     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00,
0052     0x00, 0x1c, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
0053     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0054     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0055     0x00, 0x00,
0056 };
0057 
0058 static const u8 ice_fdir_tcp4_gtpu4_pkt[] = {
0059     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0060     0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
0061     0x00, 0x58, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
0062     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0063     0x00, 0x00, 0x08, 0x68, 0x08, 0x68, 0x00, 0x00,
0064     0x00, 0x00, 0x34, 0xff, 0x00, 0x28, 0x00, 0x00,
0065     0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x02, 0x00,
0066     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00,
0067     0x00, 0x28, 0x00, 0x00, 0x40, 0x00, 0x40, 0x06,
0068     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0069     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0070     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0071     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0072 };
0073 
0074 static const u8 ice_fdir_icmp4_gtpu4_pkt[] = {
0075     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0076     0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
0077     0x00, 0x4c, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
0078     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0079     0x00, 0x00, 0x08, 0x68, 0x08, 0x68, 0x00, 0x00,
0080     0x00, 0x00, 0x34, 0xff, 0x00, 0x28, 0x00, 0x00,
0081     0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x02, 0x00,
0082     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00,
0083     0x00, 0x1c, 0x00, 0x00, 0x40, 0x00, 0x40, 0x01,
0084     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0085     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0086     0x00, 0x00,
0087 };
0088 
0089 static const u8 ice_fdir_ipv4_gtpu4_pkt[] = {
0090     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0091     0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
0092     0x00, 0x44, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
0093     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0094     0x00, 0x00, 0x08, 0x68, 0x08, 0x68, 0x00, 0x00,
0095     0x00, 0x00, 0x34, 0xff, 0x00, 0x28, 0x00, 0x00,
0096     0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x02, 0x00,
0097     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00,
0098     0x00, 0x14, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00,
0099     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0100     0x00, 0x00,
0101 };
0102 
0103 static const u8 ice_fdir_ipv4_l2tpv3_pkt[] = {
0104     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0105     0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
0106     0x00, 0x14, 0x00, 0x00, 0x40, 0x00, 0x40, 0x73,
0107     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0108     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0109     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0110 };
0111 
0112 static const u8 ice_fdir_ipv6_l2tpv3_pkt[] = {
0113     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0114     0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
0115     0x00, 0x00, 0x00, 0x00, 0x73, 0x40, 0x00, 0x00,
0116     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0117     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0118     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0119     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0120     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0121     0x00, 0x00,
0122 };
0123 
0124 static const u8 ice_fdir_ipv4_esp_pkt[] = {
0125     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0126     0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
0127     0x00, 0x14, 0x00, 0x00, 0x40, 0x00, 0x40, 0x32,
0128     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0129     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0130     0x00, 0x00
0131 };
0132 
0133 static const u8 ice_fdir_ipv6_esp_pkt[] = {
0134     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0135     0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
0136     0x00, 0x00, 0x00, 0x00, 0x32, 0x40, 0x00, 0x00,
0137     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0138     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0139     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0140     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0141     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0142 };
0143 
0144 static const u8 ice_fdir_ipv4_ah_pkt[] = {
0145     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0146     0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
0147     0x00, 0x14, 0x00, 0x00, 0x40, 0x00, 0x40, 0x33,
0148     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0149     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0150     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0151     0x00, 0x00
0152 };
0153 
0154 static const u8 ice_fdir_ipv6_ah_pkt[] = {
0155     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0156     0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
0157     0x00, 0x00, 0x00, 0x00, 0x33, 0x40, 0x00, 0x00,
0158     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0159     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0160     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0161     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0162     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0163     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0164 };
0165 
0166 static const u8 ice_fdir_ipv4_nat_t_esp_pkt[] = {
0167     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0168     0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
0169     0x00, 0x1C, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
0170     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0171     0x00, 0x00, 0x00, 0x00, 0x11, 0x94, 0x00, 0x00,
0172     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0173     0x00, 0x00,
0174 };
0175 
0176 static const u8 ice_fdir_ipv6_nat_t_esp_pkt[] = {
0177     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0178     0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
0179     0x00, 0x00, 0x00, 0x08, 0x11, 0x40, 0x00, 0x00,
0180     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0181     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0182     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0183     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0184     0x11, 0x94, 0x00, 0x00, 0x00, 0x08,
0185 };
0186 
0187 static const u8 ice_fdir_ipv4_pfcp_node_pkt[] = {
0188     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0189     0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
0190     0x00, 0x2C, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
0191     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0192     0x00, 0x00, 0x22, 0x65, 0x22, 0x65, 0x00, 0x00,
0193     0x00, 0x00, 0x20, 0x00, 0x00, 0x10, 0x00, 0x00,
0194     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0195     0x00, 0x00,
0196 };
0197 
0198 static const u8 ice_fdir_ipv4_pfcp_session_pkt[] = {
0199     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0200     0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
0201     0x00, 0x2C, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
0202     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0203     0x00, 0x00, 0x22, 0x65, 0x22, 0x65, 0x00, 0x00,
0204     0x00, 0x00, 0x21, 0x00, 0x00, 0x10, 0x00, 0x00,
0205     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0206     0x00, 0x00,
0207 };
0208 
0209 static const u8 ice_fdir_ipv6_pfcp_node_pkt[] = {
0210     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0211     0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
0212     0x00, 0x00, 0x00, 0x18, 0x11, 0x40, 0x00, 0x00,
0213     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0214     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0215     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0216     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x65,
0217     0x22, 0x65, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00,
0218     0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0219     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0220 };
0221 
0222 static const u8 ice_fdir_ipv6_pfcp_session_pkt[] = {
0223     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0224     0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
0225     0x00, 0x00, 0x00, 0x18, 0x11, 0x40, 0x00, 0x00,
0226     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0227     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0228     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0229     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x65,
0230     0x22, 0x65, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00,
0231     0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0232     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0233 };
0234 
0235 static const u8 ice_fdir_non_ip_l2_pkt[] = {
0236     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0237     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0238     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0239 };
0240 
0241 static const u8 ice_fdir_tcpv6_pkt[] = {
0242     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0243     0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
0244     0x00, 0x00, 0x00, 0x14, 0x06, 0x40, 0x00, 0x00,
0245     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0246     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0247     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0248     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0249     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0250     0x00, 0x00, 0x50, 0x00, 0x20, 0x00, 0x00, 0x00,
0251     0x00, 0x00,
0252 };
0253 
0254 static const u8 ice_fdir_udpv6_pkt[] = {
0255     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0256     0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
0257     0x00, 0x00, 0x00, 0x08, 0x11, 0x40, 0x00, 0x00,
0258     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0259     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0260     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0261     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0262     0x00, 0x00, 0x00, 0x08, 0x00, 0x00,
0263 };
0264 
0265 static const u8 ice_fdir_sctpv6_pkt[] = {
0266     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0267     0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
0268     0x00, 0x00, 0x00, 0x0C, 0x84, 0x40, 0x00, 0x00,
0269     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0270     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0271     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0272     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0273     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0274     0x00, 0x00,
0275 };
0276 
0277 static const u8 ice_fdir_ipv6_pkt[] = {
0278     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0279     0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
0280     0x00, 0x00, 0x00, 0x00, 0x3B, 0x40, 0x00, 0x00,
0281     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0282     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0283     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0284     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0285 };
0286 
0287 static const u8 ice_fdir_tcp4_tun_pkt[] = {
0288     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0289     0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
0290     0x00, 0x5a, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
0291     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0292     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0293     0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
0294     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0295     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
0296     0x45, 0x00, 0x00, 0x28, 0x00, 0x00, 0x40, 0x00,
0297     0x40, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0298     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0299     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0300     0x50, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00,
0301 };
0302 
0303 static const u8 ice_fdir_udp4_tun_pkt[] = {
0304     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0305     0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
0306     0x00, 0x4e, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
0307     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0308     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0309     0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
0310     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0311     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
0312     0x45, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x40, 0x00,
0313     0x40, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0314     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0315     0x00, 0x00, 0x00, 0x00,
0316 };
0317 
0318 static const u8 ice_fdir_sctp4_tun_pkt[] = {
0319     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0320     0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
0321     0x00, 0x52, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
0322     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0323     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0324     0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
0325     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0326     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
0327     0x45, 0x00, 0x00, 0x20, 0x00, 0x01, 0x00, 0x00,
0328     0x40, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0329     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0330     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0331 };
0332 
0333 static const u8 ice_fdir_ip4_tun_pkt[] = {
0334     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0335     0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
0336     0x00, 0x46, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
0337     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0338     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0339     0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
0340     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0341     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
0342     0x45, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00,
0343     0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0344     0x00, 0x00, 0x00, 0x00,
0345 };
0346 
0347 static const u8 ice_fdir_tcp6_tun_pkt[] = {
0348     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0349     0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
0350     0x00, 0x6e, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
0351     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0352     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0353     0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
0354     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0355     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd,
0356     0x60, 0x00, 0x00, 0x00, 0x00, 0x14, 0x06, 0x40,
0357     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0358     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0359     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0360     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0361     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0362     0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x20, 0x00,
0363     0x00, 0x00, 0x00, 0x00,
0364 };
0365 
0366 static const u8 ice_fdir_udp6_tun_pkt[] = {
0367     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0368     0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
0369     0x00, 0x62, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
0370     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0371     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0372     0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
0373     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0374     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd,
0375     0x60, 0x00, 0x00, 0x00, 0x00, 0x08, 0x11, 0x40,
0376     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0377     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0378     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0379     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0380     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0381 };
0382 
0383 static const u8 ice_fdir_sctp6_tun_pkt[] = {
0384     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0385     0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
0386     0x00, 0x66, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
0387     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0388     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0389     0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
0390     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0391     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd,
0392     0x60, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x84, 0x40,
0393     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0394     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0395     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0396     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0397     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0398     0x00, 0x00, 0x00, 0x00,
0399 };
0400 
0401 static const u8 ice_fdir_ip6_tun_pkt[] = {
0402     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0403     0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
0404     0x00, 0x5a, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
0405     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0406     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0407     0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
0408     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0409     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd,
0410     0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3b, 0x40,
0411     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0412     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0413     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0414     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0415 };
0416 
0417 /* Flow Director no-op training packet table */
0418 static const struct ice_fdir_base_pkt ice_fdir_pkt[] = {
0419     {
0420         ICE_FLTR_PTYPE_NONF_IPV4_TCP,
0421         sizeof(ice_fdir_tcpv4_pkt), ice_fdir_tcpv4_pkt,
0422         sizeof(ice_fdir_tcp4_tun_pkt), ice_fdir_tcp4_tun_pkt,
0423     },
0424     {
0425         ICE_FLTR_PTYPE_NONF_IPV4_UDP,
0426         sizeof(ice_fdir_udpv4_pkt), ice_fdir_udpv4_pkt,
0427         sizeof(ice_fdir_udp4_tun_pkt), ice_fdir_udp4_tun_pkt,
0428     },
0429     {
0430         ICE_FLTR_PTYPE_NONF_IPV4_SCTP,
0431         sizeof(ice_fdir_sctpv4_pkt), ice_fdir_sctpv4_pkt,
0432         sizeof(ice_fdir_sctp4_tun_pkt), ice_fdir_sctp4_tun_pkt,
0433     },
0434     {
0435         ICE_FLTR_PTYPE_NONF_IPV4_OTHER,
0436         sizeof(ice_fdir_ipv4_pkt), ice_fdir_ipv4_pkt,
0437         sizeof(ice_fdir_ip4_tun_pkt), ice_fdir_ip4_tun_pkt,
0438     },
0439     {
0440         ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_UDP,
0441         sizeof(ice_fdir_udp4_gtpu4_pkt),
0442         ice_fdir_udp4_gtpu4_pkt,
0443         sizeof(ice_fdir_udp4_gtpu4_pkt),
0444         ice_fdir_udp4_gtpu4_pkt,
0445     },
0446     {
0447         ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_TCP,
0448         sizeof(ice_fdir_tcp4_gtpu4_pkt),
0449         ice_fdir_tcp4_gtpu4_pkt,
0450         sizeof(ice_fdir_tcp4_gtpu4_pkt),
0451         ice_fdir_tcp4_gtpu4_pkt,
0452     },
0453     {
0454         ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_ICMP,
0455         sizeof(ice_fdir_icmp4_gtpu4_pkt),
0456         ice_fdir_icmp4_gtpu4_pkt,
0457         sizeof(ice_fdir_icmp4_gtpu4_pkt),
0458         ice_fdir_icmp4_gtpu4_pkt,
0459     },
0460     {
0461         ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_OTHER,
0462         sizeof(ice_fdir_ipv4_gtpu4_pkt),
0463         ice_fdir_ipv4_gtpu4_pkt,
0464         sizeof(ice_fdir_ipv4_gtpu4_pkt),
0465         ice_fdir_ipv4_gtpu4_pkt,
0466     },
0467     {
0468         ICE_FLTR_PTYPE_NONF_IPV4_L2TPV3,
0469         sizeof(ice_fdir_ipv4_l2tpv3_pkt), ice_fdir_ipv4_l2tpv3_pkt,
0470         sizeof(ice_fdir_ipv4_l2tpv3_pkt), ice_fdir_ipv4_l2tpv3_pkt,
0471     },
0472     {
0473         ICE_FLTR_PTYPE_NONF_IPV6_L2TPV3,
0474         sizeof(ice_fdir_ipv6_l2tpv3_pkt), ice_fdir_ipv6_l2tpv3_pkt,
0475         sizeof(ice_fdir_ipv6_l2tpv3_pkt), ice_fdir_ipv6_l2tpv3_pkt,
0476     },
0477     {
0478         ICE_FLTR_PTYPE_NONF_IPV4_ESP,
0479         sizeof(ice_fdir_ipv4_esp_pkt), ice_fdir_ipv4_esp_pkt,
0480         sizeof(ice_fdir_ipv4_esp_pkt), ice_fdir_ipv4_esp_pkt,
0481     },
0482     {
0483         ICE_FLTR_PTYPE_NONF_IPV6_ESP,
0484         sizeof(ice_fdir_ipv6_esp_pkt), ice_fdir_ipv6_esp_pkt,
0485         sizeof(ice_fdir_ipv6_esp_pkt), ice_fdir_ipv6_esp_pkt,
0486     },
0487     {
0488         ICE_FLTR_PTYPE_NONF_IPV4_AH,
0489         sizeof(ice_fdir_ipv4_ah_pkt), ice_fdir_ipv4_ah_pkt,
0490         sizeof(ice_fdir_ipv4_ah_pkt), ice_fdir_ipv4_ah_pkt,
0491     },
0492     {
0493         ICE_FLTR_PTYPE_NONF_IPV6_AH,
0494         sizeof(ice_fdir_ipv6_ah_pkt), ice_fdir_ipv6_ah_pkt,
0495         sizeof(ice_fdir_ipv6_ah_pkt), ice_fdir_ipv6_ah_pkt,
0496     },
0497     {
0498         ICE_FLTR_PTYPE_NONF_IPV4_NAT_T_ESP,
0499         sizeof(ice_fdir_ipv4_nat_t_esp_pkt),
0500         ice_fdir_ipv4_nat_t_esp_pkt,
0501         sizeof(ice_fdir_ipv4_nat_t_esp_pkt),
0502         ice_fdir_ipv4_nat_t_esp_pkt,
0503     },
0504     {
0505         ICE_FLTR_PTYPE_NONF_IPV6_NAT_T_ESP,
0506         sizeof(ice_fdir_ipv6_nat_t_esp_pkt),
0507         ice_fdir_ipv6_nat_t_esp_pkt,
0508         sizeof(ice_fdir_ipv6_nat_t_esp_pkt),
0509         ice_fdir_ipv6_nat_t_esp_pkt,
0510     },
0511     {
0512         ICE_FLTR_PTYPE_NONF_IPV4_PFCP_NODE,
0513         sizeof(ice_fdir_ipv4_pfcp_node_pkt),
0514         ice_fdir_ipv4_pfcp_node_pkt,
0515         sizeof(ice_fdir_ipv4_pfcp_node_pkt),
0516         ice_fdir_ipv4_pfcp_node_pkt,
0517     },
0518     {
0519         ICE_FLTR_PTYPE_NONF_IPV4_PFCP_SESSION,
0520         sizeof(ice_fdir_ipv4_pfcp_session_pkt),
0521         ice_fdir_ipv4_pfcp_session_pkt,
0522         sizeof(ice_fdir_ipv4_pfcp_session_pkt),
0523         ice_fdir_ipv4_pfcp_session_pkt,
0524     },
0525     {
0526         ICE_FLTR_PTYPE_NONF_IPV6_PFCP_NODE,
0527         sizeof(ice_fdir_ipv6_pfcp_node_pkt),
0528         ice_fdir_ipv6_pfcp_node_pkt,
0529         sizeof(ice_fdir_ipv6_pfcp_node_pkt),
0530         ice_fdir_ipv6_pfcp_node_pkt,
0531     },
0532     {
0533         ICE_FLTR_PTYPE_NONF_IPV6_PFCP_SESSION,
0534         sizeof(ice_fdir_ipv6_pfcp_session_pkt),
0535         ice_fdir_ipv6_pfcp_session_pkt,
0536         sizeof(ice_fdir_ipv6_pfcp_session_pkt),
0537         ice_fdir_ipv6_pfcp_session_pkt,
0538     },
0539     {
0540         ICE_FLTR_PTYPE_NON_IP_L2,
0541         sizeof(ice_fdir_non_ip_l2_pkt), ice_fdir_non_ip_l2_pkt,
0542         sizeof(ice_fdir_non_ip_l2_pkt), ice_fdir_non_ip_l2_pkt,
0543     },
0544     {
0545         ICE_FLTR_PTYPE_NONF_IPV6_TCP,
0546         sizeof(ice_fdir_tcpv6_pkt), ice_fdir_tcpv6_pkt,
0547         sizeof(ice_fdir_tcp6_tun_pkt), ice_fdir_tcp6_tun_pkt,
0548     },
0549     {
0550         ICE_FLTR_PTYPE_NONF_IPV6_UDP,
0551         sizeof(ice_fdir_udpv6_pkt), ice_fdir_udpv6_pkt,
0552         sizeof(ice_fdir_udp6_tun_pkt), ice_fdir_udp6_tun_pkt,
0553     },
0554     {
0555         ICE_FLTR_PTYPE_NONF_IPV6_SCTP,
0556         sizeof(ice_fdir_sctpv6_pkt), ice_fdir_sctpv6_pkt,
0557         sizeof(ice_fdir_sctp6_tun_pkt), ice_fdir_sctp6_tun_pkt,
0558     },
0559     {
0560         ICE_FLTR_PTYPE_NONF_IPV6_OTHER,
0561         sizeof(ice_fdir_ipv6_pkt), ice_fdir_ipv6_pkt,
0562         sizeof(ice_fdir_ip6_tun_pkt), ice_fdir_ip6_tun_pkt,
0563     },
0564 };
0565 
0566 #define ICE_FDIR_NUM_PKT ARRAY_SIZE(ice_fdir_pkt)
0567 
0568 /**
0569  * ice_set_dflt_val_fd_desc
0570  * @fd_fltr_ctx: pointer to fd filter descriptor
0571  */
0572 static void ice_set_dflt_val_fd_desc(struct ice_fd_fltr_desc_ctx *fd_fltr_ctx)
0573 {
0574     fd_fltr_ctx->comp_q = ICE_FXD_FLTR_QW0_COMP_Q_ZERO;
0575     fd_fltr_ctx->comp_report = ICE_FXD_FLTR_QW0_COMP_REPORT_SW_FAIL;
0576     fd_fltr_ctx->fd_space = ICE_FXD_FLTR_QW0_FD_SPACE_GUAR_BEST;
0577     fd_fltr_ctx->cnt_ena = ICE_FXD_FLTR_QW0_STAT_ENA_PKTS;
0578     fd_fltr_ctx->evict_ena = ICE_FXD_FLTR_QW0_EVICT_ENA_TRUE;
0579     fd_fltr_ctx->toq = ICE_FXD_FLTR_QW0_TO_Q_EQUALS_QINDEX;
0580     fd_fltr_ctx->toq_prio = ICE_FXD_FLTR_QW0_TO_Q_PRIO1;
0581     fd_fltr_ctx->dpu_recipe = ICE_FXD_FLTR_QW0_DPU_RECIPE_DFLT;
0582     fd_fltr_ctx->drop = ICE_FXD_FLTR_QW0_DROP_NO;
0583     fd_fltr_ctx->flex_prio = ICE_FXD_FLTR_QW0_FLEX_PRI_NONE;
0584     fd_fltr_ctx->flex_mdid = ICE_FXD_FLTR_QW0_FLEX_MDID0;
0585     fd_fltr_ctx->flex_val = ICE_FXD_FLTR_QW0_FLEX_VAL0;
0586     fd_fltr_ctx->dtype = ICE_TX_DESC_DTYPE_FLTR_PROG;
0587     fd_fltr_ctx->desc_prof_prio = ICE_FXD_FLTR_QW1_PROF_PRIO_ZERO;
0588     fd_fltr_ctx->desc_prof = ICE_FXD_FLTR_QW1_PROF_ZERO;
0589     fd_fltr_ctx->swap = ICE_FXD_FLTR_QW1_SWAP_SET;
0590     fd_fltr_ctx->fdid_prio = ICE_FXD_FLTR_QW1_FDID_PRI_ONE;
0591     fd_fltr_ctx->fdid_mdid = ICE_FXD_FLTR_QW1_FDID_MDID_FD;
0592     fd_fltr_ctx->fdid = ICE_FXD_FLTR_QW1_FDID_ZERO;
0593 }
0594 
0595 /**
0596  * ice_set_fd_desc_val
0597  * @ctx: pointer to fd filter descriptor context
0598  * @fdir_desc: populated with fd filter descriptor values
0599  */
0600 static void
0601 ice_set_fd_desc_val(struct ice_fd_fltr_desc_ctx *ctx,
0602             struct ice_fltr_desc *fdir_desc)
0603 {
0604     u64 qword;
0605 
0606     /* prep QW0 of FD filter programming desc */
0607     qword = ((u64)ctx->qindex << ICE_FXD_FLTR_QW0_QINDEX_S) &
0608         ICE_FXD_FLTR_QW0_QINDEX_M;
0609     qword |= ((u64)ctx->comp_q << ICE_FXD_FLTR_QW0_COMP_Q_S) &
0610          ICE_FXD_FLTR_QW0_COMP_Q_M;
0611     qword |= ((u64)ctx->comp_report << ICE_FXD_FLTR_QW0_COMP_REPORT_S) &
0612          ICE_FXD_FLTR_QW0_COMP_REPORT_M;
0613     qword |= ((u64)ctx->fd_space << ICE_FXD_FLTR_QW0_FD_SPACE_S) &
0614          ICE_FXD_FLTR_QW0_FD_SPACE_M;
0615     qword |= ((u64)ctx->cnt_index << ICE_FXD_FLTR_QW0_STAT_CNT_S) &
0616          ICE_FXD_FLTR_QW0_STAT_CNT_M;
0617     qword |= ((u64)ctx->cnt_ena << ICE_FXD_FLTR_QW0_STAT_ENA_S) &
0618          ICE_FXD_FLTR_QW0_STAT_ENA_M;
0619     qword |= ((u64)ctx->evict_ena << ICE_FXD_FLTR_QW0_EVICT_ENA_S) &
0620          ICE_FXD_FLTR_QW0_EVICT_ENA_M;
0621     qword |= ((u64)ctx->toq << ICE_FXD_FLTR_QW0_TO_Q_S) &
0622          ICE_FXD_FLTR_QW0_TO_Q_M;
0623     qword |= ((u64)ctx->toq_prio << ICE_FXD_FLTR_QW0_TO_Q_PRI_S) &
0624          ICE_FXD_FLTR_QW0_TO_Q_PRI_M;
0625     qword |= ((u64)ctx->dpu_recipe << ICE_FXD_FLTR_QW0_DPU_RECIPE_S) &
0626          ICE_FXD_FLTR_QW0_DPU_RECIPE_M;
0627     qword |= ((u64)ctx->drop << ICE_FXD_FLTR_QW0_DROP_S) &
0628          ICE_FXD_FLTR_QW0_DROP_M;
0629     qword |= ((u64)ctx->flex_prio << ICE_FXD_FLTR_QW0_FLEX_PRI_S) &
0630          ICE_FXD_FLTR_QW0_FLEX_PRI_M;
0631     qword |= ((u64)ctx->flex_mdid << ICE_FXD_FLTR_QW0_FLEX_MDID_S) &
0632          ICE_FXD_FLTR_QW0_FLEX_MDID_M;
0633     qword |= ((u64)ctx->flex_val << ICE_FXD_FLTR_QW0_FLEX_VAL_S) &
0634          ICE_FXD_FLTR_QW0_FLEX_VAL_M;
0635     fdir_desc->qidx_compq_space_stat = cpu_to_le64(qword);
0636 
0637     /* prep QW1 of FD filter programming desc */
0638     qword = ((u64)ctx->dtype << ICE_FXD_FLTR_QW1_DTYPE_S) &
0639         ICE_FXD_FLTR_QW1_DTYPE_M;
0640     qword |= ((u64)ctx->pcmd << ICE_FXD_FLTR_QW1_PCMD_S) &
0641          ICE_FXD_FLTR_QW1_PCMD_M;
0642     qword |= ((u64)ctx->desc_prof_prio << ICE_FXD_FLTR_QW1_PROF_PRI_S) &
0643          ICE_FXD_FLTR_QW1_PROF_PRI_M;
0644     qword |= ((u64)ctx->desc_prof << ICE_FXD_FLTR_QW1_PROF_S) &
0645          ICE_FXD_FLTR_QW1_PROF_M;
0646     qword |= ((u64)ctx->fd_vsi << ICE_FXD_FLTR_QW1_FD_VSI_S) &
0647          ICE_FXD_FLTR_QW1_FD_VSI_M;
0648     qword |= ((u64)ctx->swap << ICE_FXD_FLTR_QW1_SWAP_S) &
0649          ICE_FXD_FLTR_QW1_SWAP_M;
0650     qword |= ((u64)ctx->fdid_prio << ICE_FXD_FLTR_QW1_FDID_PRI_S) &
0651          ICE_FXD_FLTR_QW1_FDID_PRI_M;
0652     qword |= ((u64)ctx->fdid_mdid << ICE_FXD_FLTR_QW1_FDID_MDID_S) &
0653          ICE_FXD_FLTR_QW1_FDID_MDID_M;
0654     qword |= ((u64)ctx->fdid << ICE_FXD_FLTR_QW1_FDID_S) &
0655          ICE_FXD_FLTR_QW1_FDID_M;
0656     fdir_desc->dtype_cmd_vsi_fdid = cpu_to_le64(qword);
0657 }
0658 
0659 /**
0660  * ice_fdir_get_prgm_desc - set a fdir descriptor from a fdir filter struct
0661  * @hw: pointer to the hardware structure
0662  * @input: filter
0663  * @fdesc: filter descriptor
0664  * @add: if add is true, this is an add operation, false implies delete
0665  */
0666 void
0667 ice_fdir_get_prgm_desc(struct ice_hw *hw, struct ice_fdir_fltr *input,
0668                struct ice_fltr_desc *fdesc, bool add)
0669 {
0670     struct ice_fd_fltr_desc_ctx fdir_fltr_ctx = { 0 };
0671 
0672     /* set default context info */
0673     ice_set_dflt_val_fd_desc(&fdir_fltr_ctx);
0674 
0675     /* change sideband filtering values */
0676     fdir_fltr_ctx.fdid = input->fltr_id;
0677     if (input->dest_ctl == ICE_FLTR_PRGM_DESC_DEST_DROP_PKT) {
0678         fdir_fltr_ctx.drop = ICE_FXD_FLTR_QW0_DROP_YES;
0679         fdir_fltr_ctx.qindex = 0;
0680     } else if (input->dest_ctl ==
0681            ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_OTHER) {
0682         fdir_fltr_ctx.drop = ICE_FXD_FLTR_QW0_DROP_NO;
0683         fdir_fltr_ctx.qindex = 0;
0684     } else {
0685         if (input->dest_ctl ==
0686             ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_QGROUP)
0687             fdir_fltr_ctx.toq = input->q_region;
0688         fdir_fltr_ctx.drop = ICE_FXD_FLTR_QW0_DROP_NO;
0689         fdir_fltr_ctx.qindex = input->q_index;
0690     }
0691     fdir_fltr_ctx.cnt_ena = input->cnt_ena;
0692     fdir_fltr_ctx.cnt_index = input->cnt_index;
0693     fdir_fltr_ctx.fd_vsi = ice_get_hw_vsi_num(hw, input->dest_vsi);
0694     fdir_fltr_ctx.evict_ena = ICE_FXD_FLTR_QW0_EVICT_ENA_FALSE;
0695     if (input->dest_ctl == ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_OTHER)
0696         fdir_fltr_ctx.toq_prio = 0;
0697     else
0698         fdir_fltr_ctx.toq_prio = 3;
0699     fdir_fltr_ctx.pcmd = add ? ICE_FXD_FLTR_QW1_PCMD_ADD :
0700         ICE_FXD_FLTR_QW1_PCMD_REMOVE;
0701     fdir_fltr_ctx.swap = ICE_FXD_FLTR_QW1_SWAP_NOT_SET;
0702     fdir_fltr_ctx.comp_q = ICE_FXD_FLTR_QW0_COMP_Q_ZERO;
0703     fdir_fltr_ctx.comp_report = input->comp_report;
0704     fdir_fltr_ctx.fdid_prio = input->fdid_prio;
0705     fdir_fltr_ctx.desc_prof = 1;
0706     fdir_fltr_ctx.desc_prof_prio = 3;
0707     ice_set_fd_desc_val(&fdir_fltr_ctx, fdesc);
0708 }
0709 
0710 /**
0711  * ice_alloc_fd_res_cntr - obtain counter resource for FD type
0712  * @hw: pointer to the hardware structure
0713  * @cntr_id: returns counter index
0714  */
0715 int ice_alloc_fd_res_cntr(struct ice_hw *hw, u16 *cntr_id)
0716 {
0717     return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_COUNTER_BLOCK,
0718                   ICE_AQC_RES_TYPE_FLAG_DEDICATED, 1, cntr_id);
0719 }
0720 
0721 /**
0722  * ice_free_fd_res_cntr - Free counter resource for FD type
0723  * @hw: pointer to the hardware structure
0724  * @cntr_id: counter index to be freed
0725  */
0726 int ice_free_fd_res_cntr(struct ice_hw *hw, u16 cntr_id)
0727 {
0728     return ice_free_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_COUNTER_BLOCK,
0729                  ICE_AQC_RES_TYPE_FLAG_DEDICATED, 1, cntr_id);
0730 }
0731 
0732 /**
0733  * ice_alloc_fd_guar_item - allocate resource for FD guaranteed entries
0734  * @hw: pointer to the hardware structure
0735  * @cntr_id: returns counter index
0736  * @num_fltr: number of filter entries to be allocated
0737  */
0738 int ice_alloc_fd_guar_item(struct ice_hw *hw, u16 *cntr_id, u16 num_fltr)
0739 {
0740     return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_GUARANTEED_ENTRIES,
0741                   ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr,
0742                   cntr_id);
0743 }
0744 
0745 /**
0746  * ice_alloc_fd_shrd_item - allocate resource for flow director shared entries
0747  * @hw: pointer to the hardware structure
0748  * @cntr_id: returns counter index
0749  * @num_fltr: number of filter entries to be allocated
0750  */
0751 int ice_alloc_fd_shrd_item(struct ice_hw *hw, u16 *cntr_id, u16 num_fltr)
0752 {
0753     return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_SHARED_ENTRIES,
0754                   ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr,
0755                   cntr_id);
0756 }
0757 
0758 /**
0759  * ice_get_fdir_cnt_all - get the number of Flow Director filters
0760  * @hw: hardware data structure
0761  *
0762  * Returns the number of filters available on device
0763  */
0764 int ice_get_fdir_cnt_all(struct ice_hw *hw)
0765 {
0766     return hw->func_caps.fd_fltr_guar + hw->func_caps.fd_fltr_best_effort;
0767 }
0768 
0769 /**
0770  * ice_pkt_insert_ipv6_addr - insert a be32 IPv6 address into a memory buffer
0771  * @pkt: packet buffer
0772  * @offset: offset into buffer
0773  * @addr: IPv6 address to convert and insert into pkt at offset
0774  */
0775 static void ice_pkt_insert_ipv6_addr(u8 *pkt, int offset, __be32 *addr)
0776 {
0777     int idx;
0778 
0779     for (idx = 0; idx < ICE_IPV6_ADDR_LEN_AS_U32; idx++)
0780         memcpy(pkt + offset + idx * sizeof(*addr), &addr[idx],
0781                sizeof(*addr));
0782 }
0783 
0784 /**
0785  * ice_pkt_insert_u6_qfi - insert a u6 value QFI into a memory buffer for GTPU
0786  * @pkt: packet buffer
0787  * @offset: offset into buffer
0788  * @data: 8 bit value to convert and insert into pkt at offset
0789  *
0790  * This function is designed for inserting QFI (6 bits) for GTPU.
0791  */
0792 static void ice_pkt_insert_u6_qfi(u8 *pkt, int offset, u8 data)
0793 {
0794     u8 ret;
0795 
0796     ret = (data & 0x3F) + (*(pkt + offset) & 0xC0);
0797     memcpy(pkt + offset, &ret, sizeof(ret));
0798 }
0799 
0800 /**
0801  * ice_pkt_insert_u8 - insert a u8 value into a memory buffer.
0802  * @pkt: packet buffer
0803  * @offset: offset into buffer
0804  * @data: 8 bit value to convert and insert into pkt at offset
0805  */
0806 static void ice_pkt_insert_u8(u8 *pkt, int offset, u8 data)
0807 {
0808     memcpy(pkt + offset, &data, sizeof(data));
0809 }
0810 
0811 /**
0812  * ice_pkt_insert_u8_tc - insert a u8 value into a memory buffer for TC ipv6.
0813  * @pkt: packet buffer
0814  * @offset: offset into buffer
0815  * @data: 8 bit value to convert and insert into pkt at offset
0816  *
0817  * This function is designed for inserting Traffic Class (TC) for IPv6,
0818  * since that TC is not aligned in number of bytes. Here we split it out
0819  * into two part and fill each byte with data copy from pkt, then insert
0820  * the two bytes data one by one.
0821  */
0822 static void ice_pkt_insert_u8_tc(u8 *pkt, int offset, u8 data)
0823 {
0824     u8 high, low;
0825 
0826     high = (data >> 4) + (*(pkt + offset) & 0xF0);
0827     memcpy(pkt + offset, &high, sizeof(high));
0828 
0829     low = (*(pkt + offset + 1) & 0x0F) + ((data & 0x0F) << 4);
0830     memcpy(pkt + offset + 1, &low, sizeof(low));
0831 }
0832 
0833 /**
0834  * ice_pkt_insert_u16 - insert a be16 value into a memory buffer
0835  * @pkt: packet buffer
0836  * @offset: offset into buffer
0837  * @data: 16 bit value to convert and insert into pkt at offset
0838  */
0839 static void ice_pkt_insert_u16(u8 *pkt, int offset, __be16 data)
0840 {
0841     memcpy(pkt + offset, &data, sizeof(data));
0842 }
0843 
0844 /**
0845  * ice_pkt_insert_u32 - insert a be32 value into a memory buffer
0846  * @pkt: packet buffer
0847  * @offset: offset into buffer
0848  * @data: 32 bit value to convert and insert into pkt at offset
0849  */
0850 static void ice_pkt_insert_u32(u8 *pkt, int offset, __be32 data)
0851 {
0852     memcpy(pkt + offset, &data, sizeof(data));
0853 }
0854 
0855 /**
0856  * ice_pkt_insert_mac_addr - insert a MAC addr into a memory buffer.
0857  * @pkt: packet buffer
0858  * @addr: MAC address to convert and insert into pkt at offset
0859  */
0860 static void ice_pkt_insert_mac_addr(u8 *pkt, u8 *addr)
0861 {
0862     ether_addr_copy(pkt, addr);
0863 }
0864 
0865 /**
0866  * ice_fdir_get_gen_prgm_pkt - generate a training packet
0867  * @hw: pointer to the hardware structure
0868  * @input: flow director filter data structure
0869  * @pkt: pointer to return filter packet
0870  * @frag: generate a fragment packet
0871  * @tun: true implies generate a tunnel packet
0872  */
0873 int
0874 ice_fdir_get_gen_prgm_pkt(struct ice_hw *hw, struct ice_fdir_fltr *input,
0875               u8 *pkt, bool frag, bool tun)
0876 {
0877     enum ice_fltr_ptype flow;
0878     u16 tnl_port;
0879     u8 *loc;
0880     u16 idx;
0881 
0882     if (input->flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER) {
0883         switch (input->ip.v4.proto) {
0884         case IPPROTO_TCP:
0885             flow = ICE_FLTR_PTYPE_NONF_IPV4_TCP;
0886             break;
0887         case IPPROTO_UDP:
0888             flow = ICE_FLTR_PTYPE_NONF_IPV4_UDP;
0889             break;
0890         case IPPROTO_SCTP:
0891             flow = ICE_FLTR_PTYPE_NONF_IPV4_SCTP;
0892             break;
0893         default:
0894             flow = ICE_FLTR_PTYPE_NONF_IPV4_OTHER;
0895             break;
0896         }
0897     } else if (input->flow_type == ICE_FLTR_PTYPE_NONF_IPV6_OTHER) {
0898         switch (input->ip.v6.proto) {
0899         case IPPROTO_TCP:
0900             flow = ICE_FLTR_PTYPE_NONF_IPV6_TCP;
0901             break;
0902         case IPPROTO_UDP:
0903             flow = ICE_FLTR_PTYPE_NONF_IPV6_UDP;
0904             break;
0905         case IPPROTO_SCTP:
0906             flow = ICE_FLTR_PTYPE_NONF_IPV6_SCTP;
0907             break;
0908         default:
0909             flow = ICE_FLTR_PTYPE_NONF_IPV6_OTHER;
0910             break;
0911         }
0912     } else {
0913         flow = input->flow_type;
0914     }
0915 
0916     for (idx = 0; idx < ICE_FDIR_NUM_PKT; idx++)
0917         if (ice_fdir_pkt[idx].flow == flow)
0918             break;
0919     if (idx == ICE_FDIR_NUM_PKT)
0920         return -EINVAL;
0921     if (!tun) {
0922         memcpy(pkt, ice_fdir_pkt[idx].pkt, ice_fdir_pkt[idx].pkt_len);
0923         loc = pkt;
0924     } else {
0925         if (!ice_get_open_tunnel_port(hw, &tnl_port, TNL_ALL))
0926             return -ENOENT;
0927         if (!ice_fdir_pkt[idx].tun_pkt)
0928             return -EINVAL;
0929         memcpy(pkt, ice_fdir_pkt[idx].tun_pkt,
0930                ice_fdir_pkt[idx].tun_pkt_len);
0931         ice_pkt_insert_u16(pkt, ICE_IPV4_UDP_DST_PORT_OFFSET,
0932                    htons(tnl_port));
0933         loc = &pkt[ICE_FDIR_TUN_PKT_OFF];
0934     }
0935 
0936     /* Reverse the src and dst, since the HW expects them to be from Tx
0937      * perspective. The input from user is from Rx filter perspective.
0938      */
0939     switch (flow) {
0940     case ICE_FLTR_PTYPE_NONF_IPV4_TCP:
0941         ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
0942                    input->ip.v4.src_ip);
0943         ice_pkt_insert_u16(loc, ICE_IPV4_TCP_DST_PORT_OFFSET,
0944                    input->ip.v4.src_port);
0945         ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
0946                    input->ip.v4.dst_ip);
0947         ice_pkt_insert_u16(loc, ICE_IPV4_TCP_SRC_PORT_OFFSET,
0948                    input->ip.v4.dst_port);
0949         ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
0950         ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
0951         ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
0952         if (frag)
0953             loc[20] = ICE_FDIR_IPV4_PKT_FLAG_MF;
0954         break;
0955     case ICE_FLTR_PTYPE_NONF_IPV4_UDP:
0956         ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
0957                    input->ip.v4.src_ip);
0958         ice_pkt_insert_u16(loc, ICE_IPV4_UDP_DST_PORT_OFFSET,
0959                    input->ip.v4.src_port);
0960         ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
0961                    input->ip.v4.dst_ip);
0962         ice_pkt_insert_u16(loc, ICE_IPV4_UDP_SRC_PORT_OFFSET,
0963                    input->ip.v4.dst_port);
0964         ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
0965         ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
0966         ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
0967         ice_pkt_insert_mac_addr(loc + ETH_ALEN,
0968                     input->ext_data.src_mac);
0969         break;
0970     case ICE_FLTR_PTYPE_NONF_IPV4_SCTP:
0971         ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
0972                    input->ip.v4.src_ip);
0973         ice_pkt_insert_u16(loc, ICE_IPV4_SCTP_DST_PORT_OFFSET,
0974                    input->ip.v4.src_port);
0975         ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
0976                    input->ip.v4.dst_ip);
0977         ice_pkt_insert_u16(loc, ICE_IPV4_SCTP_SRC_PORT_OFFSET,
0978                    input->ip.v4.dst_port);
0979         ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
0980         ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
0981         ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
0982         break;
0983     case ICE_FLTR_PTYPE_NONF_IPV4_OTHER:
0984         ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
0985                    input->ip.v4.src_ip);
0986         ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
0987                    input->ip.v4.dst_ip);
0988         ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
0989         ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
0990         ice_pkt_insert_u8(loc, ICE_IPV4_PROTO_OFFSET,
0991                   input->ip.v4.proto);
0992         ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
0993         break;
0994     case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_UDP:
0995     case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_TCP:
0996     case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_ICMP:
0997     case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_OTHER:
0998         ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
0999                    input->ip.v4.src_ip);
1000         ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1001                    input->ip.v4.dst_ip);
1002         ice_pkt_insert_u32(loc, ICE_IPV4_GTPU_TEID_OFFSET,
1003                    input->gtpu_data.teid);
1004         ice_pkt_insert_u6_qfi(loc, ICE_IPV4_GTPU_QFI_OFFSET,
1005                       input->gtpu_data.qfi);
1006         break;
1007     case ICE_FLTR_PTYPE_NONF_IPV4_L2TPV3:
1008         ice_pkt_insert_u32(loc, ICE_IPV4_L2TPV3_SESS_ID_OFFSET,
1009                    input->l2tpv3_data.session_id);
1010         break;
1011     case ICE_FLTR_PTYPE_NONF_IPV6_L2TPV3:
1012         ice_pkt_insert_u32(loc, ICE_IPV6_L2TPV3_SESS_ID_OFFSET,
1013                    input->l2tpv3_data.session_id);
1014         break;
1015     case ICE_FLTR_PTYPE_NONF_IPV4_ESP:
1016         ice_pkt_insert_u32(loc, ICE_IPV4_ESP_SPI_OFFSET,
1017                    input->ip.v4.sec_parm_idx);
1018         break;
1019     case ICE_FLTR_PTYPE_NONF_IPV6_ESP:
1020         ice_pkt_insert_u32(loc, ICE_IPV6_ESP_SPI_OFFSET,
1021                    input->ip.v6.sec_parm_idx);
1022         break;
1023     case ICE_FLTR_PTYPE_NONF_IPV4_AH:
1024         ice_pkt_insert_u32(loc, ICE_IPV4_AH_SPI_OFFSET,
1025                    input->ip.v4.sec_parm_idx);
1026         break;
1027     case ICE_FLTR_PTYPE_NONF_IPV6_AH:
1028         ice_pkt_insert_u32(loc, ICE_IPV6_AH_SPI_OFFSET,
1029                    input->ip.v6.sec_parm_idx);
1030         break;
1031     case ICE_FLTR_PTYPE_NONF_IPV4_NAT_T_ESP:
1032         ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1033                    input->ip.v4.src_ip);
1034         ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1035                    input->ip.v4.dst_ip);
1036         ice_pkt_insert_u32(loc, ICE_IPV4_NAT_T_ESP_SPI_OFFSET,
1037                    input->ip.v4.sec_parm_idx);
1038         break;
1039     case ICE_FLTR_PTYPE_NONF_IPV6_NAT_T_ESP:
1040         ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1041                      input->ip.v6.src_ip);
1042         ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1043                      input->ip.v6.dst_ip);
1044         ice_pkt_insert_u32(loc, ICE_IPV6_NAT_T_ESP_SPI_OFFSET,
1045                    input->ip.v6.sec_parm_idx);
1046         break;
1047     case ICE_FLTR_PTYPE_NONF_IPV4_PFCP_NODE:
1048     case ICE_FLTR_PTYPE_NONF_IPV4_PFCP_SESSION:
1049         ice_pkt_insert_u16(loc, ICE_IPV4_UDP_SRC_PORT_OFFSET,
1050                    input->ip.v4.dst_port);
1051         break;
1052     case ICE_FLTR_PTYPE_NONF_IPV6_PFCP_NODE:
1053     case ICE_FLTR_PTYPE_NONF_IPV6_PFCP_SESSION:
1054         ice_pkt_insert_u16(loc, ICE_IPV6_UDP_SRC_PORT_OFFSET,
1055                    input->ip.v6.dst_port);
1056         break;
1057     case ICE_FLTR_PTYPE_NON_IP_L2:
1058         ice_pkt_insert_u16(loc, ICE_MAC_ETHTYPE_OFFSET,
1059                    input->ext_data.ether_type);
1060         break;
1061     case ICE_FLTR_PTYPE_NONF_IPV6_TCP:
1062         ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1063                      input->ip.v6.src_ip);
1064         ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1065                      input->ip.v6.dst_ip);
1066         ice_pkt_insert_u16(loc, ICE_IPV6_TCP_DST_PORT_OFFSET,
1067                    input->ip.v6.src_port);
1068         ice_pkt_insert_u16(loc, ICE_IPV6_TCP_SRC_PORT_OFFSET,
1069                    input->ip.v6.dst_port);
1070         ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
1071         ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
1072         ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1073         break;
1074     case ICE_FLTR_PTYPE_NONF_IPV6_UDP:
1075         ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1076                      input->ip.v6.src_ip);
1077         ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1078                      input->ip.v6.dst_ip);
1079         ice_pkt_insert_u16(loc, ICE_IPV6_UDP_DST_PORT_OFFSET,
1080                    input->ip.v6.src_port);
1081         ice_pkt_insert_u16(loc, ICE_IPV6_UDP_SRC_PORT_OFFSET,
1082                    input->ip.v6.dst_port);
1083         ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
1084         ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
1085         ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1086         break;
1087     case ICE_FLTR_PTYPE_NONF_IPV6_SCTP:
1088         ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1089                      input->ip.v6.src_ip);
1090         ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1091                      input->ip.v6.dst_ip);
1092         ice_pkt_insert_u16(loc, ICE_IPV6_SCTP_DST_PORT_OFFSET,
1093                    input->ip.v6.src_port);
1094         ice_pkt_insert_u16(loc, ICE_IPV6_SCTP_SRC_PORT_OFFSET,
1095                    input->ip.v6.dst_port);
1096         ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
1097         ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
1098         ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1099         break;
1100     case ICE_FLTR_PTYPE_NONF_IPV6_OTHER:
1101         ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1102                      input->ip.v6.src_ip);
1103         ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1104                      input->ip.v6.dst_ip);
1105         ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
1106         ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
1107         ice_pkt_insert_u8(loc, ICE_IPV6_PROTO_OFFSET,
1108                   input->ip.v6.proto);
1109         ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1110         break;
1111     default:
1112         return -EINVAL;
1113     }
1114 
1115     if (input->flex_fltr)
1116         ice_pkt_insert_u16(loc, input->flex_offset, input->flex_word);
1117 
1118     return 0;
1119 }
1120 
1121 /**
1122  * ice_fdir_has_frag - does flow type have 2 ptypes
1123  * @flow: flow ptype
1124  *
1125  * returns true is there is a fragment packet for this ptype
1126  */
1127 bool ice_fdir_has_frag(enum ice_fltr_ptype flow)
1128 {
1129     if (flow == ICE_FLTR_PTYPE_NONF_IPV4_OTHER)
1130         return true;
1131     else
1132         return false;
1133 }
1134 
1135 /**
1136  * ice_fdir_find_fltr_by_idx - find filter with idx
1137  * @hw: pointer to hardware structure
1138  * @fltr_idx: index to find.
1139  *
1140  * Returns pointer to filter if found or null
1141  */
1142 struct ice_fdir_fltr *
1143 ice_fdir_find_fltr_by_idx(struct ice_hw *hw, u32 fltr_idx)
1144 {
1145     struct ice_fdir_fltr *rule;
1146 
1147     list_for_each_entry(rule, &hw->fdir_list_head, fltr_node) {
1148         /* rule ID found in the list */
1149         if (fltr_idx == rule->fltr_id)
1150             return rule;
1151         if (fltr_idx < rule->fltr_id)
1152             break;
1153     }
1154     return NULL;
1155 }
1156 
1157 /**
1158  * ice_fdir_list_add_fltr - add a new node to the flow director filter list
1159  * @hw: hardware structure
1160  * @fltr: filter node to add to structure
1161  */
1162 void ice_fdir_list_add_fltr(struct ice_hw *hw, struct ice_fdir_fltr *fltr)
1163 {
1164     struct ice_fdir_fltr *rule, *parent = NULL;
1165 
1166     list_for_each_entry(rule, &hw->fdir_list_head, fltr_node) {
1167         /* rule ID found or pass its spot in the list */
1168         if (rule->fltr_id >= fltr->fltr_id)
1169             break;
1170         parent = rule;
1171     }
1172 
1173     if (parent)
1174         list_add(&fltr->fltr_node, &parent->fltr_node);
1175     else
1176         list_add(&fltr->fltr_node, &hw->fdir_list_head);
1177 }
1178 
1179 /**
1180  * ice_fdir_update_cntrs - increment / decrement filter counter
1181  * @hw: pointer to hardware structure
1182  * @flow: filter flow type
1183  * @add: true implies filters added
1184  */
1185 void
1186 ice_fdir_update_cntrs(struct ice_hw *hw, enum ice_fltr_ptype flow, bool add)
1187 {
1188     int incr;
1189 
1190     incr = add ? 1 : -1;
1191     hw->fdir_active_fltr += incr;
1192 
1193     if (flow == ICE_FLTR_PTYPE_NONF_NONE || flow >= ICE_FLTR_PTYPE_MAX)
1194         ice_debug(hw, ICE_DBG_SW, "Unknown filter type %d\n", flow);
1195     else
1196         hw->fdir_fltr_cnt[flow] += incr;
1197 }
1198 
1199 /**
1200  * ice_cmp_ipv6_addr - compare 2 IP v6 addresses
1201  * @a: IP v6 address
1202  * @b: IP v6 address
1203  *
1204  * Returns 0 on equal, returns non-0 if different
1205  */
1206 static int ice_cmp_ipv6_addr(__be32 *a, __be32 *b)
1207 {
1208     return memcmp(a, b, 4 * sizeof(__be32));
1209 }
1210 
1211 /**
1212  * ice_fdir_comp_rules - compare 2 filters
1213  * @a: a Flow Director filter data structure
1214  * @b: a Flow Director filter data structure
1215  * @v6: bool true if v6 filter
1216  *
1217  * Returns true if the filters match
1218  */
1219 static bool
1220 ice_fdir_comp_rules(struct ice_fdir_fltr *a,  struct ice_fdir_fltr *b, bool v6)
1221 {
1222     enum ice_fltr_ptype flow_type = a->flow_type;
1223 
1224     /* The calling function already checks that the two filters have the
1225      * same flow_type.
1226      */
1227     if (!v6) {
1228         if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_TCP ||
1229             flow_type == ICE_FLTR_PTYPE_NONF_IPV4_UDP ||
1230             flow_type == ICE_FLTR_PTYPE_NONF_IPV4_SCTP) {
1231             if (a->ip.v4.dst_ip == b->ip.v4.dst_ip &&
1232                 a->ip.v4.src_ip == b->ip.v4.src_ip &&
1233                 a->ip.v4.dst_port == b->ip.v4.dst_port &&
1234                 a->ip.v4.src_port == b->ip.v4.src_port)
1235                 return true;
1236         } else if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER) {
1237             if (a->ip.v4.dst_ip == b->ip.v4.dst_ip &&
1238                 a->ip.v4.src_ip == b->ip.v4.src_ip &&
1239                 a->ip.v4.l4_header == b->ip.v4.l4_header &&
1240                 a->ip.v4.proto == b->ip.v4.proto &&
1241                 a->ip.v4.ip_ver == b->ip.v4.ip_ver &&
1242                 a->ip.v4.tos == b->ip.v4.tos)
1243                 return true;
1244         }
1245     } else {
1246         if (flow_type == ICE_FLTR_PTYPE_NONF_IPV6_UDP ||
1247             flow_type == ICE_FLTR_PTYPE_NONF_IPV6_TCP ||
1248             flow_type == ICE_FLTR_PTYPE_NONF_IPV6_SCTP) {
1249             if (a->ip.v6.dst_port == b->ip.v6.dst_port &&
1250                 a->ip.v6.src_port == b->ip.v6.src_port &&
1251                 !ice_cmp_ipv6_addr(a->ip.v6.dst_ip,
1252                            b->ip.v6.dst_ip) &&
1253                 !ice_cmp_ipv6_addr(a->ip.v6.src_ip,
1254                            b->ip.v6.src_ip))
1255                 return true;
1256         } else if (flow_type == ICE_FLTR_PTYPE_NONF_IPV6_OTHER) {
1257             if (a->ip.v6.dst_port == b->ip.v6.dst_port &&
1258                 a->ip.v6.src_port == b->ip.v6.src_port)
1259                 return true;
1260         }
1261     }
1262 
1263     return false;
1264 }
1265 
1266 /**
1267  * ice_fdir_is_dup_fltr - test if filter is already in list for PF
1268  * @hw: hardware data structure
1269  * @input: Flow Director filter data structure
1270  *
1271  * Returns true if the filter is found in the list
1272  */
1273 bool ice_fdir_is_dup_fltr(struct ice_hw *hw, struct ice_fdir_fltr *input)
1274 {
1275     struct ice_fdir_fltr *rule;
1276     bool ret = false;
1277 
1278     list_for_each_entry(rule, &hw->fdir_list_head, fltr_node) {
1279         enum ice_fltr_ptype flow_type;
1280 
1281         if (rule->flow_type != input->flow_type)
1282             continue;
1283 
1284         flow_type = input->flow_type;
1285         if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_TCP ||
1286             flow_type == ICE_FLTR_PTYPE_NONF_IPV4_UDP ||
1287             flow_type == ICE_FLTR_PTYPE_NONF_IPV4_SCTP ||
1288             flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER)
1289             ret = ice_fdir_comp_rules(rule, input, false);
1290         else
1291             ret = ice_fdir_comp_rules(rule, input, true);
1292         if (ret) {
1293             if (rule->fltr_id == input->fltr_id &&
1294                 rule->q_index != input->q_index)
1295                 ret = false;
1296             else
1297                 break;
1298         }
1299     }
1300 
1301     return ret;
1302 }