1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright(c) 2001-2020 Intel Corporation 3 */ 4 5 #include "ice_common.h" 6 #include "ice_fdir.h" 7 8 /* These are training packet headers used to program flow director filters. */ 9 static const u8 ice_fdir_tcpv4_pkt[] = { 10 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 11 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 12 0x00, 0x28, 0x00, 0x01, 0x00, 0x00, 0x40, 0x06, 13 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 14 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 15 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 16 0x20, 0x00, 0x00, 0x00, 0x00, 0x00 17 }; 18 19 static const u8 ice_fdir_udpv4_pkt[] = { 20 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 21 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 22 0x00, 0x1C, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11, 23 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 24 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 25 0x00, 0x00, 26 }; 27 28 static const u8 ice_fdir_sctpv4_pkt[] = { 29 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 30 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 31 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x40, 0x84, 32 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 33 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 34 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 35 }; 36 37 static const u8 ice_fdir_ipv4_pkt[] = { 38 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 39 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 40 0x00, 0x14, 0x00, 0x00, 0x40, 0x00, 0x40, 0x10, 41 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 42 0x00, 0x00 43 }; 44 45 static const u8 ice_fdir_udp4_vxlan_pkt[] = { 46 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 47 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 48 0x00, 0x4e, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11, 49 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 50 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 51 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00, 52 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 53 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 54 0x45, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x40, 0x00, 55 0x40, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 56 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 57 0x00, 0x00, 0x00, 0x00, 58 }; 59 60 static const u8 ice_fdir_udp4_gtpu4_pkt[] = { 61 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 62 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 63 0x00, 0x4c, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11, 64 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 65 0x00, 0x00, 0x08, 0x68, 0x08, 0x68, 0x00, 0x00, 66 0x00, 0x00, 0x34, 0xff, 0x00, 0x28, 0x00, 0x00, 67 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x02, 0x00, 68 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00, 69 0x00, 0x1c, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11, 70 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 71 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 72 0x00, 0x00, 73 }; 74 75 static const u8 ice_fdir_tcp4_gtpu4_pkt[] = { 76 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 77 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 78 0x00, 0x58, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11, 79 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 80 0x00, 0x00, 0x08, 0x68, 0x08, 0x68, 0x00, 0x00, 81 0x00, 0x00, 0x34, 0xff, 0x00, 0x28, 0x00, 0x00, 82 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x02, 0x00, 83 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00, 84 0x00, 0x28, 0x00, 0x00, 0x40, 0x00, 0x40, 0x06, 85 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 86 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 87 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 88 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 89 }; 90 91 static const u8 ice_fdir_icmp4_gtpu4_pkt[] = { 92 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 93 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 94 0x00, 0x4c, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11, 95 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 96 0x00, 0x00, 0x08, 0x68, 0x08, 0x68, 0x00, 0x00, 97 0x00, 0x00, 0x34, 0xff, 0x00, 0x28, 0x00, 0x00, 98 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x02, 0x00, 99 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00, 100 0x00, 0x1c, 0x00, 0x00, 0x40, 0x00, 0x40, 0x01, 101 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 102 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 103 0x00, 0x00, 104 }; 105 106 static const u8 ice_fdir_ipv4_gtpu4_pkt[] = { 107 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 108 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 109 0x00, 0x44, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11, 110 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 111 0x00, 0x00, 0x08, 0x68, 0x08, 0x68, 0x00, 0x00, 112 0x00, 0x00, 0x33, 0xff, 0x00, 0x20, 0x00, 0x00, 113 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x45, 0x00, 114 0x00, 0x14, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 115 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 116 0x00, 0x00, 117 }; 118 119 static const u8 ice_fdir_ipv6_gtpu6_pkt[] = { 120 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 121 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd, 0x60, 0x00, 122 0x00, 0x00, 0x00, 0x44, 0x11, 0x40, 0x00, 0x00, 123 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 124 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 125 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 126 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x08, 0x68, 127 0x08, 0x68, 0x00, 0x44, 0x7f, 0xed, 0x33, 0xff, 128 0x00, 0x34, 0x12, 0x34, 0x56, 0x78, 0x00, 0x00, 129 0x00, 0x85, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 130 0x3b, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 131 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 132 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 133 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 134 0x00, 0x00, 135 }; 136 137 static const u8 ice_fdir_ipv4_gtpu4_eh_pkt[] = { 138 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 139 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 140 0x00, 0x44, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11, 141 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 142 0x00, 0x00, 0x08, 0x68, 0x08, 0x68, 0x00, 0x00, 143 0x00, 0x00, 0x34, 0xff, 0x00, 0x28, 0x00, 0x00, 144 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x02, 0x00, 145 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00, 146 0x00, 0x14, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 147 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 148 0x00, 0x00, 149 }; 150 151 static const u8 ice_fdir_ipv6_gtpu6_eh_pkt[] = { 152 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 153 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd, 0x60, 0x00, 154 0x00, 0x00, 0x00, 0x44, 0x11, 0x40, 0x00, 0x00, 155 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 156 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 157 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 158 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x08, 0x68, 159 0x08, 0x68, 0x00, 0x44, 0x7f, 0xed, 0x34, 0xff, 160 0x00, 0x34, 0x12, 0x34, 0x56, 0x78, 0x00, 0x00, 161 0x00, 0x85, 0x02, 0x00, 0x33, 0x00, 0x00, 0x00, 162 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 163 0x3b, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 164 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 165 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 166 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 167 0x00, 0x00, 168 }; 169 170 static const u8 ice_fdir_ipv4_l2tpv3_pkt[] = { 171 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 172 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 173 0x00, 0x14, 0x00, 0x00, 0x40, 0x00, 0x40, 0x73, 174 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 175 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 176 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 177 }; 178 179 static const u8 ice_fdir_ipv6_l2tpv3_pkt[] = { 180 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 181 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00, 182 0x00, 0x00, 0x00, 0x00, 0x73, 0x40, 0x00, 0x00, 183 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 184 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 185 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 186 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 187 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 188 0x00, 0x00, 189 }; 190 191 static const u8 ice_fdir_ipv4_esp_pkt[] = { 192 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 193 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 194 0x00, 0x14, 0x00, 0x00, 0x40, 0x00, 0x40, 0x32, 195 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 196 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 197 0x00, 0x00 198 }; 199 200 static const u8 ice_fdir_ipv6_esp_pkt[] = { 201 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 202 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00, 203 0x00, 0x00, 0x00, 0x00, 0x32, 0x40, 0x00, 0x00, 204 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 205 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 206 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 207 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 208 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 209 }; 210 211 static const u8 ice_fdir_ipv4_ah_pkt[] = { 212 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 213 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 214 0x00, 0x14, 0x00, 0x00, 0x40, 0x00, 0x40, 0x33, 215 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 216 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 217 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 218 0x00, 0x00 219 }; 220 221 static const u8 ice_fdir_ipv6_ah_pkt[] = { 222 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 223 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00, 224 0x00, 0x00, 0x00, 0x00, 0x33, 0x40, 0x00, 0x00, 225 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 226 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 227 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 228 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 229 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 230 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 231 }; 232 233 static const u8 ice_fdir_ipv4_nat_t_esp_pkt[] = { 234 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 235 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 236 0x00, 0x1C, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11, 237 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 238 0x00, 0x00, 0x00, 0x00, 0x11, 0x94, 0x00, 0x00, 239 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 240 0x00, 0x00, 241 }; 242 243 static const u8 ice_fdir_ipv6_nat_t_esp_pkt[] = { 244 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 245 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00, 246 0x00, 0x00, 0x00, 0x08, 0x11, 0x40, 0x00, 0x00, 247 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 248 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 249 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 250 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 251 0x11, 0x94, 0x00, 0x00, 0x00, 0x08, 252 }; 253 254 static const u8 ice_fdir_ipv4_pfcp_node_pkt[] = { 255 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 256 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 257 0x00, 0x2C, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11, 258 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 259 0x00, 0x00, 0x22, 0x65, 0x22, 0x65, 0x00, 0x00, 260 0x00, 0x00, 0x20, 0x00, 0x00, 0x10, 0x00, 0x00, 261 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 262 0x00, 0x00, 263 }; 264 265 static const u8 ice_fdir_ipv4_pfcp_session_pkt[] = { 266 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 267 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 268 0x00, 0x2C, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11, 269 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 270 0x00, 0x00, 0x22, 0x65, 0x22, 0x65, 0x00, 0x00, 271 0x00, 0x00, 0x21, 0x00, 0x00, 0x10, 0x00, 0x00, 272 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 273 0x00, 0x00, 274 }; 275 276 static const u8 ice_fdir_ipv6_pfcp_node_pkt[] = { 277 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 278 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00, 279 0x00, 0x00, 0x00, 0x18, 0x11, 0x40, 0x00, 0x00, 280 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 281 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 282 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 283 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x65, 284 0x22, 0x65, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 285 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 286 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 287 }; 288 289 static const u8 ice_fdir_ipv6_pfcp_session_pkt[] = { 290 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 291 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00, 292 0x00, 0x00, 0x00, 0x18, 0x11, 0x40, 0x00, 0x00, 293 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 294 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 295 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 296 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x65, 297 0x22, 0x65, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 298 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 299 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 300 }; 301 302 static const u8 ice_fdir_non_ip_l2_pkt[] = { 303 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 304 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 305 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 306 }; 307 308 static const u8 ice_fdir_ecpri_tp0_pkt[] = { 309 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 310 0x00, 0x00, 0x00, 0x00, 0xAE, 0xFE, 0x10, 0x00, 311 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 312 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 313 }; 314 315 static const u8 ice_fdir_ipv4_udp_ecpri_tp0_pkt[] = { 316 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 317 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 318 0x00, 0x1C, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11, 319 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 320 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 321 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 322 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 323 }; 324 325 static const u8 ice_fdir_tcpv6_pkt[] = { 326 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 327 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00, 328 0x00, 0x00, 0x00, 0x14, 0x06, 0x40, 0x00, 0x00, 329 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 330 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 331 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 332 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 333 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 334 0x00, 0x00, 0x50, 0x00, 0x20, 0x00, 0x00, 0x00, 335 0x00, 0x00, 336 }; 337 338 static const u8 ice_fdir_udpv6_pkt[] = { 339 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 340 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00, 341 0x00, 0x00, 0x00, 0x08, 0x11, 0x40, 0x00, 0x00, 342 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 343 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 344 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 345 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 346 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 347 }; 348 349 static const u8 ice_fdir_sctpv6_pkt[] = { 350 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 351 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00, 352 0x00, 0x00, 0x00, 0x0C, 0x84, 0x40, 0x00, 0x00, 353 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 354 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 355 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 356 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 357 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 358 0x00, 0x00, 359 }; 360 361 static const u8 ice_fdir_ipv6_pkt[] = { 362 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 363 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00, 364 0x00, 0x00, 0x00, 0x00, 0x3B, 0x40, 0x00, 0x00, 365 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 366 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 367 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 368 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 369 }; 370 371 static const u8 ice_fdir_tcp4_tun_pkt[] = { 372 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 373 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 374 0x00, 0x5a, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11, 375 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 376 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 377 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00, 378 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 379 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 380 0x45, 0x00, 0x00, 0x28, 0x00, 0x00, 0x40, 0x00, 381 0x40, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 382 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 383 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 384 0x50, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 385 }; 386 387 static const u8 ice_fdir_udp4_tun_pkt[] = { 388 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 389 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 390 0x00, 0x4e, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11, 391 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 392 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 393 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00, 394 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 395 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 396 0x45, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x40, 0x00, 397 0x40, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 398 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 399 0x00, 0x00, 0x00, 0x00, 400 }; 401 402 static const u8 ice_fdir_sctp4_tun_pkt[] = { 403 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 404 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 405 0x00, 0x52, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11, 406 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 407 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 408 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00, 409 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 410 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 411 0x45, 0x00, 0x00, 0x20, 0x00, 0x01, 0x00, 0x00, 412 0x40, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 413 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 414 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 415 }; 416 417 static const u8 ice_fdir_ip4_tun_pkt[] = { 418 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 419 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 420 0x00, 0x46, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11, 421 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 422 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 423 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00, 424 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 425 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 426 0x45, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 427 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 428 0x00, 0x00, 0x00, 0x00, 429 }; 430 431 static const u8 ice_fdir_tcp6_tun_pkt[] = { 432 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 433 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 434 0x00, 0x6e, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11, 435 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 436 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 437 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00, 438 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 439 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd, 440 0x60, 0x00, 0x00, 0x00, 0x00, 0x14, 0x06, 0x40, 441 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 442 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 443 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 444 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 445 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 446 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x20, 0x00, 447 0x00, 0x00, 0x00, 0x00, 448 }; 449 450 static const u8 ice_fdir_udp6_tun_pkt[] = { 451 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 452 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 453 0x00, 0x62, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11, 454 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 455 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 456 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00, 457 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 458 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd, 459 0x60, 0x00, 0x00, 0x00, 0x00, 0x08, 0x11, 0x40, 460 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 461 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 462 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 463 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 464 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 465 }; 466 467 static const u8 ice_fdir_sctp6_tun_pkt[] = { 468 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 469 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 470 0x00, 0x66, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11, 471 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 472 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 473 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00, 474 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 475 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd, 476 0x60, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x84, 0x40, 477 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 478 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 479 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 480 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 481 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 482 0x00, 0x00, 0x00, 0x00, 483 }; 484 485 static const u8 ice_fdir_ip6_tun_pkt[] = { 486 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 487 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 488 0x00, 0x5a, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11, 489 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 490 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 491 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00, 492 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 493 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd, 494 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3b, 0x40, 495 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 496 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 497 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 498 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 499 }; 500 501 /* Flow Director no-op training packet table */ 502 static const struct ice_fdir_base_pkt ice_fdir_pkt[] = { 503 { 504 ICE_FLTR_PTYPE_NONF_IPV4_TCP, 505 sizeof(ice_fdir_tcpv4_pkt), ice_fdir_tcpv4_pkt, 506 sizeof(ice_fdir_tcp4_tun_pkt), ice_fdir_tcp4_tun_pkt, 507 }, 508 { 509 ICE_FLTR_PTYPE_NONF_IPV4_UDP, 510 sizeof(ice_fdir_udpv4_pkt), ice_fdir_udpv4_pkt, 511 sizeof(ice_fdir_udp4_tun_pkt), ice_fdir_udp4_tun_pkt, 512 }, 513 { 514 ICE_FLTR_PTYPE_NONF_IPV4_SCTP, 515 sizeof(ice_fdir_sctpv4_pkt), ice_fdir_sctpv4_pkt, 516 sizeof(ice_fdir_sctp4_tun_pkt), ice_fdir_sctp4_tun_pkt, 517 }, 518 { 519 ICE_FLTR_PTYPE_NONF_IPV4_OTHER, 520 sizeof(ice_fdir_ipv4_pkt), ice_fdir_ipv4_pkt, 521 sizeof(ice_fdir_ip4_tun_pkt), ice_fdir_ip4_tun_pkt, 522 }, 523 { 524 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_UDP, 525 sizeof(ice_fdir_udp4_gtpu4_pkt), 526 ice_fdir_udp4_gtpu4_pkt, 527 sizeof(ice_fdir_udp4_gtpu4_pkt), 528 ice_fdir_udp4_gtpu4_pkt, 529 }, 530 { 531 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_TCP, 532 sizeof(ice_fdir_tcp4_gtpu4_pkt), 533 ice_fdir_tcp4_gtpu4_pkt, 534 sizeof(ice_fdir_tcp4_gtpu4_pkt), 535 ice_fdir_tcp4_gtpu4_pkt, 536 }, 537 { 538 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_ICMP, 539 sizeof(ice_fdir_icmp4_gtpu4_pkt), 540 ice_fdir_icmp4_gtpu4_pkt, 541 sizeof(ice_fdir_icmp4_gtpu4_pkt), 542 ice_fdir_icmp4_gtpu4_pkt, 543 }, 544 { 545 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_OTHER, 546 sizeof(ice_fdir_ipv4_gtpu4_pkt), 547 ice_fdir_ipv4_gtpu4_pkt, 548 sizeof(ice_fdir_ipv4_gtpu4_pkt), 549 ice_fdir_ipv4_gtpu4_pkt, 550 }, 551 { 552 ICE_FLTR_PTYPE_NONF_IPV6_GTPU_IPV6_OTHER, 553 sizeof(ice_fdir_ipv6_gtpu6_pkt), 554 ice_fdir_ipv6_gtpu6_pkt, 555 sizeof(ice_fdir_ipv6_gtpu6_pkt), 556 ice_fdir_ipv6_gtpu6_pkt, 557 }, 558 { 559 ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_IPV4_OTHER, 560 sizeof(ice_fdir_ipv4_gtpu4_eh_pkt), 561 ice_fdir_ipv4_gtpu4_eh_pkt, 562 sizeof(ice_fdir_ipv4_gtpu4_eh_pkt), 563 ice_fdir_ipv4_gtpu4_eh_pkt, 564 }, 565 { 566 ICE_FLTR_PTYPE_NONF_IPV6_GTPU_EH_IPV6_OTHER, 567 sizeof(ice_fdir_ipv6_gtpu6_eh_pkt), 568 ice_fdir_ipv6_gtpu6_eh_pkt, 569 sizeof(ice_fdir_ipv6_gtpu6_eh_pkt), 570 ice_fdir_ipv6_gtpu6_eh_pkt, 571 }, 572 { 573 ICE_FLTR_PTYPE_NONF_IPV4_L2TPV3, 574 sizeof(ice_fdir_ipv4_l2tpv3_pkt), ice_fdir_ipv4_l2tpv3_pkt, 575 sizeof(ice_fdir_ipv4_l2tpv3_pkt), ice_fdir_ipv4_l2tpv3_pkt, 576 }, 577 { 578 ICE_FLTR_PTYPE_NONF_IPV6_L2TPV3, 579 sizeof(ice_fdir_ipv6_l2tpv3_pkt), ice_fdir_ipv6_l2tpv3_pkt, 580 sizeof(ice_fdir_ipv6_l2tpv3_pkt), ice_fdir_ipv6_l2tpv3_pkt, 581 }, 582 { 583 ICE_FLTR_PTYPE_NONF_IPV4_ESP, 584 sizeof(ice_fdir_ipv4_esp_pkt), ice_fdir_ipv4_esp_pkt, 585 sizeof(ice_fdir_ipv4_esp_pkt), ice_fdir_ipv4_esp_pkt, 586 }, 587 { 588 ICE_FLTR_PTYPE_NONF_IPV6_ESP, 589 sizeof(ice_fdir_ipv6_esp_pkt), ice_fdir_ipv6_esp_pkt, 590 sizeof(ice_fdir_ipv6_esp_pkt), ice_fdir_ipv6_esp_pkt, 591 }, 592 { 593 ICE_FLTR_PTYPE_NONF_IPV4_AH, 594 sizeof(ice_fdir_ipv4_ah_pkt), ice_fdir_ipv4_ah_pkt, 595 sizeof(ice_fdir_ipv4_ah_pkt), ice_fdir_ipv4_ah_pkt, 596 }, 597 { 598 ICE_FLTR_PTYPE_NONF_IPV6_AH, 599 sizeof(ice_fdir_ipv6_ah_pkt), ice_fdir_ipv6_ah_pkt, 600 sizeof(ice_fdir_ipv6_ah_pkt), ice_fdir_ipv6_ah_pkt, 601 }, 602 { 603 ICE_FLTR_PTYPE_NONF_IPV4_NAT_T_ESP, 604 sizeof(ice_fdir_ipv4_nat_t_esp_pkt), 605 ice_fdir_ipv4_nat_t_esp_pkt, 606 sizeof(ice_fdir_ipv4_nat_t_esp_pkt), 607 ice_fdir_ipv4_nat_t_esp_pkt, 608 }, 609 { 610 ICE_FLTR_PTYPE_NONF_IPV6_NAT_T_ESP, 611 sizeof(ice_fdir_ipv6_nat_t_esp_pkt), 612 ice_fdir_ipv6_nat_t_esp_pkt, 613 sizeof(ice_fdir_ipv6_nat_t_esp_pkt), 614 ice_fdir_ipv6_nat_t_esp_pkt, 615 }, 616 { 617 ICE_FLTR_PTYPE_NONF_IPV4_PFCP_NODE, 618 sizeof(ice_fdir_ipv4_pfcp_node_pkt), 619 ice_fdir_ipv4_pfcp_node_pkt, 620 sizeof(ice_fdir_ipv4_pfcp_node_pkt), 621 ice_fdir_ipv4_pfcp_node_pkt, 622 }, 623 { 624 ICE_FLTR_PTYPE_NONF_IPV4_PFCP_SESSION, 625 sizeof(ice_fdir_ipv4_pfcp_session_pkt), 626 ice_fdir_ipv4_pfcp_session_pkt, 627 sizeof(ice_fdir_ipv4_pfcp_session_pkt), 628 ice_fdir_ipv4_pfcp_session_pkt, 629 }, 630 { 631 ICE_FLTR_PTYPE_NONF_IPV6_PFCP_NODE, 632 sizeof(ice_fdir_ipv6_pfcp_node_pkt), 633 ice_fdir_ipv6_pfcp_node_pkt, 634 sizeof(ice_fdir_ipv6_pfcp_node_pkt), 635 ice_fdir_ipv6_pfcp_node_pkt, 636 }, 637 { 638 ICE_FLTR_PTYPE_NONF_IPV6_PFCP_SESSION, 639 sizeof(ice_fdir_ipv6_pfcp_session_pkt), 640 ice_fdir_ipv6_pfcp_session_pkt, 641 sizeof(ice_fdir_ipv6_pfcp_session_pkt), 642 ice_fdir_ipv6_pfcp_session_pkt, 643 }, 644 { 645 ICE_FLTR_PTYPE_NON_IP_L2, 646 sizeof(ice_fdir_non_ip_l2_pkt), ice_fdir_non_ip_l2_pkt, 647 sizeof(ice_fdir_non_ip_l2_pkt), ice_fdir_non_ip_l2_pkt, 648 }, 649 { 650 ICE_FLTR_PTYPE_NONF_IPV4_UDP_VXLAN, 651 sizeof(ice_fdir_udp4_vxlan_pkt), ice_fdir_udp4_vxlan_pkt, 652 sizeof(ice_fdir_udp4_vxlan_pkt), ice_fdir_udp4_vxlan_pkt, 653 }, 654 { 655 ICE_FLTR_PTYPE_NONF_ECPRI_TP0, 656 sizeof(ice_fdir_ecpri_tp0_pkt), ice_fdir_ecpri_tp0_pkt, 657 sizeof(ice_fdir_ecpri_tp0_pkt), ice_fdir_ecpri_tp0_pkt, 658 }, 659 { 660 ICE_FLTR_PTYPE_NONF_IPV4_UDP_ECPRI_TP0, 661 sizeof(ice_fdir_ipv4_udp_ecpri_tp0_pkt), 662 ice_fdir_ipv4_udp_ecpri_tp0_pkt, 663 sizeof(ice_fdir_ipv4_udp_ecpri_tp0_pkt), 664 ice_fdir_ipv4_udp_ecpri_tp0_pkt, 665 }, 666 { 667 ICE_FLTR_PTYPE_NONF_IPV6_TCP, 668 sizeof(ice_fdir_tcpv6_pkt), ice_fdir_tcpv6_pkt, 669 sizeof(ice_fdir_tcp6_tun_pkt), ice_fdir_tcp6_tun_pkt, 670 }, 671 { 672 ICE_FLTR_PTYPE_NONF_IPV6_UDP, 673 sizeof(ice_fdir_udpv6_pkt), ice_fdir_udpv6_pkt, 674 sizeof(ice_fdir_udp6_tun_pkt), ice_fdir_udp6_tun_pkt, 675 }, 676 { 677 ICE_FLTR_PTYPE_NONF_IPV6_SCTP, 678 sizeof(ice_fdir_sctpv6_pkt), ice_fdir_sctpv6_pkt, 679 sizeof(ice_fdir_sctp6_tun_pkt), ice_fdir_sctp6_tun_pkt, 680 }, 681 { 682 ICE_FLTR_PTYPE_NONF_IPV6_OTHER, 683 sizeof(ice_fdir_ipv6_pkt), ice_fdir_ipv6_pkt, 684 sizeof(ice_fdir_ip6_tun_pkt), ice_fdir_ip6_tun_pkt, 685 }, 686 }; 687 688 #define ICE_FDIR_NUM_PKT ARRAY_SIZE(ice_fdir_pkt) 689 690 /** 691 * ice_set_dflt_val_fd_desc 692 * @fd_fltr_ctx: pointer to fd filter descriptor 693 */ 694 static void ice_set_dflt_val_fd_desc(struct ice_fd_fltr_desc_ctx *fd_fltr_ctx) 695 { 696 fd_fltr_ctx->comp_q = ICE_FXD_FLTR_QW0_COMP_Q_ZERO; 697 fd_fltr_ctx->comp_report = ICE_FXD_FLTR_QW0_COMP_REPORT_SW_FAIL; 698 fd_fltr_ctx->fd_space = ICE_FXD_FLTR_QW0_FD_SPACE_GUAR_BEST; 699 fd_fltr_ctx->cnt_ena = ICE_FXD_FLTR_QW0_STAT_ENA_PKTS; 700 fd_fltr_ctx->evict_ena = ICE_FXD_FLTR_QW0_EVICT_ENA_TRUE; 701 fd_fltr_ctx->toq = ICE_FXD_FLTR_QW0_TO_Q_EQUALS_QINDEX; 702 fd_fltr_ctx->toq_prio = ICE_FXD_FLTR_QW0_TO_Q_PRIO1; 703 fd_fltr_ctx->dpu_recipe = ICE_FXD_FLTR_QW0_DPU_RECIPE_DFLT; 704 fd_fltr_ctx->drop = ICE_FXD_FLTR_QW0_DROP_NO; 705 fd_fltr_ctx->flex_prio = ICE_FXD_FLTR_QW0_FLEX_PRI_NONE; 706 fd_fltr_ctx->flex_mdid = ICE_FXD_FLTR_QW0_FLEX_MDID0; 707 fd_fltr_ctx->flex_val = ICE_FXD_FLTR_QW0_FLEX_VAL0; 708 fd_fltr_ctx->dtype = ICE_TX_DESC_DTYPE_FLTR_PROG; 709 fd_fltr_ctx->desc_prof_prio = ICE_FXD_FLTR_QW1_PROF_PRIO_ZERO; 710 fd_fltr_ctx->desc_prof = ICE_FXD_FLTR_QW1_PROF_ZERO; 711 fd_fltr_ctx->swap = ICE_FXD_FLTR_QW1_SWAP_SET; 712 fd_fltr_ctx->fdid_prio = ICE_FXD_FLTR_QW1_FDID_PRI_ONE; 713 fd_fltr_ctx->fdid_mdid = ICE_FXD_FLTR_QW1_FDID_MDID_FD; 714 fd_fltr_ctx->fdid = ICE_FXD_FLTR_QW1_FDID_ZERO; 715 } 716 717 /** 718 * ice_set_fd_desc_val 719 * @ctx: pointer to fd filter descriptor context 720 * @fdir_desc: populated with fd filter descriptor values 721 */ 722 static void 723 ice_set_fd_desc_val(struct ice_fd_fltr_desc_ctx *ctx, 724 struct ice_fltr_desc *fdir_desc) 725 { 726 u64 qword; 727 728 /* prep QW0 of FD filter programming desc */ 729 qword = ((u64)ctx->qindex << ICE_FXD_FLTR_QW0_QINDEX_S) & 730 ICE_FXD_FLTR_QW0_QINDEX_M; 731 qword |= ((u64)ctx->comp_q << ICE_FXD_FLTR_QW0_COMP_Q_S) & 732 ICE_FXD_FLTR_QW0_COMP_Q_M; 733 qword |= ((u64)ctx->comp_report << ICE_FXD_FLTR_QW0_COMP_REPORT_S) & 734 ICE_FXD_FLTR_QW0_COMP_REPORT_M; 735 qword |= ((u64)ctx->fd_space << ICE_FXD_FLTR_QW0_FD_SPACE_S) & 736 ICE_FXD_FLTR_QW0_FD_SPACE_M; 737 qword |= ((u64)ctx->cnt_index << ICE_FXD_FLTR_QW0_STAT_CNT_S) & 738 ICE_FXD_FLTR_QW0_STAT_CNT_M; 739 qword |= ((u64)ctx->cnt_ena << ICE_FXD_FLTR_QW0_STAT_ENA_S) & 740 ICE_FXD_FLTR_QW0_STAT_ENA_M; 741 qword |= ((u64)ctx->evict_ena << ICE_FXD_FLTR_QW0_EVICT_ENA_S) & 742 ICE_FXD_FLTR_QW0_EVICT_ENA_M; 743 qword |= ((u64)ctx->toq << ICE_FXD_FLTR_QW0_TO_Q_S) & 744 ICE_FXD_FLTR_QW0_TO_Q_M; 745 qword |= ((u64)ctx->toq_prio << ICE_FXD_FLTR_QW0_TO_Q_PRI_S) & 746 ICE_FXD_FLTR_QW0_TO_Q_PRI_M; 747 qword |= ((u64)ctx->dpu_recipe << ICE_FXD_FLTR_QW0_DPU_RECIPE_S) & 748 ICE_FXD_FLTR_QW0_DPU_RECIPE_M; 749 qword |= ((u64)ctx->drop << ICE_FXD_FLTR_QW0_DROP_S) & 750 ICE_FXD_FLTR_QW0_DROP_M; 751 qword |= ((u64)ctx->flex_prio << ICE_FXD_FLTR_QW0_FLEX_PRI_S) & 752 ICE_FXD_FLTR_QW0_FLEX_PRI_M; 753 qword |= ((u64)ctx->flex_mdid << ICE_FXD_FLTR_QW0_FLEX_MDID_S) & 754 ICE_FXD_FLTR_QW0_FLEX_MDID_M; 755 qword |= ((u64)ctx->flex_val << ICE_FXD_FLTR_QW0_FLEX_VAL_S) & 756 ICE_FXD_FLTR_QW0_FLEX_VAL_M; 757 fdir_desc->qidx_compq_space_stat = CPU_TO_LE64(qword); 758 759 /* prep QW1 of FD filter programming desc */ 760 qword = ((u64)ctx->dtype << ICE_FXD_FLTR_QW1_DTYPE_S) & 761 ICE_FXD_FLTR_QW1_DTYPE_M; 762 qword |= ((u64)ctx->pcmd << ICE_FXD_FLTR_QW1_PCMD_S) & 763 ICE_FXD_FLTR_QW1_PCMD_M; 764 qword |= ((u64)ctx->desc_prof_prio << ICE_FXD_FLTR_QW1_PROF_PRI_S) & 765 ICE_FXD_FLTR_QW1_PROF_PRI_M; 766 qword |= ((u64)ctx->desc_prof << ICE_FXD_FLTR_QW1_PROF_S) & 767 ICE_FXD_FLTR_QW1_PROF_M; 768 qword |= ((u64)ctx->fd_vsi << ICE_FXD_FLTR_QW1_FD_VSI_S) & 769 ICE_FXD_FLTR_QW1_FD_VSI_M; 770 qword |= ((u64)ctx->swap << ICE_FXD_FLTR_QW1_SWAP_S) & 771 ICE_FXD_FLTR_QW1_SWAP_M; 772 qword |= ((u64)ctx->fdid_prio << ICE_FXD_FLTR_QW1_FDID_PRI_S) & 773 ICE_FXD_FLTR_QW1_FDID_PRI_M; 774 qword |= ((u64)ctx->fdid_mdid << ICE_FXD_FLTR_QW1_FDID_MDID_S) & 775 ICE_FXD_FLTR_QW1_FDID_MDID_M; 776 qword |= ((u64)ctx->fdid << ICE_FXD_FLTR_QW1_FDID_S) & 777 ICE_FXD_FLTR_QW1_FDID_M; 778 fdir_desc->dtype_cmd_vsi_fdid = CPU_TO_LE64(qword); 779 } 780 781 /** 782 * ice_fdir_get_prgm_desc - set a fdir descriptor from a fdir filter struct 783 * @hw: pointer to the hardware structure 784 * @input: filter 785 * @fdesc: filter descriptor 786 * @add: if add is true, this is an add operation, false implies delete 787 */ 788 void 789 ice_fdir_get_prgm_desc(struct ice_hw *hw, struct ice_fdir_fltr *input, 790 struct ice_fltr_desc *fdesc, bool add) 791 { 792 struct ice_fd_fltr_desc_ctx fdir_fltr_ctx = { 0 }; 793 794 /* set default context info */ 795 ice_set_dflt_val_fd_desc(&fdir_fltr_ctx); 796 797 /* change sideband filtering values */ 798 fdir_fltr_ctx.fdid = input->fltr_id; 799 if (input->dest_ctl == ICE_FLTR_PRGM_DESC_DEST_DROP_PKT) { 800 fdir_fltr_ctx.drop = ICE_FXD_FLTR_QW0_DROP_YES; 801 fdir_fltr_ctx.qindex = 0; 802 } else if (input->dest_ctl == 803 ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_OTHER) { 804 fdir_fltr_ctx.drop = ICE_FXD_FLTR_QW0_DROP_NO; 805 fdir_fltr_ctx.qindex = 0; 806 } else { 807 if (input->dest_ctl == 808 ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_QGROUP) 809 fdir_fltr_ctx.toq = input->q_region; 810 fdir_fltr_ctx.drop = ICE_FXD_FLTR_QW0_DROP_NO; 811 fdir_fltr_ctx.qindex = input->q_index; 812 } 813 fdir_fltr_ctx.cnt_ena = input->cnt_ena; 814 fdir_fltr_ctx.cnt_index = input->cnt_index; 815 fdir_fltr_ctx.fd_vsi = ice_get_hw_vsi_num(hw, input->dest_vsi); 816 fdir_fltr_ctx.evict_ena = ICE_FXD_FLTR_QW0_EVICT_ENA_FALSE; 817 if (input->dest_ctl == ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_OTHER) 818 fdir_fltr_ctx.toq_prio = 0; 819 else 820 fdir_fltr_ctx.toq_prio = 3; 821 fdir_fltr_ctx.pcmd = add ? ICE_FXD_FLTR_QW1_PCMD_ADD : 822 ICE_FXD_FLTR_QW1_PCMD_REMOVE; 823 fdir_fltr_ctx.swap = ICE_FXD_FLTR_QW1_SWAP_NOT_SET; 824 fdir_fltr_ctx.comp_q = ICE_FXD_FLTR_QW0_COMP_Q_ZERO; 825 fdir_fltr_ctx.comp_report = input->comp_report; 826 fdir_fltr_ctx.fdid_prio = input->fdid_prio; 827 fdir_fltr_ctx.desc_prof = 1; 828 fdir_fltr_ctx.desc_prof_prio = 3; 829 ice_set_fd_desc_val(&fdir_fltr_ctx, fdesc); 830 } 831 832 /** 833 * ice_alloc_fd_res_cntr - obtain counter resource for FD type 834 * @hw: pointer to the hardware structure 835 * @cntr_id: returns counter index 836 */ 837 enum ice_status ice_alloc_fd_res_cntr(struct ice_hw *hw, u16 *cntr_id) 838 { 839 return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_COUNTER_BLOCK, 840 ICE_AQC_RES_TYPE_FLAG_DEDICATED, 1, cntr_id); 841 } 842 843 /** 844 * ice_free_fd_res_cntr - Free counter resource for FD type 845 * @hw: pointer to the hardware structure 846 * @cntr_id: counter index to be freed 847 */ 848 enum ice_status ice_free_fd_res_cntr(struct ice_hw *hw, u16 cntr_id) 849 { 850 return ice_free_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_COUNTER_BLOCK, 851 ICE_AQC_RES_TYPE_FLAG_DEDICATED, 1, cntr_id); 852 } 853 854 /** 855 * ice_alloc_fd_guar_item - allocate resource for FD guaranteed entries 856 * @hw: pointer to the hardware structure 857 * @cntr_id: returns counter index 858 * @num_fltr: number of filter entries to be allocated 859 */ 860 enum ice_status 861 ice_alloc_fd_guar_item(struct ice_hw *hw, u16 *cntr_id, u16 num_fltr) 862 { 863 return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_GUARANTEED_ENTRIES, 864 ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr, 865 cntr_id); 866 } 867 868 /** 869 * ice_free_fd_guar_item - Free flow director guaranteed entries 870 * @hw: pointer to the hardware structure 871 * @cntr_id: counter index that needs to be freed 872 * @num_fltr: number of filters to be freed 873 */ 874 enum ice_status 875 ice_free_fd_guar_item(struct ice_hw *hw, u16 cntr_id, u16 num_fltr) 876 { 877 return ice_free_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_GUARANTEED_ENTRIES, 878 ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr, 879 cntr_id); 880 } 881 882 /** 883 * ice_alloc_fd_shrd_item - allocate resource for flow director shared entries 884 * @hw: pointer to the hardware structure 885 * @cntr_id: returns counter index 886 * @num_fltr: number of filter entries to be allocated 887 */ 888 enum ice_status 889 ice_alloc_fd_shrd_item(struct ice_hw *hw, u16 *cntr_id, u16 num_fltr) 890 { 891 return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_SHARED_ENTRIES, 892 ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr, 893 cntr_id); 894 } 895 896 /** 897 * ice_free_fd_shrd_item - Free flow director shared entries 898 * @hw: pointer to the hardware structure 899 * @cntr_id: counter index that needs to be freed 900 * @num_fltr: number of filters to be freed 901 */ 902 enum ice_status 903 ice_free_fd_shrd_item(struct ice_hw *hw, u16 cntr_id, u16 num_fltr) 904 { 905 return ice_free_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_SHARED_ENTRIES, 906 ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr, 907 cntr_id); 908 } 909 910 /** 911 * ice_get_fdir_cnt_all - get the number of Flow Director filters 912 * @hw: hardware data structure 913 * 914 * Returns the number of filters available on device 915 */ 916 int ice_get_fdir_cnt_all(struct ice_hw *hw) 917 { 918 return hw->func_caps.fd_fltr_guar + hw->func_caps.fd_fltr_best_effort; 919 } 920 921 /** 922 * ice_pkt_insert_ipv6_addr - insert a be32 IPv6 address into a memory buffer. 923 * @pkt: packet buffer 924 * @offset: offset into buffer 925 * @addr: IPv6 address to convert and insert into pkt at offset 926 */ 927 static void ice_pkt_insert_ipv6_addr(u8 *pkt, int offset, __be32 *addr) 928 { 929 int idx; 930 931 for (idx = 0; idx < ICE_IPV6_ADDR_LEN_AS_U32; idx++) 932 ice_memcpy(pkt + offset + idx * sizeof(*addr), &addr[idx], 933 sizeof(*addr), ICE_NONDMA_TO_NONDMA); 934 } 935 936 /** 937 * ice_pkt_insert_u6_qfi - insert a u6 value qfi into a memory buffer for gtpu 938 * @pkt: packet buffer 939 * @offset: offset into buffer 940 * @data: 8 bit value to convert and insert into pkt at offset 941 * 942 * This function is designed for inserting qfi (6 bits) for gtpu. 943 */ 944 static void ice_pkt_insert_u6_qfi(u8 *pkt, int offset, u8 data) 945 { 946 u8 ret; 947 948 ret = (data & 0x3F) + (*(pkt + offset) & 0xC0); 949 ice_memcpy(pkt + offset, &ret, sizeof(ret), ICE_NONDMA_TO_NONDMA); 950 } 951 952 /** 953 * ice_pkt_insert_u8 - insert a u8 value into a memory buffer. 954 * @pkt: packet buffer 955 * @offset: offset into buffer 956 * @data: 8 bit value to convert and insert into pkt at offset 957 */ 958 static void ice_pkt_insert_u8(u8 *pkt, int offset, u8 data) 959 { 960 ice_memcpy(pkt + offset, &data, sizeof(data), ICE_NONDMA_TO_NONDMA); 961 } 962 963 /** 964 * ice_pkt_insert_u8_tc - insert a u8 value into a memory buffer for TC ipv6. 965 * @pkt: packet buffer 966 * @offset: offset into buffer 967 * @data: 8 bit value to convert and insert into pkt at offset 968 * 969 * This function is designed for inserting Traffic Class (TC) for IPv6, 970 * since that TC is not aligned in number of bytes. Here we split it out 971 * into two part and fill each byte with data copy from pkt, then insert 972 * the two bytes data one by one. 973 */ 974 static void ice_pkt_insert_u8_tc(u8 *pkt, int offset, u8 data) 975 { 976 u8 high, low; 977 978 high = (data >> 4) + (*(pkt + offset) & 0xF0); 979 ice_memcpy(pkt + offset, &high, sizeof(high), ICE_NONDMA_TO_NONDMA); 980 981 low = (*(pkt + offset + 1) & 0x0F) + ((data & 0x0F) << 4); 982 ice_memcpy(pkt + offset + 1, &low, sizeof(low), ICE_NONDMA_TO_NONDMA); 983 } 984 985 /** 986 * ice_pkt_insert_u16 - insert a be16 value into a memory buffer. 987 * @pkt: packet buffer 988 * @offset: offset into buffer 989 * @data: 16 bit value to convert and insert into pkt at offset 990 */ 991 static void ice_pkt_insert_u16(u8 *pkt, int offset, __be16 data) 992 { 993 ice_memcpy(pkt + offset, &data, sizeof(data), ICE_NONDMA_TO_NONDMA); 994 } 995 996 /** 997 * ice_pkt_insert_u32 - insert a be32 value into a memory buffer. 998 * @pkt: packet buffer 999 * @offset: offset into buffer 1000 * @data: 32 bit value to convert and insert into pkt at offset 1001 */ 1002 static void ice_pkt_insert_u32(u8 *pkt, int offset, __be32 data) 1003 { 1004 ice_memcpy(pkt + offset, &data, sizeof(data), ICE_NONDMA_TO_NONDMA); 1005 } 1006 1007 /** 1008 * ice_pkt_insert_mac_addr - insert a MAC addr into a memory buffer. 1009 * @pkt: packet buffer 1010 * @addr: MAC address to convert and insert into pkt at offset 1011 */ 1012 static void ice_pkt_insert_mac_addr(u8 *pkt, u8 *addr) 1013 { 1014 ice_memcpy(pkt, addr, ETH_ALEN, ICE_NONDMA_TO_NONDMA); 1015 } 1016 1017 /** 1018 * ice_fdir_get_open_tunnel_port 1019 * @hw: pointer to the hardware structure 1020 * @flow: flow ptype 1021 * @port: returns open port 1022 * 1023 * returns an open tunnel port specified for this flow type 1024 */ 1025 static enum ice_status 1026 ice_fdir_get_open_tunnel_port(struct ice_hw *hw, enum ice_fltr_ptype flow, 1027 u16 *port) 1028 { 1029 switch (flow) { 1030 case ICE_FLTR_PTYPE_NONF_IPV4_UDP_ECPRI_TP0: 1031 /* eCPRI tunnel */ 1032 if (!ice_get_open_tunnel_port(hw, TNL_ECPRI, port)) 1033 return ICE_ERR_DOES_NOT_EXIST; 1034 break; 1035 default: 1036 if (!ice_get_open_tunnel_port(hw, TNL_VXLAN, port) && 1037 !ice_get_open_tunnel_port(hw, TNL_GENEVE, port)) 1038 return ICE_ERR_DOES_NOT_EXIST; 1039 } 1040 1041 return ICE_SUCCESS; 1042 } 1043 1044 /** 1045 * ice_fdir_get_gen_prgm_pkt - generate a training packet 1046 * @hw: pointer to the hardware structure 1047 * @input: flow director filter data structure 1048 * @pkt: pointer to return filter packet 1049 * @frag: generate a fragment packet 1050 * @tun: true implies generate a tunnel packet 1051 */ 1052 enum ice_status 1053 ice_fdir_get_gen_prgm_pkt(struct ice_hw *hw, struct ice_fdir_fltr *input, 1054 u8 *pkt, bool frag, bool tun) 1055 { 1056 enum ice_fltr_ptype flow; 1057 u16 tnl_port; 1058 u8 *loc; 1059 u16 idx; 1060 1061 if (input->flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER) { 1062 switch (input->ip.v4.proto) { 1063 case ICE_IP_PROTO_TCP: 1064 flow = ICE_FLTR_PTYPE_NONF_IPV4_TCP; 1065 break; 1066 case ICE_IP_PROTO_UDP: 1067 flow = ICE_FLTR_PTYPE_NONF_IPV4_UDP; 1068 break; 1069 case ICE_IP_PROTO_SCTP: 1070 flow = ICE_FLTR_PTYPE_NONF_IPV4_SCTP; 1071 break; 1072 default: 1073 flow = ICE_FLTR_PTYPE_NONF_IPV4_OTHER; 1074 break; 1075 } 1076 } else if (input->flow_type == ICE_FLTR_PTYPE_NONF_IPV6_OTHER) { 1077 switch (input->ip.v6.proto) { 1078 case ICE_IP_PROTO_TCP: 1079 flow = ICE_FLTR_PTYPE_NONF_IPV6_TCP; 1080 break; 1081 case ICE_IP_PROTO_UDP: 1082 flow = ICE_FLTR_PTYPE_NONF_IPV6_UDP; 1083 break; 1084 case ICE_IP_PROTO_SCTP: 1085 flow = ICE_FLTR_PTYPE_NONF_IPV6_SCTP; 1086 break; 1087 default: 1088 flow = ICE_FLTR_PTYPE_NONF_IPV6_OTHER; 1089 break; 1090 } 1091 } else { 1092 flow = input->flow_type; 1093 } 1094 1095 for (idx = 0; idx < ICE_FDIR_NUM_PKT; idx++) 1096 if (ice_fdir_pkt[idx].flow == flow) 1097 break; 1098 if (idx == ICE_FDIR_NUM_PKT) 1099 return ICE_ERR_PARAM; 1100 if (!tun) { 1101 ice_memcpy(pkt, ice_fdir_pkt[idx].pkt, 1102 ice_fdir_pkt[idx].pkt_len, ICE_NONDMA_TO_NONDMA); 1103 loc = pkt; 1104 } else { 1105 enum ice_status ret; 1106 1107 ret = ice_fdir_get_open_tunnel_port(hw, flow, &tnl_port); 1108 if (ret) 1109 return ret; 1110 1111 if (!ice_fdir_pkt[idx].tun_pkt) 1112 return ICE_ERR_PARAM; 1113 ice_memcpy(pkt, ice_fdir_pkt[idx].tun_pkt, 1114 ice_fdir_pkt[idx].tun_pkt_len, ICE_NONDMA_TO_NONDMA); 1115 ice_pkt_insert_u16(pkt, ICE_IPV4_UDP_DST_PORT_OFFSET, 1116 HTONS(tnl_port)); 1117 loc = &pkt[ICE_FDIR_TUN_PKT_OFF]; 1118 } 1119 1120 /* Reverse the src and dst, since the HW expects them to be from Tx 1121 * perspective. The input from user is from Rx filter perspective. 1122 */ 1123 switch (flow) { 1124 case ICE_FLTR_PTYPE_NONF_IPV4_TCP: 1125 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET, 1126 input->ip.v4.src_ip); 1127 ice_pkt_insert_u16(loc, ICE_IPV4_TCP_DST_PORT_OFFSET, 1128 input->ip.v4.src_port); 1129 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET, 1130 input->ip.v4.dst_ip); 1131 ice_pkt_insert_u16(loc, ICE_IPV4_TCP_SRC_PORT_OFFSET, 1132 input->ip.v4.dst_port); 1133 ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos); 1134 ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl); 1135 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac); 1136 if (frag) 1137 loc[20] = ICE_FDIR_IPV4_PKT_FLAG_DF; 1138 break; 1139 case ICE_FLTR_PTYPE_NONF_IPV4_UDP: 1140 ice_pkt_insert_mac_addr(pkt, input->ext_data_outer.dst_mac); 1141 ice_pkt_insert_mac_addr(pkt + ETH_ALEN, 1142 input->ext_data_outer.src_mac); 1143 ice_pkt_insert_u32(pkt, ICE_IPV4_SRC_ADDR_OFFSET, 1144 input->ip_outer.v4.dst_ip); 1145 ice_pkt_insert_u32(pkt, ICE_IPV4_DST_ADDR_OFFSET, 1146 input->ip_outer.v4.src_ip); 1147 ice_pkt_insert_u8(pkt, ICE_IPV4_TOS_OFFSET, input->ip_outer.v4.tos); 1148 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET, 1149 input->ip.v4.src_ip); 1150 ice_pkt_insert_u16(loc, ICE_IPV4_UDP_DST_PORT_OFFSET, 1151 input->ip.v4.src_port); 1152 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET, 1153 input->ip.v4.dst_ip); 1154 ice_pkt_insert_u16(loc, ICE_IPV4_UDP_SRC_PORT_OFFSET, 1155 input->ip.v4.dst_port); 1156 ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos); 1157 ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl); 1158 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac); 1159 ice_pkt_insert_mac_addr(loc + ETH_ALEN, input->ext_data.src_mac); 1160 break; 1161 case ICE_FLTR_PTYPE_NONF_IPV4_SCTP: 1162 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET, 1163 input->ip.v4.src_ip); 1164 ice_pkt_insert_u16(loc, ICE_IPV4_SCTP_DST_PORT_OFFSET, 1165 input->ip.v4.src_port); 1166 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET, 1167 input->ip.v4.dst_ip); 1168 ice_pkt_insert_u16(loc, ICE_IPV4_SCTP_SRC_PORT_OFFSET, 1169 input->ip.v4.dst_port); 1170 ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos); 1171 ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl); 1172 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac); 1173 break; 1174 case ICE_FLTR_PTYPE_NONF_IPV4_OTHER: 1175 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET, 1176 input->ip.v4.src_ip); 1177 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET, 1178 input->ip.v4.dst_ip); 1179 ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos); 1180 ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl); 1181 ice_pkt_insert_u8(loc, ICE_IPV4_PROTO_OFFSET, 1182 input->ip.v4.proto); 1183 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac); 1184 break; 1185 case ICE_FLTR_PTYPE_NONF_IPV4_UDP_VXLAN: 1186 ice_pkt_insert_mac_addr(pkt, input->ext_data_outer.dst_mac); 1187 ice_pkt_insert_mac_addr(pkt + ETH_ALEN, input->ext_data_outer.src_mac); 1188 ice_pkt_insert_u32(pkt, ICE_IPV4_SRC_ADDR_OFFSET, 1189 input->ip_outer.v4.dst_ip); 1190 ice_pkt_insert_u32(pkt, ICE_IPV4_DST_ADDR_OFFSET, 1191 input->ip_outer.v4.src_ip); 1192 ice_pkt_insert_u8(pkt, ICE_IPV4_TOS_OFFSET, input->ip_outer.v4.tos); 1193 ice_pkt_insert_u32(pkt, ICE_IPV4_VXLAN_VNI_OFFSET, 1194 input->vxlan_data.vni); 1195 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET, 1196 input->ip.v4.src_ip); 1197 ice_pkt_insert_u16(loc, ICE_IPV4_UDP_DST_PORT_OFFSET, 1198 input->ip.v4.src_port); 1199 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET, 1200 input->ip.v4.dst_ip); 1201 ice_pkt_insert_u16(loc, ICE_IPV4_UDP_SRC_PORT_OFFSET, 1202 input->ip.v4.dst_port); 1203 ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos); 1204 ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl); 1205 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac); 1206 ice_pkt_insert_mac_addr(loc + ETH_ALEN, input->ext_data.src_mac); 1207 break; 1208 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_OTHER: 1209 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET, 1210 input->ip.v4.src_ip); 1211 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET, 1212 input->ip.v4.dst_ip); 1213 ice_pkt_insert_u32(loc, ICE_IPV4_GTPU_TEID_OFFSET, 1214 input->gtpu_data.teid); 1215 break; 1216 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_UDP: 1217 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_TCP: 1218 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_ICMP: 1219 case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_IPV4_OTHER: 1220 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET, 1221 input->ip.v4.src_ip); 1222 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET, 1223 input->ip.v4.dst_ip); 1224 ice_pkt_insert_u32(loc, ICE_IPV4_GTPU_TEID_OFFSET, 1225 input->gtpu_data.teid); 1226 ice_pkt_insert_u6_qfi(loc, ICE_IPV4_GTPU_QFI_OFFSET, 1227 input->gtpu_data.qfi); 1228 break; 1229 case ICE_FLTR_PTYPE_NONF_IPV6_GTPU_IPV6_OTHER: 1230 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET, 1231 input->ip.v6.src_ip); 1232 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET, 1233 input->ip.v6.dst_ip); 1234 ice_pkt_insert_u32(loc, ICE_IPV6_GTPU_TEID_OFFSET, 1235 input->gtpu_data.teid); 1236 break; 1237 case ICE_FLTR_PTYPE_NONF_IPV6_GTPU_EH_IPV6_OTHER: 1238 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET, 1239 input->ip.v6.src_ip); 1240 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET, 1241 input->ip.v6.dst_ip); 1242 ice_pkt_insert_u32(loc, ICE_IPV6_GTPU_TEID_OFFSET, 1243 input->gtpu_data.teid); 1244 ice_pkt_insert_u6_qfi(loc, ICE_IPV6_GTPU_QFI_OFFSET, 1245 input->gtpu_data.qfi); 1246 break; 1247 case ICE_FLTR_PTYPE_NONF_IPV4_L2TPV3: 1248 ice_pkt_insert_u32(loc, ICE_IPV4_L2TPV3_SESS_ID_OFFSET, 1249 input->l2tpv3_data.session_id); 1250 break; 1251 case ICE_FLTR_PTYPE_NONF_IPV6_L2TPV3: 1252 ice_pkt_insert_u32(loc, ICE_IPV6_L2TPV3_SESS_ID_OFFSET, 1253 input->l2tpv3_data.session_id); 1254 break; 1255 case ICE_FLTR_PTYPE_NONF_IPV4_ESP: 1256 ice_pkt_insert_u32(loc, ICE_IPV4_ESP_SPI_OFFSET, 1257 input->ip.v4.sec_parm_idx); 1258 break; 1259 case ICE_FLTR_PTYPE_NONF_IPV6_ESP: 1260 ice_pkt_insert_u32(loc, ICE_IPV6_ESP_SPI_OFFSET, 1261 input->ip.v6.sec_parm_idx); 1262 break; 1263 case ICE_FLTR_PTYPE_NONF_IPV4_AH: 1264 ice_pkt_insert_u32(loc, ICE_IPV4_AH_SPI_OFFSET, 1265 input->ip.v4.sec_parm_idx); 1266 break; 1267 case ICE_FLTR_PTYPE_NONF_IPV6_AH: 1268 ice_pkt_insert_u32(loc, ICE_IPV6_AH_SPI_OFFSET, 1269 input->ip.v6.sec_parm_idx); 1270 break; 1271 case ICE_FLTR_PTYPE_NONF_IPV4_NAT_T_ESP: 1272 ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET, 1273 input->ip.v4.src_ip); 1274 ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET, 1275 input->ip.v4.dst_ip); 1276 ice_pkt_insert_u32(loc, ICE_IPV4_NAT_T_ESP_SPI_OFFSET, 1277 input->ip.v4.sec_parm_idx); 1278 break; 1279 case ICE_FLTR_PTYPE_NONF_IPV6_NAT_T_ESP: 1280 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET, 1281 input->ip.v6.src_ip); 1282 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET, 1283 input->ip.v6.dst_ip); 1284 ice_pkt_insert_u32(loc, ICE_IPV6_NAT_T_ESP_SPI_OFFSET, 1285 input->ip.v6.sec_parm_idx); 1286 break; 1287 case ICE_FLTR_PTYPE_NONF_IPV4_PFCP_NODE: 1288 case ICE_FLTR_PTYPE_NONF_IPV4_PFCP_SESSION: 1289 ice_pkt_insert_u16(loc, ICE_IPV4_UDP_SRC_PORT_OFFSET, 1290 input->ip.v4.dst_port); 1291 break; 1292 case ICE_FLTR_PTYPE_NONF_IPV6_PFCP_NODE: 1293 case ICE_FLTR_PTYPE_NONF_IPV6_PFCP_SESSION: 1294 ice_pkt_insert_u16(loc, ICE_IPV6_UDP_SRC_PORT_OFFSET, 1295 input->ip.v6.dst_port); 1296 break; 1297 case ICE_FLTR_PTYPE_NON_IP_L2: 1298 ice_pkt_insert_u16(loc, ICE_MAC_ETHTYPE_OFFSET, 1299 input->ext_data.ether_type); 1300 break; 1301 case ICE_FLTR_PTYPE_NONF_ECPRI_TP0: 1302 ice_pkt_insert_u16(loc, ICE_ECPRI_TP0_PC_ID_OFFSET, 1303 input->ecpri_data.pc_id); 1304 break; 1305 case ICE_FLTR_PTYPE_NONF_IPV4_UDP_ECPRI_TP0: 1306 /* Use pkt instead of loc, since PC_ID is in outer part */ 1307 ice_pkt_insert_u16(pkt, ICE_IPV4_UDP_ECPRI_TP0_PC_ID_OFFSET, 1308 input->ecpri_data.pc_id); 1309 break; 1310 case ICE_FLTR_PTYPE_NONF_IPV6_TCP: 1311 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET, 1312 input->ip.v6.src_ip); 1313 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET, 1314 input->ip.v6.dst_ip); 1315 ice_pkt_insert_u16(loc, ICE_IPV6_TCP_DST_PORT_OFFSET, 1316 input->ip.v6.src_port); 1317 ice_pkt_insert_u16(loc, ICE_IPV6_TCP_SRC_PORT_OFFSET, 1318 input->ip.v6.dst_port); 1319 ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc); 1320 ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim); 1321 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac); 1322 break; 1323 case ICE_FLTR_PTYPE_NONF_IPV6_UDP: 1324 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET, 1325 input->ip.v6.src_ip); 1326 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET, 1327 input->ip.v6.dst_ip); 1328 ice_pkt_insert_u16(loc, ICE_IPV6_UDP_DST_PORT_OFFSET, 1329 input->ip.v6.src_port); 1330 ice_pkt_insert_u16(loc, ICE_IPV6_UDP_SRC_PORT_OFFSET, 1331 input->ip.v6.dst_port); 1332 ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc); 1333 ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim); 1334 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac); 1335 break; 1336 case ICE_FLTR_PTYPE_NONF_IPV6_SCTP: 1337 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET, 1338 input->ip.v6.src_ip); 1339 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET, 1340 input->ip.v6.dst_ip); 1341 ice_pkt_insert_u16(loc, ICE_IPV6_SCTP_DST_PORT_OFFSET, 1342 input->ip.v6.src_port); 1343 ice_pkt_insert_u16(loc, ICE_IPV6_SCTP_SRC_PORT_OFFSET, 1344 input->ip.v6.dst_port); 1345 ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc); 1346 ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim); 1347 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac); 1348 break; 1349 case ICE_FLTR_PTYPE_NONF_IPV6_OTHER: 1350 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET, 1351 input->ip.v6.src_ip); 1352 ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET, 1353 input->ip.v6.dst_ip); 1354 ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc); 1355 ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim); 1356 ice_pkt_insert_u8(loc, ICE_IPV6_PROTO_OFFSET, 1357 input->ip.v6.proto); 1358 ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac); 1359 break; 1360 default: 1361 return ICE_ERR_PARAM; 1362 } 1363 1364 if (input->flex_fltr) 1365 ice_pkt_insert_u16(loc, input->flex_offset, input->flex_word); 1366 1367 return ICE_SUCCESS; 1368 } 1369 1370 /** 1371 * ice_fdir_get_prgm_pkt - generate a training packet 1372 * @input: flow director filter data structure 1373 * @pkt: pointer to return filter packet 1374 * @frag: generate a fragment packet 1375 */ 1376 enum ice_status 1377 ice_fdir_get_prgm_pkt(struct ice_fdir_fltr *input, u8 *pkt, bool frag) 1378 { 1379 return ice_fdir_get_gen_prgm_pkt(NULL, input, pkt, frag, false); 1380 } 1381 1382 /** 1383 * ice_fdir_has_frag - does flow type have 2 ptypes 1384 * @flow: flow ptype 1385 * 1386 * returns true is there is a fragment packet for this ptype 1387 */ 1388 bool ice_fdir_has_frag(enum ice_fltr_ptype flow) 1389 { 1390 if (flow == ICE_FLTR_PTYPE_NONF_IPV4_OTHER) 1391 return true; 1392 else 1393 return false; 1394 } 1395 1396 /** 1397 * ice_fdir_find_by_idx - find filter with idx 1398 * @hw: pointer to hardware structure 1399 * @fltr_idx: index to find. 1400 * 1401 * Returns pointer to filter if found or null 1402 */ 1403 struct ice_fdir_fltr * 1404 ice_fdir_find_fltr_by_idx(struct ice_hw *hw, u32 fltr_idx) 1405 { 1406 struct ice_fdir_fltr *rule; 1407 1408 LIST_FOR_EACH_ENTRY(rule, &hw->fdir_list_head, ice_fdir_fltr, 1409 fltr_node) { 1410 /* rule ID found in the list */ 1411 if (fltr_idx == rule->fltr_id) 1412 return rule; 1413 if (fltr_idx < rule->fltr_id) 1414 break; 1415 } 1416 return NULL; 1417 } 1418 1419 /** 1420 * ice_fdir_list_add_fltr - add a new node to the flow director filter list 1421 * @hw: hardware structure 1422 * @fltr: filter node to add to structure 1423 */ 1424 void ice_fdir_list_add_fltr(struct ice_hw *hw, struct ice_fdir_fltr *fltr) 1425 { 1426 struct ice_fdir_fltr *rule, *parent = NULL; 1427 1428 LIST_FOR_EACH_ENTRY(rule, &hw->fdir_list_head, ice_fdir_fltr, 1429 fltr_node) { 1430 /* rule ID found or pass its spot in the list */ 1431 if (rule->fltr_id >= fltr->fltr_id) 1432 break; 1433 parent = rule; 1434 } 1435 1436 if (parent) 1437 LIST_ADD_AFTER(&fltr->fltr_node, &parent->fltr_node); 1438 else 1439 LIST_ADD(&fltr->fltr_node, &hw->fdir_list_head); 1440 } 1441 1442 /** 1443 * ice_fdir_update_cntrs - increment / decrement filter counter 1444 * @hw: pointer to hardware structure 1445 * @flow: filter flow type 1446 * @acl_fltr: true indicates an ACL filter 1447 * @add: true implies filters added 1448 */ 1449 void 1450 ice_fdir_update_cntrs(struct ice_hw *hw, enum ice_fltr_ptype flow, 1451 bool acl_fltr, bool add) 1452 { 1453 int incr; 1454 1455 incr = add ? 1 : -1; 1456 hw->fdir_active_fltr += incr; 1457 if (flow == ICE_FLTR_PTYPE_NONF_NONE || flow >= ICE_FLTR_PTYPE_MAX) { 1458 ice_debug(hw, ICE_DBG_SW, "Unknown filter type %d\n", flow); 1459 } else { 1460 if (acl_fltr) 1461 hw->acl_fltr_cnt[flow] += incr; 1462 else 1463 hw->fdir_fltr_cnt[flow] += incr; 1464 } 1465 } 1466 1467 /** 1468 * ice_cmp_ipv6_addr - compare 2 IP v6 addresses 1469 * @a: IP v6 address 1470 * @b: IP v6 address 1471 * 1472 * Returns 0 on equal, returns non-0 if different 1473 */ 1474 static int ice_cmp_ipv6_addr(__be32 *a, __be32 *b) 1475 { 1476 return memcmp(a, b, 4 * sizeof(__be32)); 1477 } 1478 1479 /** 1480 * ice_fdir_comp_rules - compare 2 filters 1481 * @a: a Flow Director filter data structure 1482 * @b: a Flow Director filter data structure 1483 * @v6: bool true if v6 filter 1484 * 1485 * Returns true if the filters match 1486 */ 1487 static bool 1488 ice_fdir_comp_rules(struct ice_fdir_fltr *a, struct ice_fdir_fltr *b, bool v6) 1489 { 1490 enum ice_fltr_ptype flow_type = a->flow_type; 1491 1492 /* The calling function already checks that the two filters have the 1493 * same flow_type. 1494 */ 1495 if (!v6) { 1496 if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_TCP || 1497 flow_type == ICE_FLTR_PTYPE_NONF_IPV4_UDP || 1498 flow_type == ICE_FLTR_PTYPE_NONF_IPV4_SCTP) { 1499 if (a->ip.v4.dst_ip == b->ip.v4.dst_ip && 1500 a->ip.v4.src_ip == b->ip.v4.src_ip && 1501 a->ip.v4.dst_port == b->ip.v4.dst_port && 1502 a->ip.v4.src_port == b->ip.v4.src_port) 1503 return true; 1504 } else if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER) { 1505 if (a->ip.v4.dst_ip == b->ip.v4.dst_ip && 1506 a->ip.v4.src_ip == b->ip.v4.src_ip && 1507 a->ip.v4.l4_header == b->ip.v4.l4_header && 1508 a->ip.v4.proto == b->ip.v4.proto && 1509 a->ip.v4.ip_ver == b->ip.v4.ip_ver && 1510 a->ip.v4.tos == b->ip.v4.tos) 1511 return true; 1512 } 1513 } else { 1514 if (flow_type == ICE_FLTR_PTYPE_NONF_IPV6_UDP || 1515 flow_type == ICE_FLTR_PTYPE_NONF_IPV6_TCP || 1516 flow_type == ICE_FLTR_PTYPE_NONF_IPV6_SCTP) { 1517 if (a->ip.v6.dst_port == b->ip.v6.dst_port && 1518 a->ip.v6.src_port == b->ip.v6.src_port && 1519 !ice_cmp_ipv6_addr(a->ip.v6.dst_ip, 1520 b->ip.v6.dst_ip) && 1521 !ice_cmp_ipv6_addr(a->ip.v6.src_ip, 1522 b->ip.v6.src_ip)) 1523 return true; 1524 } else if (flow_type == ICE_FLTR_PTYPE_NONF_IPV6_OTHER) { 1525 if (a->ip.v6.dst_port == b->ip.v6.dst_port && 1526 a->ip.v6.src_port == b->ip.v6.src_port) 1527 return true; 1528 } 1529 } 1530 1531 return false; 1532 } 1533 1534 /** 1535 * ice_fdir_is_dup_fltr - test if filter is already in list for PF 1536 * @hw: hardware data structure 1537 * @input: Flow Director filter data structure 1538 * 1539 * Returns true if the filter is found in the list 1540 */ 1541 bool ice_fdir_is_dup_fltr(struct ice_hw *hw, struct ice_fdir_fltr *input) 1542 { 1543 struct ice_fdir_fltr *rule; 1544 bool ret = false; 1545 1546 LIST_FOR_EACH_ENTRY(rule, &hw->fdir_list_head, ice_fdir_fltr, 1547 fltr_node) { 1548 enum ice_fltr_ptype flow_type; 1549 1550 if (rule->flow_type != input->flow_type) 1551 continue; 1552 1553 flow_type = input->flow_type; 1554 if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_TCP || 1555 flow_type == ICE_FLTR_PTYPE_NONF_IPV4_UDP || 1556 flow_type == ICE_FLTR_PTYPE_NONF_IPV4_SCTP || 1557 flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER) 1558 ret = ice_fdir_comp_rules(rule, input, false); 1559 else 1560 ret = ice_fdir_comp_rules(rule, input, true); 1561 if (ret) { 1562 if (rule->fltr_id == input->fltr_id && 1563 rule->q_index != input->q_index) 1564 ret = false; 1565 else 1566 break; 1567 } 1568 } 1569 1570 return ret; 1571 } 1572 1573 /** 1574 * ice_clear_pf_fd_table - admin command to clear FD table for PF 1575 * @hw: hardware data structure 1576 * 1577 * Clears FD table entries for a PF by issuing admin command (direct, 0x0B06) 1578 */ 1579 enum ice_status ice_clear_pf_fd_table(struct ice_hw *hw) 1580 { 1581 struct ice_aqc_clear_fd_table *cmd; 1582 struct ice_aq_desc desc; 1583 1584 cmd = &desc.params.clear_fd_table; 1585 ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_clear_fd_table); 1586 cmd->clear_type = CL_FD_VM_VF_TYPE_PF_IDX; 1587 /* vsi_index must be 0 to clear FD table for a PF */ 1588 cmd->vsi_index = CPU_TO_LE16(0); 1589 1590 return ice_aq_send_cmd(hw, &desc, NULL, 0, NULL); 1591 } 1592