0001
0002
0003
0004 #include "ice_common.h"
0005
0006
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
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
0570
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
0597
0598
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
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
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
0661
0662
0663
0664
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
0673 ice_set_dflt_val_fd_desc(&fdir_fltr_ctx);
0674
0675
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
0712
0713
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
0723
0724
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
0734
0735
0736
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
0747
0748
0749
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
0760
0761
0762
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
0771
0772
0773
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
0786
0787
0788
0789
0790
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
0802
0803
0804
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
0813
0814
0815
0816
0817
0818
0819
0820
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
0835
0836
0837
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
0846
0847
0848
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
0857
0858
0859
0860 static void ice_pkt_insert_mac_addr(u8 *pkt, u8 *addr)
0861 {
0862 ether_addr_copy(pkt, addr);
0863 }
0864
0865
0866
0867
0868
0869
0870
0871
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
0937
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
1123
1124
1125
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
1137
1138
1139
1140
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
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
1159
1160
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
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
1181
1182
1183
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
1201
1202
1203
1204
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
1213
1214
1215
1216
1217
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
1225
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
1268
1269
1270
1271
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 }