1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright(c) 2019 Intel Corporation 3 */ 4 5 #include <sys/queue.h> 6 #include <stdio.h> 7 #include <errno.h> 8 #include <stdint.h> 9 #include <string.h> 10 #include <unistd.h> 11 #include <stdarg.h> 12 13 #include <rte_ether.h> 14 #include <ethdev_driver.h> 15 #include <rte_malloc.h> 16 #include <rte_tailq.h> 17 18 #include "ice_ethdev.h" 19 #include "ice_generic_flow.h" 20 21 #define ICE_FLOW_ENGINE_DISABLED(mask, type) ((mask) & BIT(type)) 22 23 static struct ice_engine_list engine_list = 24 TAILQ_HEAD_INITIALIZER(engine_list); 25 26 static int ice_flow_validate(struct rte_eth_dev *dev, 27 const struct rte_flow_attr *attr, 28 const struct rte_flow_item pattern[], 29 const struct rte_flow_action actions[], 30 struct rte_flow_error *error); 31 static struct rte_flow *ice_flow_create(struct rte_eth_dev *dev, 32 const struct rte_flow_attr *attr, 33 const struct rte_flow_item pattern[], 34 const struct rte_flow_action actions[], 35 struct rte_flow_error *error); 36 static int ice_flow_destroy(struct rte_eth_dev *dev, 37 struct rte_flow *flow, 38 struct rte_flow_error *error); 39 static int ice_flow_flush(struct rte_eth_dev *dev, 40 struct rte_flow_error *error); 41 static int ice_flow_query(struct rte_eth_dev *dev, 42 struct rte_flow *flow, 43 const struct rte_flow_action *actions, 44 void *data, 45 struct rte_flow_error *error); 46 47 const struct rte_flow_ops ice_flow_ops = { 48 .validate = ice_flow_validate, 49 .create = ice_flow_create, 50 .destroy = ice_flow_destroy, 51 .flush = ice_flow_flush, 52 .query = ice_flow_query, 53 }; 54 55 /* empty */ 56 enum rte_flow_item_type pattern_empty[] = { 57 RTE_FLOW_ITEM_TYPE_END, 58 }; 59 60 enum rte_flow_item_type pattern_any[] = { 61 RTE_FLOW_ITEM_TYPE_ANY, 62 RTE_FLOW_ITEM_TYPE_END, 63 }; 64 65 /* raw */ 66 enum rte_flow_item_type pattern_raw[] = { 67 RTE_FLOW_ITEM_TYPE_RAW, 68 RTE_FLOW_ITEM_TYPE_END, 69 }; 70 71 /* L2 */ 72 enum rte_flow_item_type pattern_ethertype[] = { 73 RTE_FLOW_ITEM_TYPE_ETH, 74 RTE_FLOW_ITEM_TYPE_END, 75 }; 76 enum rte_flow_item_type pattern_ethertype_vlan[] = { 77 RTE_FLOW_ITEM_TYPE_ETH, 78 RTE_FLOW_ITEM_TYPE_VLAN, 79 RTE_FLOW_ITEM_TYPE_END, 80 }; 81 enum rte_flow_item_type pattern_ethertype_qinq[] = { 82 RTE_FLOW_ITEM_TYPE_ETH, 83 RTE_FLOW_ITEM_TYPE_VLAN, 84 RTE_FLOW_ITEM_TYPE_VLAN, 85 RTE_FLOW_ITEM_TYPE_END, 86 }; 87 88 /* ARP */ 89 enum rte_flow_item_type pattern_eth_arp[] = { 90 RTE_FLOW_ITEM_TYPE_ETH, 91 RTE_FLOW_ITEM_TYPE_ARP_ETH_IPV4, 92 RTE_FLOW_ITEM_TYPE_END, 93 }; 94 95 /* non-tunnel IPv4 */ 96 enum rte_flow_item_type pattern_eth_ipv4[] = { 97 RTE_FLOW_ITEM_TYPE_ETH, 98 RTE_FLOW_ITEM_TYPE_IPV4, 99 RTE_FLOW_ITEM_TYPE_END, 100 }; 101 enum rte_flow_item_type pattern_eth_vlan_ipv4[] = { 102 RTE_FLOW_ITEM_TYPE_ETH, 103 RTE_FLOW_ITEM_TYPE_VLAN, 104 RTE_FLOW_ITEM_TYPE_IPV4, 105 RTE_FLOW_ITEM_TYPE_END, 106 }; 107 enum rte_flow_item_type pattern_eth_qinq_ipv4[] = { 108 RTE_FLOW_ITEM_TYPE_ETH, 109 RTE_FLOW_ITEM_TYPE_VLAN, 110 RTE_FLOW_ITEM_TYPE_VLAN, 111 RTE_FLOW_ITEM_TYPE_IPV4, 112 RTE_FLOW_ITEM_TYPE_END, 113 }; 114 enum rte_flow_item_type pattern_eth_ipv4_udp[] = { 115 RTE_FLOW_ITEM_TYPE_ETH, 116 RTE_FLOW_ITEM_TYPE_IPV4, 117 RTE_FLOW_ITEM_TYPE_UDP, 118 RTE_FLOW_ITEM_TYPE_END, 119 }; 120 enum rte_flow_item_type pattern_eth_vlan_ipv4_udp[] = { 121 RTE_FLOW_ITEM_TYPE_ETH, 122 RTE_FLOW_ITEM_TYPE_VLAN, 123 RTE_FLOW_ITEM_TYPE_IPV4, 124 RTE_FLOW_ITEM_TYPE_UDP, 125 RTE_FLOW_ITEM_TYPE_END, 126 }; 127 enum rte_flow_item_type pattern_eth_qinq_ipv4_udp[] = { 128 RTE_FLOW_ITEM_TYPE_ETH, 129 RTE_FLOW_ITEM_TYPE_VLAN, 130 RTE_FLOW_ITEM_TYPE_VLAN, 131 RTE_FLOW_ITEM_TYPE_IPV4, 132 RTE_FLOW_ITEM_TYPE_UDP, 133 RTE_FLOW_ITEM_TYPE_END, 134 }; 135 enum rte_flow_item_type pattern_eth_ipv4_tcp[] = { 136 RTE_FLOW_ITEM_TYPE_ETH, 137 RTE_FLOW_ITEM_TYPE_IPV4, 138 RTE_FLOW_ITEM_TYPE_TCP, 139 RTE_FLOW_ITEM_TYPE_END, 140 }; 141 enum rte_flow_item_type pattern_eth_vlan_ipv4_tcp[] = { 142 RTE_FLOW_ITEM_TYPE_ETH, 143 RTE_FLOW_ITEM_TYPE_VLAN, 144 RTE_FLOW_ITEM_TYPE_IPV4, 145 RTE_FLOW_ITEM_TYPE_TCP, 146 RTE_FLOW_ITEM_TYPE_END, 147 }; 148 enum rte_flow_item_type pattern_eth_qinq_ipv4_tcp[] = { 149 RTE_FLOW_ITEM_TYPE_ETH, 150 RTE_FLOW_ITEM_TYPE_VLAN, 151 RTE_FLOW_ITEM_TYPE_VLAN, 152 RTE_FLOW_ITEM_TYPE_IPV4, 153 RTE_FLOW_ITEM_TYPE_TCP, 154 RTE_FLOW_ITEM_TYPE_END, 155 }; 156 enum rte_flow_item_type pattern_eth_ipv4_sctp[] = { 157 RTE_FLOW_ITEM_TYPE_ETH, 158 RTE_FLOW_ITEM_TYPE_IPV4, 159 RTE_FLOW_ITEM_TYPE_SCTP, 160 RTE_FLOW_ITEM_TYPE_END, 161 }; 162 enum rte_flow_item_type pattern_eth_vlan_ipv4_sctp[] = { 163 RTE_FLOW_ITEM_TYPE_ETH, 164 RTE_FLOW_ITEM_TYPE_VLAN, 165 RTE_FLOW_ITEM_TYPE_IPV4, 166 RTE_FLOW_ITEM_TYPE_SCTP, 167 RTE_FLOW_ITEM_TYPE_END, 168 }; 169 enum rte_flow_item_type pattern_eth_qinq_ipv4_sctp[] = { 170 RTE_FLOW_ITEM_TYPE_ETH, 171 RTE_FLOW_ITEM_TYPE_VLAN, 172 RTE_FLOW_ITEM_TYPE_VLAN, 173 RTE_FLOW_ITEM_TYPE_IPV4, 174 RTE_FLOW_ITEM_TYPE_SCTP, 175 RTE_FLOW_ITEM_TYPE_END, 176 }; 177 enum rte_flow_item_type pattern_eth_ipv4_icmp[] = { 178 RTE_FLOW_ITEM_TYPE_ETH, 179 RTE_FLOW_ITEM_TYPE_IPV4, 180 RTE_FLOW_ITEM_TYPE_ICMP, 181 RTE_FLOW_ITEM_TYPE_END, 182 }; 183 enum rte_flow_item_type pattern_eth_vlan_ipv4_icmp[] = { 184 RTE_FLOW_ITEM_TYPE_ETH, 185 RTE_FLOW_ITEM_TYPE_VLAN, 186 RTE_FLOW_ITEM_TYPE_IPV4, 187 RTE_FLOW_ITEM_TYPE_ICMP, 188 RTE_FLOW_ITEM_TYPE_END, 189 }; 190 enum rte_flow_item_type pattern_eth_qinq_ipv4_icmp[] = { 191 RTE_FLOW_ITEM_TYPE_ETH, 192 RTE_FLOW_ITEM_TYPE_VLAN, 193 RTE_FLOW_ITEM_TYPE_VLAN, 194 RTE_FLOW_ITEM_TYPE_IPV4, 195 RTE_FLOW_ITEM_TYPE_ICMP, 196 RTE_FLOW_ITEM_TYPE_END, 197 }; 198 199 /* non-tunnel IPv6 */ 200 enum rte_flow_item_type pattern_eth_ipv6[] = { 201 RTE_FLOW_ITEM_TYPE_ETH, 202 RTE_FLOW_ITEM_TYPE_IPV6, 203 RTE_FLOW_ITEM_TYPE_END, 204 }; 205 enum rte_flow_item_type pattern_eth_vlan_ipv6[] = { 206 RTE_FLOW_ITEM_TYPE_ETH, 207 RTE_FLOW_ITEM_TYPE_VLAN, 208 RTE_FLOW_ITEM_TYPE_IPV6, 209 RTE_FLOW_ITEM_TYPE_END, 210 }; 211 enum rte_flow_item_type pattern_eth_qinq_ipv6[] = { 212 RTE_FLOW_ITEM_TYPE_ETH, 213 RTE_FLOW_ITEM_TYPE_VLAN, 214 RTE_FLOW_ITEM_TYPE_VLAN, 215 RTE_FLOW_ITEM_TYPE_IPV6, 216 RTE_FLOW_ITEM_TYPE_END, 217 }; 218 enum rte_flow_item_type pattern_eth_ipv6_frag_ext[] = { 219 RTE_FLOW_ITEM_TYPE_ETH, 220 RTE_FLOW_ITEM_TYPE_IPV6, 221 RTE_FLOW_ITEM_TYPE_IPV6_FRAG_EXT, 222 RTE_FLOW_ITEM_TYPE_END, 223 }; 224 enum rte_flow_item_type pattern_eth_vlan_ipv6_frag_ext[] = { 225 RTE_FLOW_ITEM_TYPE_ETH, 226 RTE_FLOW_ITEM_TYPE_VLAN, 227 RTE_FLOW_ITEM_TYPE_IPV6, 228 RTE_FLOW_ITEM_TYPE_IPV6_FRAG_EXT, 229 RTE_FLOW_ITEM_TYPE_END, 230 }; 231 enum rte_flow_item_type pattern_eth_qinq_ipv6_frag_ext[] = { 232 RTE_FLOW_ITEM_TYPE_ETH, 233 RTE_FLOW_ITEM_TYPE_VLAN, 234 RTE_FLOW_ITEM_TYPE_VLAN, 235 RTE_FLOW_ITEM_TYPE_IPV6, 236 RTE_FLOW_ITEM_TYPE_IPV6_FRAG_EXT, 237 RTE_FLOW_ITEM_TYPE_END, 238 }; 239 enum rte_flow_item_type pattern_eth_ipv6_udp[] = { 240 RTE_FLOW_ITEM_TYPE_ETH, 241 RTE_FLOW_ITEM_TYPE_IPV6, 242 RTE_FLOW_ITEM_TYPE_UDP, 243 RTE_FLOW_ITEM_TYPE_END, 244 }; 245 enum rte_flow_item_type pattern_eth_vlan_ipv6_udp[] = { 246 RTE_FLOW_ITEM_TYPE_ETH, 247 RTE_FLOW_ITEM_TYPE_VLAN, 248 RTE_FLOW_ITEM_TYPE_IPV6, 249 RTE_FLOW_ITEM_TYPE_UDP, 250 RTE_FLOW_ITEM_TYPE_END, 251 }; 252 enum rte_flow_item_type pattern_eth_qinq_ipv6_udp[] = { 253 RTE_FLOW_ITEM_TYPE_ETH, 254 RTE_FLOW_ITEM_TYPE_VLAN, 255 RTE_FLOW_ITEM_TYPE_VLAN, 256 RTE_FLOW_ITEM_TYPE_IPV6, 257 RTE_FLOW_ITEM_TYPE_UDP, 258 RTE_FLOW_ITEM_TYPE_END, 259 }; 260 enum rte_flow_item_type pattern_eth_ipv6_tcp[] = { 261 RTE_FLOW_ITEM_TYPE_ETH, 262 RTE_FLOW_ITEM_TYPE_IPV6, 263 RTE_FLOW_ITEM_TYPE_TCP, 264 RTE_FLOW_ITEM_TYPE_END, 265 }; 266 enum rte_flow_item_type pattern_eth_vlan_ipv6_tcp[] = { 267 RTE_FLOW_ITEM_TYPE_ETH, 268 RTE_FLOW_ITEM_TYPE_VLAN, 269 RTE_FLOW_ITEM_TYPE_IPV6, 270 RTE_FLOW_ITEM_TYPE_TCP, 271 RTE_FLOW_ITEM_TYPE_END, 272 }; 273 enum rte_flow_item_type pattern_eth_qinq_ipv6_tcp[] = { 274 RTE_FLOW_ITEM_TYPE_ETH, 275 RTE_FLOW_ITEM_TYPE_VLAN, 276 RTE_FLOW_ITEM_TYPE_VLAN, 277 RTE_FLOW_ITEM_TYPE_IPV6, 278 RTE_FLOW_ITEM_TYPE_TCP, 279 RTE_FLOW_ITEM_TYPE_END, 280 }; 281 enum rte_flow_item_type pattern_eth_ipv6_sctp[] = { 282 RTE_FLOW_ITEM_TYPE_ETH, 283 RTE_FLOW_ITEM_TYPE_IPV6, 284 RTE_FLOW_ITEM_TYPE_SCTP, 285 RTE_FLOW_ITEM_TYPE_END, 286 }; 287 enum rte_flow_item_type pattern_eth_vlan_ipv6_sctp[] = { 288 RTE_FLOW_ITEM_TYPE_ETH, 289 RTE_FLOW_ITEM_TYPE_VLAN, 290 RTE_FLOW_ITEM_TYPE_IPV6, 291 RTE_FLOW_ITEM_TYPE_SCTP, 292 RTE_FLOW_ITEM_TYPE_END, 293 }; 294 enum rte_flow_item_type pattern_eth_qinq_ipv6_sctp[] = { 295 RTE_FLOW_ITEM_TYPE_ETH, 296 RTE_FLOW_ITEM_TYPE_VLAN, 297 RTE_FLOW_ITEM_TYPE_VLAN, 298 RTE_FLOW_ITEM_TYPE_IPV6, 299 RTE_FLOW_ITEM_TYPE_SCTP, 300 RTE_FLOW_ITEM_TYPE_END, 301 }; 302 enum rte_flow_item_type pattern_eth_ipv6_icmp6[] = { 303 RTE_FLOW_ITEM_TYPE_ETH, 304 RTE_FLOW_ITEM_TYPE_IPV6, 305 RTE_FLOW_ITEM_TYPE_ICMP6, 306 RTE_FLOW_ITEM_TYPE_END, 307 }; 308 enum rte_flow_item_type pattern_eth_vlan_ipv6_icmp6[] = { 309 RTE_FLOW_ITEM_TYPE_ETH, 310 RTE_FLOW_ITEM_TYPE_VLAN, 311 RTE_FLOW_ITEM_TYPE_IPV6, 312 RTE_FLOW_ITEM_TYPE_ICMP6, 313 RTE_FLOW_ITEM_TYPE_END, 314 }; 315 enum rte_flow_item_type pattern_eth_qinq_ipv6_icmp6[] = { 316 RTE_FLOW_ITEM_TYPE_ETH, 317 RTE_FLOW_ITEM_TYPE_VLAN, 318 RTE_FLOW_ITEM_TYPE_VLAN, 319 RTE_FLOW_ITEM_TYPE_IPV6, 320 RTE_FLOW_ITEM_TYPE_ICMP6, 321 RTE_FLOW_ITEM_TYPE_END, 322 }; 323 324 /* IPv4 VXLAN IPv4 */ 325 enum rte_flow_item_type pattern_eth_ipv4_udp_vxlan_ipv4[] = { 326 RTE_FLOW_ITEM_TYPE_ETH, 327 RTE_FLOW_ITEM_TYPE_IPV4, 328 RTE_FLOW_ITEM_TYPE_UDP, 329 RTE_FLOW_ITEM_TYPE_VXLAN, 330 RTE_FLOW_ITEM_TYPE_IPV4, 331 RTE_FLOW_ITEM_TYPE_END, 332 }; 333 enum rte_flow_item_type pattern_eth_ipv4_udp_vxlan_ipv4_udp[] = { 334 RTE_FLOW_ITEM_TYPE_ETH, 335 RTE_FLOW_ITEM_TYPE_IPV4, 336 RTE_FLOW_ITEM_TYPE_UDP, 337 RTE_FLOW_ITEM_TYPE_VXLAN, 338 RTE_FLOW_ITEM_TYPE_IPV4, 339 RTE_FLOW_ITEM_TYPE_UDP, 340 RTE_FLOW_ITEM_TYPE_END, 341 }; 342 enum rte_flow_item_type pattern_eth_ipv4_udp_vxlan_ipv4_tcp[] = { 343 RTE_FLOW_ITEM_TYPE_ETH, 344 RTE_FLOW_ITEM_TYPE_IPV4, 345 RTE_FLOW_ITEM_TYPE_UDP, 346 RTE_FLOW_ITEM_TYPE_VXLAN, 347 RTE_FLOW_ITEM_TYPE_IPV4, 348 RTE_FLOW_ITEM_TYPE_TCP, 349 RTE_FLOW_ITEM_TYPE_END, 350 }; 351 enum rte_flow_item_type pattern_eth_ipv4_udp_vxlan_ipv4_sctp[] = { 352 RTE_FLOW_ITEM_TYPE_ETH, 353 RTE_FLOW_ITEM_TYPE_IPV4, 354 RTE_FLOW_ITEM_TYPE_UDP, 355 RTE_FLOW_ITEM_TYPE_VXLAN, 356 RTE_FLOW_ITEM_TYPE_IPV4, 357 RTE_FLOW_ITEM_TYPE_SCTP, 358 RTE_FLOW_ITEM_TYPE_END, 359 }; 360 enum rte_flow_item_type pattern_eth_ipv4_udp_vxlan_ipv4_icmp[] = { 361 RTE_FLOW_ITEM_TYPE_ETH, 362 RTE_FLOW_ITEM_TYPE_IPV4, 363 RTE_FLOW_ITEM_TYPE_UDP, 364 RTE_FLOW_ITEM_TYPE_VXLAN, 365 RTE_FLOW_ITEM_TYPE_IPV4, 366 RTE_FLOW_ITEM_TYPE_ICMP, 367 RTE_FLOW_ITEM_TYPE_END, 368 }; 369 370 /* IPv4 VXLAN MAC IPv4 */ 371 enum rte_flow_item_type pattern_eth_ipv4_udp_vxlan_eth_ipv4[] = { 372 RTE_FLOW_ITEM_TYPE_ETH, 373 RTE_FLOW_ITEM_TYPE_IPV4, 374 RTE_FLOW_ITEM_TYPE_UDP, 375 RTE_FLOW_ITEM_TYPE_VXLAN, 376 RTE_FLOW_ITEM_TYPE_ETH, 377 RTE_FLOW_ITEM_TYPE_IPV4, 378 RTE_FLOW_ITEM_TYPE_END, 379 }; 380 enum rte_flow_item_type pattern_eth_ipv4_udp_vxlan_eth_ipv4_udp[] = { 381 RTE_FLOW_ITEM_TYPE_ETH, 382 RTE_FLOW_ITEM_TYPE_IPV4, 383 RTE_FLOW_ITEM_TYPE_UDP, 384 RTE_FLOW_ITEM_TYPE_VXLAN, 385 RTE_FLOW_ITEM_TYPE_ETH, 386 RTE_FLOW_ITEM_TYPE_IPV4, 387 RTE_FLOW_ITEM_TYPE_UDP, 388 RTE_FLOW_ITEM_TYPE_END, 389 }; 390 enum rte_flow_item_type pattern_eth_ipv4_udp_vxlan_eth_ipv4_tcp[] = { 391 RTE_FLOW_ITEM_TYPE_ETH, 392 RTE_FLOW_ITEM_TYPE_IPV4, 393 RTE_FLOW_ITEM_TYPE_UDP, 394 RTE_FLOW_ITEM_TYPE_VXLAN, 395 RTE_FLOW_ITEM_TYPE_ETH, 396 RTE_FLOW_ITEM_TYPE_IPV4, 397 RTE_FLOW_ITEM_TYPE_TCP, 398 RTE_FLOW_ITEM_TYPE_END, 399 }; 400 enum rte_flow_item_type pattern_eth_ipv4_udp_vxlan_eth_ipv4_sctp[] = { 401 RTE_FLOW_ITEM_TYPE_ETH, 402 RTE_FLOW_ITEM_TYPE_IPV4, 403 RTE_FLOW_ITEM_TYPE_UDP, 404 RTE_FLOW_ITEM_TYPE_VXLAN, 405 RTE_FLOW_ITEM_TYPE_ETH, 406 RTE_FLOW_ITEM_TYPE_IPV4, 407 RTE_FLOW_ITEM_TYPE_SCTP, 408 RTE_FLOW_ITEM_TYPE_END, 409 }; 410 enum rte_flow_item_type pattern_eth_ipv4_udp_vxlan_eth_ipv4_icmp[] = { 411 RTE_FLOW_ITEM_TYPE_ETH, 412 RTE_FLOW_ITEM_TYPE_IPV4, 413 RTE_FLOW_ITEM_TYPE_UDP, 414 RTE_FLOW_ITEM_TYPE_VXLAN, 415 RTE_FLOW_ITEM_TYPE_ETH, 416 RTE_FLOW_ITEM_TYPE_IPV4, 417 RTE_FLOW_ITEM_TYPE_ICMP, 418 RTE_FLOW_ITEM_TYPE_END, 419 }; 420 421 /* IPv6 VXLAN IPv4 */ 422 enum rte_flow_item_type pattern_eth_ipv6_udp_vxlan_ipv4[] = { 423 RTE_FLOW_ITEM_TYPE_ETH, 424 RTE_FLOW_ITEM_TYPE_IPV6, 425 RTE_FLOW_ITEM_TYPE_UDP, 426 RTE_FLOW_ITEM_TYPE_VXLAN, 427 RTE_FLOW_ITEM_TYPE_IPV4, 428 RTE_FLOW_ITEM_TYPE_END, 429 }; 430 enum rte_flow_item_type pattern_eth_ipv6_udp_vxlan_ipv4_tcp[] = { 431 RTE_FLOW_ITEM_TYPE_ETH, 432 RTE_FLOW_ITEM_TYPE_IPV6, 433 RTE_FLOW_ITEM_TYPE_UDP, 434 RTE_FLOW_ITEM_TYPE_VXLAN, 435 RTE_FLOW_ITEM_TYPE_IPV4, 436 RTE_FLOW_ITEM_TYPE_TCP, 437 RTE_FLOW_ITEM_TYPE_END, 438 }; 439 enum rte_flow_item_type pattern_eth_ipv6_udp_vxlan_ipv4_udp[] = { 440 RTE_FLOW_ITEM_TYPE_ETH, 441 RTE_FLOW_ITEM_TYPE_IPV6, 442 RTE_FLOW_ITEM_TYPE_UDP, 443 RTE_FLOW_ITEM_TYPE_VXLAN, 444 RTE_FLOW_ITEM_TYPE_IPV4, 445 RTE_FLOW_ITEM_TYPE_UDP, 446 RTE_FLOW_ITEM_TYPE_END, 447 }; 448 enum rte_flow_item_type pattern_eth_ipv6_udp_vxlan_ipv4_sctp[] = { 449 RTE_FLOW_ITEM_TYPE_ETH, 450 RTE_FLOW_ITEM_TYPE_IPV6, 451 RTE_FLOW_ITEM_TYPE_UDP, 452 RTE_FLOW_ITEM_TYPE_VXLAN, 453 RTE_FLOW_ITEM_TYPE_IPV4, 454 RTE_FLOW_ITEM_TYPE_SCTP, 455 RTE_FLOW_ITEM_TYPE_END, 456 }; 457 enum rte_flow_item_type pattern_eth_ipv6_udp_vxlan_ipv4_icmp[] = { 458 RTE_FLOW_ITEM_TYPE_ETH, 459 RTE_FLOW_ITEM_TYPE_IPV6, 460 RTE_FLOW_ITEM_TYPE_UDP, 461 RTE_FLOW_ITEM_TYPE_VXLAN, 462 RTE_FLOW_ITEM_TYPE_IPV4, 463 RTE_FLOW_ITEM_TYPE_ICMP, 464 RTE_FLOW_ITEM_TYPE_END, 465 }; 466 467 /* IPv6 VXLAN MAC IPv4 */ 468 enum rte_flow_item_type pattern_eth_ipv6_udp_vxlan_eth_ipv4[] = { 469 RTE_FLOW_ITEM_TYPE_ETH, 470 RTE_FLOW_ITEM_TYPE_IPV6, 471 RTE_FLOW_ITEM_TYPE_UDP, 472 RTE_FLOW_ITEM_TYPE_VXLAN, 473 RTE_FLOW_ITEM_TYPE_ETH, 474 RTE_FLOW_ITEM_TYPE_IPV4, 475 RTE_FLOW_ITEM_TYPE_END, 476 }; 477 enum rte_flow_item_type pattern_eth_ipv6_udp_vxlan_eth_ipv4_tcp[] = { 478 RTE_FLOW_ITEM_TYPE_ETH, 479 RTE_FLOW_ITEM_TYPE_IPV6, 480 RTE_FLOW_ITEM_TYPE_UDP, 481 RTE_FLOW_ITEM_TYPE_VXLAN, 482 RTE_FLOW_ITEM_TYPE_ETH, 483 RTE_FLOW_ITEM_TYPE_IPV4, 484 RTE_FLOW_ITEM_TYPE_TCP, 485 RTE_FLOW_ITEM_TYPE_END, 486 }; 487 enum rte_flow_item_type pattern_eth_ipv6_udp_vxlan_eth_ipv4_udp[] = { 488 RTE_FLOW_ITEM_TYPE_ETH, 489 RTE_FLOW_ITEM_TYPE_IPV6, 490 RTE_FLOW_ITEM_TYPE_UDP, 491 RTE_FLOW_ITEM_TYPE_VXLAN, 492 RTE_FLOW_ITEM_TYPE_ETH, 493 RTE_FLOW_ITEM_TYPE_IPV4, 494 RTE_FLOW_ITEM_TYPE_UDP, 495 RTE_FLOW_ITEM_TYPE_END, 496 }; 497 enum rte_flow_item_type pattern_eth_ipv6_udp_vxlan_eth_ipv4_sctp[] = { 498 RTE_FLOW_ITEM_TYPE_ETH, 499 RTE_FLOW_ITEM_TYPE_IPV6, 500 RTE_FLOW_ITEM_TYPE_UDP, 501 RTE_FLOW_ITEM_TYPE_VXLAN, 502 RTE_FLOW_ITEM_TYPE_ETH, 503 RTE_FLOW_ITEM_TYPE_IPV4, 504 RTE_FLOW_ITEM_TYPE_SCTP, 505 RTE_FLOW_ITEM_TYPE_END, 506 }; 507 enum rte_flow_item_type pattern_eth_ipv6_udp_vxlan_eth_ipv4_icmp[] = { 508 RTE_FLOW_ITEM_TYPE_ETH, 509 RTE_FLOW_ITEM_TYPE_IPV6, 510 RTE_FLOW_ITEM_TYPE_UDP, 511 RTE_FLOW_ITEM_TYPE_VXLAN, 512 RTE_FLOW_ITEM_TYPE_ETH, 513 RTE_FLOW_ITEM_TYPE_IPV4, 514 RTE_FLOW_ITEM_TYPE_ICMP, 515 RTE_FLOW_ITEM_TYPE_END, 516 }; 517 518 /* IPv4 VXLAN IPv6 */ 519 enum rte_flow_item_type pattern_eth_ipv4_udp_vxlan_ipv6[] = { 520 RTE_FLOW_ITEM_TYPE_ETH, 521 RTE_FLOW_ITEM_TYPE_IPV4, 522 RTE_FLOW_ITEM_TYPE_UDP, 523 RTE_FLOW_ITEM_TYPE_VXLAN, 524 RTE_FLOW_ITEM_TYPE_IPV6, 525 RTE_FLOW_ITEM_TYPE_END, 526 }; 527 enum rte_flow_item_type pattern_eth_ipv4_udp_vxlan_ipv6_udp[] = { 528 RTE_FLOW_ITEM_TYPE_ETH, 529 RTE_FLOW_ITEM_TYPE_IPV4, 530 RTE_FLOW_ITEM_TYPE_UDP, 531 RTE_FLOW_ITEM_TYPE_VXLAN, 532 RTE_FLOW_ITEM_TYPE_IPV6, 533 RTE_FLOW_ITEM_TYPE_UDP, 534 RTE_FLOW_ITEM_TYPE_END, 535 }; 536 enum rte_flow_item_type pattern_eth_ipv4_udp_vxlan_ipv6_tcp[] = { 537 RTE_FLOW_ITEM_TYPE_ETH, 538 RTE_FLOW_ITEM_TYPE_IPV4, 539 RTE_FLOW_ITEM_TYPE_UDP, 540 RTE_FLOW_ITEM_TYPE_VXLAN, 541 RTE_FLOW_ITEM_TYPE_IPV6, 542 RTE_FLOW_ITEM_TYPE_TCP, 543 RTE_FLOW_ITEM_TYPE_END, 544 }; 545 enum rte_flow_item_type pattern_eth_ipv4_udp_vxlan_ipv6_sctp[] = { 546 RTE_FLOW_ITEM_TYPE_ETH, 547 RTE_FLOW_ITEM_TYPE_IPV4, 548 RTE_FLOW_ITEM_TYPE_UDP, 549 RTE_FLOW_ITEM_TYPE_VXLAN, 550 RTE_FLOW_ITEM_TYPE_IPV6, 551 RTE_FLOW_ITEM_TYPE_SCTP, 552 RTE_FLOW_ITEM_TYPE_END, 553 }; 554 enum rte_flow_item_type pattern_eth_ipv4_udp_vxlan_ipv6_icmp6[] = { 555 RTE_FLOW_ITEM_TYPE_ETH, 556 RTE_FLOW_ITEM_TYPE_IPV4, 557 RTE_FLOW_ITEM_TYPE_UDP, 558 RTE_FLOW_ITEM_TYPE_VXLAN, 559 RTE_FLOW_ITEM_TYPE_IPV6, 560 RTE_FLOW_ITEM_TYPE_ICMP6, 561 RTE_FLOW_ITEM_TYPE_END, 562 }; 563 564 /* IPv4 VXLAN MAC IPv6 */ 565 enum rte_flow_item_type pattern_eth_ipv4_udp_vxlan_eth_ipv6[] = { 566 RTE_FLOW_ITEM_TYPE_ETH, 567 RTE_FLOW_ITEM_TYPE_IPV4, 568 RTE_FLOW_ITEM_TYPE_UDP, 569 RTE_FLOW_ITEM_TYPE_VXLAN, 570 RTE_FLOW_ITEM_TYPE_ETH, 571 RTE_FLOW_ITEM_TYPE_IPV6, 572 RTE_FLOW_ITEM_TYPE_END, 573 }; 574 enum rte_flow_item_type pattern_eth_ipv4_udp_vxlan_eth_ipv6_udp[] = { 575 RTE_FLOW_ITEM_TYPE_ETH, 576 RTE_FLOW_ITEM_TYPE_IPV4, 577 RTE_FLOW_ITEM_TYPE_UDP, 578 RTE_FLOW_ITEM_TYPE_VXLAN, 579 RTE_FLOW_ITEM_TYPE_ETH, 580 RTE_FLOW_ITEM_TYPE_IPV6, 581 RTE_FLOW_ITEM_TYPE_UDP, 582 RTE_FLOW_ITEM_TYPE_END, 583 }; 584 enum rte_flow_item_type pattern_eth_ipv4_udp_vxlan_eth_ipv6_tcp[] = { 585 RTE_FLOW_ITEM_TYPE_ETH, 586 RTE_FLOW_ITEM_TYPE_IPV4, 587 RTE_FLOW_ITEM_TYPE_UDP, 588 RTE_FLOW_ITEM_TYPE_VXLAN, 589 RTE_FLOW_ITEM_TYPE_ETH, 590 RTE_FLOW_ITEM_TYPE_IPV6, 591 RTE_FLOW_ITEM_TYPE_TCP, 592 RTE_FLOW_ITEM_TYPE_END, 593 }; 594 enum rte_flow_item_type pattern_eth_ipv4_udp_vxlan_eth_ipv6_sctp[] = { 595 RTE_FLOW_ITEM_TYPE_ETH, 596 RTE_FLOW_ITEM_TYPE_IPV4, 597 RTE_FLOW_ITEM_TYPE_UDP, 598 RTE_FLOW_ITEM_TYPE_VXLAN, 599 RTE_FLOW_ITEM_TYPE_ETH, 600 RTE_FLOW_ITEM_TYPE_IPV6, 601 RTE_FLOW_ITEM_TYPE_SCTP, 602 RTE_FLOW_ITEM_TYPE_END, 603 }; 604 enum rte_flow_item_type pattern_eth_ipv4_udp_vxlan_eth_ipv6_icmp6[] = { 605 RTE_FLOW_ITEM_TYPE_ETH, 606 RTE_FLOW_ITEM_TYPE_IPV4, 607 RTE_FLOW_ITEM_TYPE_UDP, 608 RTE_FLOW_ITEM_TYPE_VXLAN, 609 RTE_FLOW_ITEM_TYPE_ETH, 610 RTE_FLOW_ITEM_TYPE_IPV6, 611 RTE_FLOW_ITEM_TYPE_ICMP6, 612 RTE_FLOW_ITEM_TYPE_END, 613 }; 614 615 /* IPv6 VXLAN IPv6 */ 616 enum rte_flow_item_type pattern_eth_ipv6_udp_vxlan_ipv6[] = { 617 RTE_FLOW_ITEM_TYPE_ETH, 618 RTE_FLOW_ITEM_TYPE_IPV6, 619 RTE_FLOW_ITEM_TYPE_UDP, 620 RTE_FLOW_ITEM_TYPE_VXLAN, 621 RTE_FLOW_ITEM_TYPE_IPV6, 622 RTE_FLOW_ITEM_TYPE_END, 623 }; 624 enum rte_flow_item_type pattern_eth_ipv6_udp_vxlan_ipv6_tcp[] = { 625 RTE_FLOW_ITEM_TYPE_ETH, 626 RTE_FLOW_ITEM_TYPE_IPV6, 627 RTE_FLOW_ITEM_TYPE_UDP, 628 RTE_FLOW_ITEM_TYPE_VXLAN, 629 RTE_FLOW_ITEM_TYPE_IPV6, 630 RTE_FLOW_ITEM_TYPE_TCP, 631 RTE_FLOW_ITEM_TYPE_END, 632 }; 633 enum rte_flow_item_type pattern_eth_ipv6_udp_vxlan_ipv6_udp[] = { 634 RTE_FLOW_ITEM_TYPE_ETH, 635 RTE_FLOW_ITEM_TYPE_IPV6, 636 RTE_FLOW_ITEM_TYPE_UDP, 637 RTE_FLOW_ITEM_TYPE_VXLAN, 638 RTE_FLOW_ITEM_TYPE_IPV6, 639 RTE_FLOW_ITEM_TYPE_UDP, 640 RTE_FLOW_ITEM_TYPE_END, 641 }; 642 enum rte_flow_item_type pattern_eth_ipv6_udp_vxlan_ipv6_sctp[] = { 643 RTE_FLOW_ITEM_TYPE_ETH, 644 RTE_FLOW_ITEM_TYPE_IPV6, 645 RTE_FLOW_ITEM_TYPE_UDP, 646 RTE_FLOW_ITEM_TYPE_VXLAN, 647 RTE_FLOW_ITEM_TYPE_IPV6, 648 RTE_FLOW_ITEM_TYPE_SCTP, 649 RTE_FLOW_ITEM_TYPE_END, 650 }; 651 enum rte_flow_item_type pattern_eth_ipv6_udp_vxlan_ipv6_icmp6[] = { 652 RTE_FLOW_ITEM_TYPE_ETH, 653 RTE_FLOW_ITEM_TYPE_IPV6, 654 RTE_FLOW_ITEM_TYPE_UDP, 655 RTE_FLOW_ITEM_TYPE_VXLAN, 656 RTE_FLOW_ITEM_TYPE_IPV6, 657 RTE_FLOW_ITEM_TYPE_ICMP6, 658 RTE_FLOW_ITEM_TYPE_END, 659 }; 660 661 /* IPv6 VXLAN MAC IPv6 */ 662 enum rte_flow_item_type pattern_eth_ipv6_udp_vxlan_eth_ipv6[] = { 663 RTE_FLOW_ITEM_TYPE_ETH, 664 RTE_FLOW_ITEM_TYPE_IPV6, 665 RTE_FLOW_ITEM_TYPE_UDP, 666 RTE_FLOW_ITEM_TYPE_VXLAN, 667 RTE_FLOW_ITEM_TYPE_ETH, 668 RTE_FLOW_ITEM_TYPE_IPV6, 669 RTE_FLOW_ITEM_TYPE_END, 670 }; 671 enum rte_flow_item_type pattern_eth_ipv6_udp_vxlan_eth_ipv6_tcp[] = { 672 RTE_FLOW_ITEM_TYPE_ETH, 673 RTE_FLOW_ITEM_TYPE_IPV6, 674 RTE_FLOW_ITEM_TYPE_UDP, 675 RTE_FLOW_ITEM_TYPE_VXLAN, 676 RTE_FLOW_ITEM_TYPE_ETH, 677 RTE_FLOW_ITEM_TYPE_IPV6, 678 RTE_FLOW_ITEM_TYPE_TCP, 679 RTE_FLOW_ITEM_TYPE_END, 680 }; 681 enum rte_flow_item_type pattern_eth_ipv6_udp_vxlan_eth_ipv6_udp[] = { 682 RTE_FLOW_ITEM_TYPE_ETH, 683 RTE_FLOW_ITEM_TYPE_IPV6, 684 RTE_FLOW_ITEM_TYPE_UDP, 685 RTE_FLOW_ITEM_TYPE_VXLAN, 686 RTE_FLOW_ITEM_TYPE_ETH, 687 RTE_FLOW_ITEM_TYPE_IPV6, 688 RTE_FLOW_ITEM_TYPE_UDP, 689 RTE_FLOW_ITEM_TYPE_END, 690 }; 691 enum rte_flow_item_type pattern_eth_ipv6_udp_vxlan_eth_ipv6_sctp[] = { 692 RTE_FLOW_ITEM_TYPE_ETH, 693 RTE_FLOW_ITEM_TYPE_IPV6, 694 RTE_FLOW_ITEM_TYPE_UDP, 695 RTE_FLOW_ITEM_TYPE_VXLAN, 696 RTE_FLOW_ITEM_TYPE_ETH, 697 RTE_FLOW_ITEM_TYPE_IPV6, 698 RTE_FLOW_ITEM_TYPE_SCTP, 699 RTE_FLOW_ITEM_TYPE_END, 700 }; 701 enum rte_flow_item_type pattern_eth_ipv6_udp_vxlan_eth_ipv6_icmp6[] = { 702 RTE_FLOW_ITEM_TYPE_ETH, 703 RTE_FLOW_ITEM_TYPE_IPV6, 704 RTE_FLOW_ITEM_TYPE_UDP, 705 RTE_FLOW_ITEM_TYPE_VXLAN, 706 RTE_FLOW_ITEM_TYPE_ETH, 707 RTE_FLOW_ITEM_TYPE_IPV6, 708 RTE_FLOW_ITEM_TYPE_ICMP6, 709 RTE_FLOW_ITEM_TYPE_END, 710 }; 711 712 /* IPv4 NVGRE IPv4 */ 713 enum rte_flow_item_type pattern_eth_ipv4_nvgre_ipv4[] = { 714 RTE_FLOW_ITEM_TYPE_ETH, 715 RTE_FLOW_ITEM_TYPE_IPV4, 716 RTE_FLOW_ITEM_TYPE_NVGRE, 717 RTE_FLOW_ITEM_TYPE_IPV4, 718 RTE_FLOW_ITEM_TYPE_END, 719 }; 720 enum rte_flow_item_type pattern_eth_ipv4_nvgre_ipv4_udp[] = { 721 RTE_FLOW_ITEM_TYPE_ETH, 722 RTE_FLOW_ITEM_TYPE_IPV4, 723 RTE_FLOW_ITEM_TYPE_NVGRE, 724 RTE_FLOW_ITEM_TYPE_IPV4, 725 RTE_FLOW_ITEM_TYPE_UDP, 726 RTE_FLOW_ITEM_TYPE_END, 727 }; 728 enum rte_flow_item_type pattern_eth_ipv4_nvgre_ipv4_tcp[] = { 729 RTE_FLOW_ITEM_TYPE_ETH, 730 RTE_FLOW_ITEM_TYPE_IPV4, 731 RTE_FLOW_ITEM_TYPE_NVGRE, 732 RTE_FLOW_ITEM_TYPE_IPV4, 733 RTE_FLOW_ITEM_TYPE_TCP, 734 RTE_FLOW_ITEM_TYPE_END, 735 }; 736 enum rte_flow_item_type pattern_eth_ipv4_nvgre_ipv4_sctp[] = { 737 RTE_FLOW_ITEM_TYPE_ETH, 738 RTE_FLOW_ITEM_TYPE_IPV4, 739 RTE_FLOW_ITEM_TYPE_NVGRE, 740 RTE_FLOW_ITEM_TYPE_IPV4, 741 RTE_FLOW_ITEM_TYPE_SCTP, 742 RTE_FLOW_ITEM_TYPE_END, 743 }; 744 enum rte_flow_item_type pattern_eth_ipv4_nvgre_ipv4_icmp[] = { 745 RTE_FLOW_ITEM_TYPE_ETH, 746 RTE_FLOW_ITEM_TYPE_IPV4, 747 RTE_FLOW_ITEM_TYPE_NVGRE, 748 RTE_FLOW_ITEM_TYPE_IPV4, 749 RTE_FLOW_ITEM_TYPE_ICMP, 750 RTE_FLOW_ITEM_TYPE_END, 751 }; 752 753 /* IPv4 NVGRE MAC IPv4 */ 754 enum rte_flow_item_type pattern_eth_ipv4_nvgre_eth_ipv4[] = { 755 RTE_FLOW_ITEM_TYPE_ETH, 756 RTE_FLOW_ITEM_TYPE_IPV4, 757 RTE_FLOW_ITEM_TYPE_NVGRE, 758 RTE_FLOW_ITEM_TYPE_ETH, 759 RTE_FLOW_ITEM_TYPE_IPV4, 760 RTE_FLOW_ITEM_TYPE_END, 761 }; 762 enum rte_flow_item_type pattern_eth_ipv4_nvgre_eth_ipv4_udp[] = { 763 RTE_FLOW_ITEM_TYPE_ETH, 764 RTE_FLOW_ITEM_TYPE_IPV4, 765 RTE_FLOW_ITEM_TYPE_NVGRE, 766 RTE_FLOW_ITEM_TYPE_ETH, 767 RTE_FLOW_ITEM_TYPE_IPV4, 768 RTE_FLOW_ITEM_TYPE_UDP, 769 RTE_FLOW_ITEM_TYPE_END, 770 }; 771 enum rte_flow_item_type pattern_eth_ipv4_nvgre_eth_ipv4_tcp[] = { 772 RTE_FLOW_ITEM_TYPE_ETH, 773 RTE_FLOW_ITEM_TYPE_IPV4, 774 RTE_FLOW_ITEM_TYPE_NVGRE, 775 RTE_FLOW_ITEM_TYPE_ETH, 776 RTE_FLOW_ITEM_TYPE_IPV4, 777 RTE_FLOW_ITEM_TYPE_TCP, 778 RTE_FLOW_ITEM_TYPE_END, 779 }; 780 enum rte_flow_item_type pattern_eth_ipv4_nvgre_eth_ipv4_sctp[] = { 781 RTE_FLOW_ITEM_TYPE_ETH, 782 RTE_FLOW_ITEM_TYPE_IPV4, 783 RTE_FLOW_ITEM_TYPE_NVGRE, 784 RTE_FLOW_ITEM_TYPE_ETH, 785 RTE_FLOW_ITEM_TYPE_IPV4, 786 RTE_FLOW_ITEM_TYPE_SCTP, 787 RTE_FLOW_ITEM_TYPE_END, 788 }; 789 enum rte_flow_item_type pattern_eth_ipv4_nvgre_eth_ipv4_icmp[] = { 790 RTE_FLOW_ITEM_TYPE_ETH, 791 RTE_FLOW_ITEM_TYPE_IPV4, 792 RTE_FLOW_ITEM_TYPE_NVGRE, 793 RTE_FLOW_ITEM_TYPE_ETH, 794 RTE_FLOW_ITEM_TYPE_IPV4, 795 RTE_FLOW_ITEM_TYPE_ICMP, 796 RTE_FLOW_ITEM_TYPE_END, 797 }; 798 799 /* IPv6 NVGRE IPv4 */ 800 enum rte_flow_item_type pattern_eth_ipv6_nvgre_ipv4[] = { 801 RTE_FLOW_ITEM_TYPE_ETH, 802 RTE_FLOW_ITEM_TYPE_IPV6, 803 RTE_FLOW_ITEM_TYPE_NVGRE, 804 RTE_FLOW_ITEM_TYPE_IPV4, 805 RTE_FLOW_ITEM_TYPE_END, 806 }; 807 enum rte_flow_item_type pattern_eth_ipv6_nvgre_ipv4_tcp[] = { 808 RTE_FLOW_ITEM_TYPE_ETH, 809 RTE_FLOW_ITEM_TYPE_IPV6, 810 RTE_FLOW_ITEM_TYPE_NVGRE, 811 RTE_FLOW_ITEM_TYPE_IPV4, 812 RTE_FLOW_ITEM_TYPE_TCP, 813 RTE_FLOW_ITEM_TYPE_END, 814 }; 815 enum rte_flow_item_type pattern_eth_ipv6_nvgre_ipv4_udp[] = { 816 RTE_FLOW_ITEM_TYPE_ETH, 817 RTE_FLOW_ITEM_TYPE_IPV6, 818 RTE_FLOW_ITEM_TYPE_NVGRE, 819 RTE_FLOW_ITEM_TYPE_IPV4, 820 RTE_FLOW_ITEM_TYPE_UDP, 821 RTE_FLOW_ITEM_TYPE_END, 822 }; 823 enum rte_flow_item_type pattern_eth_ipv6_nvgre_ipv4_sctp[] = { 824 RTE_FLOW_ITEM_TYPE_ETH, 825 RTE_FLOW_ITEM_TYPE_IPV6, 826 RTE_FLOW_ITEM_TYPE_NVGRE, 827 RTE_FLOW_ITEM_TYPE_IPV4, 828 RTE_FLOW_ITEM_TYPE_SCTP, 829 RTE_FLOW_ITEM_TYPE_END, 830 }; 831 enum rte_flow_item_type pattern_eth_ipv6_nvgre_ipv4_icmp[] = { 832 RTE_FLOW_ITEM_TYPE_ETH, 833 RTE_FLOW_ITEM_TYPE_IPV6, 834 RTE_FLOW_ITEM_TYPE_NVGRE, 835 RTE_FLOW_ITEM_TYPE_IPV4, 836 RTE_FLOW_ITEM_TYPE_ICMP, 837 RTE_FLOW_ITEM_TYPE_END, 838 }; 839 840 /* IPv6 NVGRE MAC IPv4 */ 841 enum rte_flow_item_type pattern_eth_ipv6_nvgre_eth_ipv4[] = { 842 RTE_FLOW_ITEM_TYPE_ETH, 843 RTE_FLOW_ITEM_TYPE_IPV6, 844 RTE_FLOW_ITEM_TYPE_NVGRE, 845 RTE_FLOW_ITEM_TYPE_ETH, 846 RTE_FLOW_ITEM_TYPE_IPV4, 847 RTE_FLOW_ITEM_TYPE_END, 848 }; 849 enum rte_flow_item_type pattern_eth_ipv6_nvgre_eth_ipv4_tcp[] = { 850 RTE_FLOW_ITEM_TYPE_ETH, 851 RTE_FLOW_ITEM_TYPE_IPV6, 852 RTE_FLOW_ITEM_TYPE_NVGRE, 853 RTE_FLOW_ITEM_TYPE_ETH, 854 RTE_FLOW_ITEM_TYPE_IPV4, 855 RTE_FLOW_ITEM_TYPE_TCP, 856 RTE_FLOW_ITEM_TYPE_END, 857 }; 858 enum rte_flow_item_type pattern_eth_ipv6_nvgre_eth_ipv4_udp[] = { 859 RTE_FLOW_ITEM_TYPE_ETH, 860 RTE_FLOW_ITEM_TYPE_IPV6, 861 RTE_FLOW_ITEM_TYPE_NVGRE, 862 RTE_FLOW_ITEM_TYPE_ETH, 863 RTE_FLOW_ITEM_TYPE_IPV4, 864 RTE_FLOW_ITEM_TYPE_UDP, 865 RTE_FLOW_ITEM_TYPE_END, 866 }; 867 enum rte_flow_item_type pattern_eth_ipv6_nvgre_eth_ipv4_sctp[] = { 868 RTE_FLOW_ITEM_TYPE_ETH, 869 RTE_FLOW_ITEM_TYPE_IPV6, 870 RTE_FLOW_ITEM_TYPE_NVGRE, 871 RTE_FLOW_ITEM_TYPE_ETH, 872 RTE_FLOW_ITEM_TYPE_IPV4, 873 RTE_FLOW_ITEM_TYPE_SCTP, 874 RTE_FLOW_ITEM_TYPE_END, 875 }; 876 enum rte_flow_item_type pattern_eth_ipv6_nvgre_eth_ipv4_icmp[] = { 877 RTE_FLOW_ITEM_TYPE_ETH, 878 RTE_FLOW_ITEM_TYPE_IPV6, 879 RTE_FLOW_ITEM_TYPE_NVGRE, 880 RTE_FLOW_ITEM_TYPE_ETH, 881 RTE_FLOW_ITEM_TYPE_IPV4, 882 RTE_FLOW_ITEM_TYPE_ICMP, 883 RTE_FLOW_ITEM_TYPE_END, 884 }; 885 886 /* IPv4 NVGRE IPv6 */ 887 enum rte_flow_item_type pattern_eth_ipv4_nvgre_ipv6[] = { 888 RTE_FLOW_ITEM_TYPE_ETH, 889 RTE_FLOW_ITEM_TYPE_IPV4, 890 RTE_FLOW_ITEM_TYPE_NVGRE, 891 RTE_FLOW_ITEM_TYPE_IPV6, 892 RTE_FLOW_ITEM_TYPE_END, 893 }; 894 enum rte_flow_item_type pattern_eth_ipv4_nvgre_ipv6_udp[] = { 895 RTE_FLOW_ITEM_TYPE_ETH, 896 RTE_FLOW_ITEM_TYPE_IPV4, 897 RTE_FLOW_ITEM_TYPE_NVGRE, 898 RTE_FLOW_ITEM_TYPE_IPV6, 899 RTE_FLOW_ITEM_TYPE_UDP, 900 RTE_FLOW_ITEM_TYPE_END, 901 }; 902 enum rte_flow_item_type pattern_eth_ipv4_nvgre_ipv6_tcp[] = { 903 RTE_FLOW_ITEM_TYPE_ETH, 904 RTE_FLOW_ITEM_TYPE_IPV4, 905 RTE_FLOW_ITEM_TYPE_NVGRE, 906 RTE_FLOW_ITEM_TYPE_IPV6, 907 RTE_FLOW_ITEM_TYPE_TCP, 908 RTE_FLOW_ITEM_TYPE_END, 909 }; 910 enum rte_flow_item_type pattern_eth_ipv4_nvgre_ipv6_sctp[] = { 911 RTE_FLOW_ITEM_TYPE_ETH, 912 RTE_FLOW_ITEM_TYPE_IPV4, 913 RTE_FLOW_ITEM_TYPE_NVGRE, 914 RTE_FLOW_ITEM_TYPE_IPV6, 915 RTE_FLOW_ITEM_TYPE_SCTP, 916 RTE_FLOW_ITEM_TYPE_END, 917 }; 918 enum rte_flow_item_type pattern_eth_ipv4_nvgre_ipv6_icmp6[] = { 919 RTE_FLOW_ITEM_TYPE_ETH, 920 RTE_FLOW_ITEM_TYPE_IPV4, 921 RTE_FLOW_ITEM_TYPE_NVGRE, 922 RTE_FLOW_ITEM_TYPE_IPV6, 923 RTE_FLOW_ITEM_TYPE_ICMP6, 924 RTE_FLOW_ITEM_TYPE_END, 925 }; 926 927 /* IPv4 NVGRE MAC IPv6 */ 928 enum rte_flow_item_type pattern_eth_ipv4_nvgre_eth_ipv6[] = { 929 RTE_FLOW_ITEM_TYPE_ETH, 930 RTE_FLOW_ITEM_TYPE_IPV4, 931 RTE_FLOW_ITEM_TYPE_NVGRE, 932 RTE_FLOW_ITEM_TYPE_ETH, 933 RTE_FLOW_ITEM_TYPE_IPV6, 934 RTE_FLOW_ITEM_TYPE_END, 935 }; 936 enum rte_flow_item_type pattern_eth_ipv4_nvgre_eth_ipv6_udp[] = { 937 RTE_FLOW_ITEM_TYPE_ETH, 938 RTE_FLOW_ITEM_TYPE_IPV4, 939 RTE_FLOW_ITEM_TYPE_NVGRE, 940 RTE_FLOW_ITEM_TYPE_ETH, 941 RTE_FLOW_ITEM_TYPE_IPV6, 942 RTE_FLOW_ITEM_TYPE_UDP, 943 RTE_FLOW_ITEM_TYPE_END, 944 }; 945 enum rte_flow_item_type pattern_eth_ipv4_nvgre_eth_ipv6_tcp[] = { 946 RTE_FLOW_ITEM_TYPE_ETH, 947 RTE_FLOW_ITEM_TYPE_IPV4, 948 RTE_FLOW_ITEM_TYPE_NVGRE, 949 RTE_FLOW_ITEM_TYPE_ETH, 950 RTE_FLOW_ITEM_TYPE_IPV6, 951 RTE_FLOW_ITEM_TYPE_TCP, 952 RTE_FLOW_ITEM_TYPE_END, 953 }; 954 enum rte_flow_item_type pattern_eth_ipv4_nvgre_eth_ipv6_sctp[] = { 955 RTE_FLOW_ITEM_TYPE_ETH, 956 RTE_FLOW_ITEM_TYPE_IPV4, 957 RTE_FLOW_ITEM_TYPE_NVGRE, 958 RTE_FLOW_ITEM_TYPE_ETH, 959 RTE_FLOW_ITEM_TYPE_IPV6, 960 RTE_FLOW_ITEM_TYPE_SCTP, 961 RTE_FLOW_ITEM_TYPE_END, 962 }; 963 enum rte_flow_item_type pattern_eth_ipv4_nvgre_eth_ipv6_icmp6[] = { 964 RTE_FLOW_ITEM_TYPE_ETH, 965 RTE_FLOW_ITEM_TYPE_IPV4, 966 RTE_FLOW_ITEM_TYPE_NVGRE, 967 RTE_FLOW_ITEM_TYPE_ETH, 968 RTE_FLOW_ITEM_TYPE_IPV6, 969 RTE_FLOW_ITEM_TYPE_ICMP6, 970 RTE_FLOW_ITEM_TYPE_END, 971 }; 972 973 /* IPv6 NVGRE IPv6 */ 974 enum rte_flow_item_type pattern_eth_ipv6_nvgre_ipv6[] = { 975 RTE_FLOW_ITEM_TYPE_ETH, 976 RTE_FLOW_ITEM_TYPE_IPV6, 977 RTE_FLOW_ITEM_TYPE_NVGRE, 978 RTE_FLOW_ITEM_TYPE_IPV6, 979 RTE_FLOW_ITEM_TYPE_END, 980 }; 981 enum rte_flow_item_type pattern_eth_ipv6_nvgre_ipv6_tcp[] = { 982 RTE_FLOW_ITEM_TYPE_ETH, 983 RTE_FLOW_ITEM_TYPE_IPV6, 984 RTE_FLOW_ITEM_TYPE_NVGRE, 985 RTE_FLOW_ITEM_TYPE_IPV6, 986 RTE_FLOW_ITEM_TYPE_TCP, 987 RTE_FLOW_ITEM_TYPE_END, 988 }; 989 enum rte_flow_item_type pattern_eth_ipv6_nvgre_ipv6_udp[] = { 990 RTE_FLOW_ITEM_TYPE_ETH, 991 RTE_FLOW_ITEM_TYPE_IPV6, 992 RTE_FLOW_ITEM_TYPE_NVGRE, 993 RTE_FLOW_ITEM_TYPE_IPV6, 994 RTE_FLOW_ITEM_TYPE_UDP, 995 RTE_FLOW_ITEM_TYPE_END, 996 }; 997 enum rte_flow_item_type pattern_eth_ipv6_nvgre_ipv6_sctp[] = { 998 RTE_FLOW_ITEM_TYPE_ETH, 999 RTE_FLOW_ITEM_TYPE_IPV6, 1000 RTE_FLOW_ITEM_TYPE_NVGRE, 1001 RTE_FLOW_ITEM_TYPE_IPV6, 1002 RTE_FLOW_ITEM_TYPE_SCTP, 1003 RTE_FLOW_ITEM_TYPE_END, 1004 }; 1005 enum rte_flow_item_type pattern_eth_ipv6_nvgre_ipv6_icmp6[] = { 1006 RTE_FLOW_ITEM_TYPE_ETH, 1007 RTE_FLOW_ITEM_TYPE_IPV6, 1008 RTE_FLOW_ITEM_TYPE_NVGRE, 1009 RTE_FLOW_ITEM_TYPE_IPV6, 1010 RTE_FLOW_ITEM_TYPE_ICMP6, 1011 RTE_FLOW_ITEM_TYPE_END, 1012 }; 1013 1014 /* IPv6 NVGRE MAC IPv6 */ 1015 enum rte_flow_item_type pattern_eth_ipv6_nvgre_eth_ipv6[] = { 1016 RTE_FLOW_ITEM_TYPE_ETH, 1017 RTE_FLOW_ITEM_TYPE_IPV6, 1018 RTE_FLOW_ITEM_TYPE_NVGRE, 1019 RTE_FLOW_ITEM_TYPE_ETH, 1020 RTE_FLOW_ITEM_TYPE_IPV6, 1021 RTE_FLOW_ITEM_TYPE_END, 1022 }; 1023 enum rte_flow_item_type pattern_eth_ipv6_nvgre_eth_ipv6_tcp[] = { 1024 RTE_FLOW_ITEM_TYPE_ETH, 1025 RTE_FLOW_ITEM_TYPE_IPV6, 1026 RTE_FLOW_ITEM_TYPE_NVGRE, 1027 RTE_FLOW_ITEM_TYPE_ETH, 1028 RTE_FLOW_ITEM_TYPE_IPV6, 1029 RTE_FLOW_ITEM_TYPE_TCP, 1030 RTE_FLOW_ITEM_TYPE_END, 1031 }; 1032 enum rte_flow_item_type pattern_eth_ipv6_nvgre_eth_ipv6_udp[] = { 1033 RTE_FLOW_ITEM_TYPE_ETH, 1034 RTE_FLOW_ITEM_TYPE_IPV6, 1035 RTE_FLOW_ITEM_TYPE_NVGRE, 1036 RTE_FLOW_ITEM_TYPE_ETH, 1037 RTE_FLOW_ITEM_TYPE_IPV6, 1038 RTE_FLOW_ITEM_TYPE_UDP, 1039 RTE_FLOW_ITEM_TYPE_END, 1040 }; 1041 enum rte_flow_item_type pattern_eth_ipv6_nvgre_eth_ipv6_sctp[] = { 1042 RTE_FLOW_ITEM_TYPE_ETH, 1043 RTE_FLOW_ITEM_TYPE_IPV6, 1044 RTE_FLOW_ITEM_TYPE_NVGRE, 1045 RTE_FLOW_ITEM_TYPE_ETH, 1046 RTE_FLOW_ITEM_TYPE_IPV6, 1047 RTE_FLOW_ITEM_TYPE_SCTP, 1048 RTE_FLOW_ITEM_TYPE_END, 1049 }; 1050 enum rte_flow_item_type pattern_eth_ipv6_nvgre_eth_ipv6_icmp6[] = { 1051 RTE_FLOW_ITEM_TYPE_ETH, 1052 RTE_FLOW_ITEM_TYPE_IPV6, 1053 RTE_FLOW_ITEM_TYPE_NVGRE, 1054 RTE_FLOW_ITEM_TYPE_ETH, 1055 RTE_FLOW_ITEM_TYPE_IPV6, 1056 RTE_FLOW_ITEM_TYPE_ICMP6, 1057 RTE_FLOW_ITEM_TYPE_END, 1058 }; 1059 1060 /*IPv4 GTPU (EH) */ 1061 enum rte_flow_item_type pattern_eth_ipv4_gtpu[] = { 1062 RTE_FLOW_ITEM_TYPE_ETH, 1063 RTE_FLOW_ITEM_TYPE_IPV4, 1064 RTE_FLOW_ITEM_TYPE_UDP, 1065 RTE_FLOW_ITEM_TYPE_GTPU, 1066 RTE_FLOW_ITEM_TYPE_END, 1067 }; 1068 1069 enum rte_flow_item_type pattern_eth_ipv4_gtpu_eh[] = { 1070 RTE_FLOW_ITEM_TYPE_ETH, 1071 RTE_FLOW_ITEM_TYPE_IPV4, 1072 RTE_FLOW_ITEM_TYPE_UDP, 1073 RTE_FLOW_ITEM_TYPE_GTPU, 1074 RTE_FLOW_ITEM_TYPE_GTP_PSC, 1075 RTE_FLOW_ITEM_TYPE_END, 1076 }; 1077 1078 /*IPv6 GTPU (EH) */ 1079 enum rte_flow_item_type pattern_eth_ipv6_gtpu[] = { 1080 RTE_FLOW_ITEM_TYPE_ETH, 1081 RTE_FLOW_ITEM_TYPE_IPV6, 1082 RTE_FLOW_ITEM_TYPE_UDP, 1083 RTE_FLOW_ITEM_TYPE_GTPU, 1084 RTE_FLOW_ITEM_TYPE_END, 1085 }; 1086 1087 enum rte_flow_item_type pattern_eth_ipv6_gtpu_eh[] = { 1088 RTE_FLOW_ITEM_TYPE_ETH, 1089 RTE_FLOW_ITEM_TYPE_IPV6, 1090 RTE_FLOW_ITEM_TYPE_UDP, 1091 RTE_FLOW_ITEM_TYPE_GTPU, 1092 RTE_FLOW_ITEM_TYPE_GTP_PSC, 1093 RTE_FLOW_ITEM_TYPE_END, 1094 }; 1095 1096 /*IPv4 GTPU IPv4 */ 1097 enum rte_flow_item_type pattern_eth_ipv4_gtpu_ipv4[] = { 1098 RTE_FLOW_ITEM_TYPE_ETH, 1099 RTE_FLOW_ITEM_TYPE_IPV4, 1100 RTE_FLOW_ITEM_TYPE_UDP, 1101 RTE_FLOW_ITEM_TYPE_GTPU, 1102 RTE_FLOW_ITEM_TYPE_IPV4, 1103 RTE_FLOW_ITEM_TYPE_END, 1104 }; 1105 1106 enum rte_flow_item_type pattern_eth_ipv4_gtpu_ipv4_udp[] = { 1107 RTE_FLOW_ITEM_TYPE_ETH, 1108 RTE_FLOW_ITEM_TYPE_IPV4, 1109 RTE_FLOW_ITEM_TYPE_UDP, 1110 RTE_FLOW_ITEM_TYPE_GTPU, 1111 RTE_FLOW_ITEM_TYPE_IPV4, 1112 RTE_FLOW_ITEM_TYPE_UDP, 1113 RTE_FLOW_ITEM_TYPE_END, 1114 }; 1115 1116 enum rte_flow_item_type pattern_eth_ipv4_gtpu_ipv4_tcp[] = { 1117 RTE_FLOW_ITEM_TYPE_ETH, 1118 RTE_FLOW_ITEM_TYPE_IPV4, 1119 RTE_FLOW_ITEM_TYPE_UDP, 1120 RTE_FLOW_ITEM_TYPE_GTPU, 1121 RTE_FLOW_ITEM_TYPE_IPV4, 1122 RTE_FLOW_ITEM_TYPE_TCP, 1123 RTE_FLOW_ITEM_TYPE_END, 1124 }; 1125 1126 enum rte_flow_item_type pattern_eth_ipv4_gtpu_ipv4_icmp[] = { 1127 RTE_FLOW_ITEM_TYPE_ETH, 1128 RTE_FLOW_ITEM_TYPE_IPV4, 1129 RTE_FLOW_ITEM_TYPE_UDP, 1130 RTE_FLOW_ITEM_TYPE_GTPU, 1131 RTE_FLOW_ITEM_TYPE_IPV4, 1132 RTE_FLOW_ITEM_TYPE_ICMP, 1133 RTE_FLOW_ITEM_TYPE_END, 1134 }; 1135 1136 /*IPv4 GTPU IPv6 */ 1137 enum rte_flow_item_type pattern_eth_ipv4_gtpu_ipv6[] = { 1138 RTE_FLOW_ITEM_TYPE_ETH, 1139 RTE_FLOW_ITEM_TYPE_IPV4, 1140 RTE_FLOW_ITEM_TYPE_UDP, 1141 RTE_FLOW_ITEM_TYPE_GTPU, 1142 RTE_FLOW_ITEM_TYPE_IPV6, 1143 RTE_FLOW_ITEM_TYPE_END, 1144 }; 1145 1146 enum rte_flow_item_type pattern_eth_ipv4_gtpu_ipv6_udp[] = { 1147 RTE_FLOW_ITEM_TYPE_ETH, 1148 RTE_FLOW_ITEM_TYPE_IPV4, 1149 RTE_FLOW_ITEM_TYPE_UDP, 1150 RTE_FLOW_ITEM_TYPE_GTPU, 1151 RTE_FLOW_ITEM_TYPE_IPV6, 1152 RTE_FLOW_ITEM_TYPE_UDP, 1153 RTE_FLOW_ITEM_TYPE_END, 1154 }; 1155 1156 enum rte_flow_item_type pattern_eth_ipv4_gtpu_ipv6_tcp[] = { 1157 RTE_FLOW_ITEM_TYPE_ETH, 1158 RTE_FLOW_ITEM_TYPE_IPV4, 1159 RTE_FLOW_ITEM_TYPE_UDP, 1160 RTE_FLOW_ITEM_TYPE_GTPU, 1161 RTE_FLOW_ITEM_TYPE_IPV6, 1162 RTE_FLOW_ITEM_TYPE_TCP, 1163 RTE_FLOW_ITEM_TYPE_END, 1164 }; 1165 1166 enum rte_flow_item_type pattern_eth_ipv4_gtpu_ipv6_icmp[] = { 1167 RTE_FLOW_ITEM_TYPE_ETH, 1168 RTE_FLOW_ITEM_TYPE_IPV4, 1169 RTE_FLOW_ITEM_TYPE_UDP, 1170 RTE_FLOW_ITEM_TYPE_GTPU, 1171 RTE_FLOW_ITEM_TYPE_IPV6, 1172 RTE_FLOW_ITEM_TYPE_ICMP, 1173 RTE_FLOW_ITEM_TYPE_END, 1174 }; 1175 1176 /*IPv6 GTPU IPv4 */ 1177 enum rte_flow_item_type pattern_eth_ipv6_gtpu_ipv4[] = { 1178 RTE_FLOW_ITEM_TYPE_ETH, 1179 RTE_FLOW_ITEM_TYPE_IPV6, 1180 RTE_FLOW_ITEM_TYPE_UDP, 1181 RTE_FLOW_ITEM_TYPE_GTPU, 1182 RTE_FLOW_ITEM_TYPE_IPV4, 1183 RTE_FLOW_ITEM_TYPE_END, 1184 }; 1185 1186 enum rte_flow_item_type pattern_eth_ipv6_gtpu_ipv4_udp[] = { 1187 RTE_FLOW_ITEM_TYPE_ETH, 1188 RTE_FLOW_ITEM_TYPE_IPV6, 1189 RTE_FLOW_ITEM_TYPE_UDP, 1190 RTE_FLOW_ITEM_TYPE_GTPU, 1191 RTE_FLOW_ITEM_TYPE_IPV4, 1192 RTE_FLOW_ITEM_TYPE_UDP, 1193 RTE_FLOW_ITEM_TYPE_END, 1194 }; 1195 1196 enum rte_flow_item_type pattern_eth_ipv6_gtpu_ipv4_tcp[] = { 1197 RTE_FLOW_ITEM_TYPE_ETH, 1198 RTE_FLOW_ITEM_TYPE_IPV6, 1199 RTE_FLOW_ITEM_TYPE_UDP, 1200 RTE_FLOW_ITEM_TYPE_GTPU, 1201 RTE_FLOW_ITEM_TYPE_IPV4, 1202 RTE_FLOW_ITEM_TYPE_TCP, 1203 RTE_FLOW_ITEM_TYPE_END, 1204 }; 1205 1206 enum rte_flow_item_type pattern_eth_ipv6_gtpu_ipv4_icmp[] = { 1207 RTE_FLOW_ITEM_TYPE_ETH, 1208 RTE_FLOW_ITEM_TYPE_IPV6, 1209 RTE_FLOW_ITEM_TYPE_UDP, 1210 RTE_FLOW_ITEM_TYPE_GTPU, 1211 RTE_FLOW_ITEM_TYPE_IPV4, 1212 RTE_FLOW_ITEM_TYPE_ICMP, 1213 RTE_FLOW_ITEM_TYPE_END, 1214 }; 1215 1216 /*IPv6 GTPU IPv6 */ 1217 enum rte_flow_item_type pattern_eth_ipv6_gtpu_ipv6[] = { 1218 RTE_FLOW_ITEM_TYPE_ETH, 1219 RTE_FLOW_ITEM_TYPE_IPV6, 1220 RTE_FLOW_ITEM_TYPE_UDP, 1221 RTE_FLOW_ITEM_TYPE_GTPU, 1222 RTE_FLOW_ITEM_TYPE_IPV6, 1223 RTE_FLOW_ITEM_TYPE_END, 1224 }; 1225 1226 enum rte_flow_item_type pattern_eth_ipv6_gtpu_ipv6_udp[] = { 1227 RTE_FLOW_ITEM_TYPE_ETH, 1228 RTE_FLOW_ITEM_TYPE_IPV6, 1229 RTE_FLOW_ITEM_TYPE_UDP, 1230 RTE_FLOW_ITEM_TYPE_GTPU, 1231 RTE_FLOW_ITEM_TYPE_IPV6, 1232 RTE_FLOW_ITEM_TYPE_UDP, 1233 RTE_FLOW_ITEM_TYPE_END, 1234 }; 1235 1236 enum rte_flow_item_type pattern_eth_ipv6_gtpu_ipv6_tcp[] = { 1237 RTE_FLOW_ITEM_TYPE_ETH, 1238 RTE_FLOW_ITEM_TYPE_IPV6, 1239 RTE_FLOW_ITEM_TYPE_UDP, 1240 RTE_FLOW_ITEM_TYPE_GTPU, 1241 RTE_FLOW_ITEM_TYPE_IPV6, 1242 RTE_FLOW_ITEM_TYPE_TCP, 1243 RTE_FLOW_ITEM_TYPE_END, 1244 }; 1245 1246 enum rte_flow_item_type pattern_eth_ipv6_gtpu_ipv6_icmp[] = { 1247 RTE_FLOW_ITEM_TYPE_ETH, 1248 RTE_FLOW_ITEM_TYPE_IPV6, 1249 RTE_FLOW_ITEM_TYPE_UDP, 1250 RTE_FLOW_ITEM_TYPE_GTPU, 1251 RTE_FLOW_ITEM_TYPE_IPV6, 1252 RTE_FLOW_ITEM_TYPE_ICMP, 1253 RTE_FLOW_ITEM_TYPE_END, 1254 }; 1255 1256 /*IPv4 GTPU EH IPv4 */ 1257 enum rte_flow_item_type pattern_eth_ipv4_gtpu_eh_ipv4[] = { 1258 RTE_FLOW_ITEM_TYPE_ETH, 1259 RTE_FLOW_ITEM_TYPE_IPV4, 1260 RTE_FLOW_ITEM_TYPE_UDP, 1261 RTE_FLOW_ITEM_TYPE_GTPU, 1262 RTE_FLOW_ITEM_TYPE_GTP_PSC, 1263 RTE_FLOW_ITEM_TYPE_IPV4, 1264 RTE_FLOW_ITEM_TYPE_END, 1265 }; 1266 1267 enum rte_flow_item_type pattern_eth_ipv4_gtpu_eh_ipv4_udp[] = { 1268 RTE_FLOW_ITEM_TYPE_ETH, 1269 RTE_FLOW_ITEM_TYPE_IPV4, 1270 RTE_FLOW_ITEM_TYPE_UDP, 1271 RTE_FLOW_ITEM_TYPE_GTPU, 1272 RTE_FLOW_ITEM_TYPE_GTP_PSC, 1273 RTE_FLOW_ITEM_TYPE_IPV4, 1274 RTE_FLOW_ITEM_TYPE_UDP, 1275 RTE_FLOW_ITEM_TYPE_END, 1276 }; 1277 1278 enum rte_flow_item_type pattern_eth_ipv4_gtpu_eh_ipv4_tcp[] = { 1279 RTE_FLOW_ITEM_TYPE_ETH, 1280 RTE_FLOW_ITEM_TYPE_IPV4, 1281 RTE_FLOW_ITEM_TYPE_UDP, 1282 RTE_FLOW_ITEM_TYPE_GTPU, 1283 RTE_FLOW_ITEM_TYPE_GTP_PSC, 1284 RTE_FLOW_ITEM_TYPE_IPV4, 1285 RTE_FLOW_ITEM_TYPE_TCP, 1286 RTE_FLOW_ITEM_TYPE_END, 1287 }; 1288 1289 enum rte_flow_item_type pattern_eth_ipv4_gtpu_eh_ipv4_icmp[] = { 1290 RTE_FLOW_ITEM_TYPE_ETH, 1291 RTE_FLOW_ITEM_TYPE_IPV4, 1292 RTE_FLOW_ITEM_TYPE_UDP, 1293 RTE_FLOW_ITEM_TYPE_GTPU, 1294 RTE_FLOW_ITEM_TYPE_GTP_PSC, 1295 RTE_FLOW_ITEM_TYPE_IPV4, 1296 RTE_FLOW_ITEM_TYPE_ICMP, 1297 RTE_FLOW_ITEM_TYPE_END, 1298 }; 1299 1300 /*IPv4 GTPU EH IPv6 */ 1301 enum rte_flow_item_type pattern_eth_ipv4_gtpu_eh_ipv6[] = { 1302 RTE_FLOW_ITEM_TYPE_ETH, 1303 RTE_FLOW_ITEM_TYPE_IPV4, 1304 RTE_FLOW_ITEM_TYPE_UDP, 1305 RTE_FLOW_ITEM_TYPE_GTPU, 1306 RTE_FLOW_ITEM_TYPE_GTP_PSC, 1307 RTE_FLOW_ITEM_TYPE_IPV6, 1308 RTE_FLOW_ITEM_TYPE_END, 1309 }; 1310 1311 enum rte_flow_item_type pattern_eth_ipv4_gtpu_eh_ipv6_udp[] = { 1312 RTE_FLOW_ITEM_TYPE_ETH, 1313 RTE_FLOW_ITEM_TYPE_IPV4, 1314 RTE_FLOW_ITEM_TYPE_UDP, 1315 RTE_FLOW_ITEM_TYPE_GTPU, 1316 RTE_FLOW_ITEM_TYPE_GTP_PSC, 1317 RTE_FLOW_ITEM_TYPE_IPV6, 1318 RTE_FLOW_ITEM_TYPE_UDP, 1319 RTE_FLOW_ITEM_TYPE_END, 1320 }; 1321 1322 enum rte_flow_item_type pattern_eth_ipv4_gtpu_eh_ipv6_tcp[] = { 1323 RTE_FLOW_ITEM_TYPE_ETH, 1324 RTE_FLOW_ITEM_TYPE_IPV4, 1325 RTE_FLOW_ITEM_TYPE_UDP, 1326 RTE_FLOW_ITEM_TYPE_GTPU, 1327 RTE_FLOW_ITEM_TYPE_GTP_PSC, 1328 RTE_FLOW_ITEM_TYPE_IPV6, 1329 RTE_FLOW_ITEM_TYPE_TCP, 1330 RTE_FLOW_ITEM_TYPE_END, 1331 }; 1332 1333 enum rte_flow_item_type pattern_eth_ipv4_gtpu_eh_ipv6_icmp[] = { 1334 RTE_FLOW_ITEM_TYPE_ETH, 1335 RTE_FLOW_ITEM_TYPE_IPV4, 1336 RTE_FLOW_ITEM_TYPE_UDP, 1337 RTE_FLOW_ITEM_TYPE_GTPU, 1338 RTE_FLOW_ITEM_TYPE_GTP_PSC, 1339 RTE_FLOW_ITEM_TYPE_IPV6, 1340 RTE_FLOW_ITEM_TYPE_ICMP, 1341 RTE_FLOW_ITEM_TYPE_END, 1342 }; 1343 1344 /*IPv6 GTPU EH IPv4 */ 1345 enum rte_flow_item_type pattern_eth_ipv6_gtpu_eh_ipv4[] = { 1346 RTE_FLOW_ITEM_TYPE_ETH, 1347 RTE_FLOW_ITEM_TYPE_IPV6, 1348 RTE_FLOW_ITEM_TYPE_UDP, 1349 RTE_FLOW_ITEM_TYPE_GTPU, 1350 RTE_FLOW_ITEM_TYPE_GTP_PSC, 1351 RTE_FLOW_ITEM_TYPE_IPV4, 1352 RTE_FLOW_ITEM_TYPE_END, 1353 }; 1354 1355 enum rte_flow_item_type pattern_eth_ipv6_gtpu_eh_ipv4_udp[] = { 1356 RTE_FLOW_ITEM_TYPE_ETH, 1357 RTE_FLOW_ITEM_TYPE_IPV6, 1358 RTE_FLOW_ITEM_TYPE_UDP, 1359 RTE_FLOW_ITEM_TYPE_GTPU, 1360 RTE_FLOW_ITEM_TYPE_GTP_PSC, 1361 RTE_FLOW_ITEM_TYPE_IPV4, 1362 RTE_FLOW_ITEM_TYPE_UDP, 1363 RTE_FLOW_ITEM_TYPE_END, 1364 }; 1365 1366 enum rte_flow_item_type pattern_eth_ipv6_gtpu_eh_ipv4_tcp[] = { 1367 RTE_FLOW_ITEM_TYPE_ETH, 1368 RTE_FLOW_ITEM_TYPE_IPV6, 1369 RTE_FLOW_ITEM_TYPE_UDP, 1370 RTE_FLOW_ITEM_TYPE_GTPU, 1371 RTE_FLOW_ITEM_TYPE_GTP_PSC, 1372 RTE_FLOW_ITEM_TYPE_IPV4, 1373 RTE_FLOW_ITEM_TYPE_TCP, 1374 RTE_FLOW_ITEM_TYPE_END, 1375 }; 1376 1377 enum rte_flow_item_type pattern_eth_ipv6_gtpu_eh_ipv4_icmp[] = { 1378 RTE_FLOW_ITEM_TYPE_ETH, 1379 RTE_FLOW_ITEM_TYPE_IPV6, 1380 RTE_FLOW_ITEM_TYPE_UDP, 1381 RTE_FLOW_ITEM_TYPE_GTPU, 1382 RTE_FLOW_ITEM_TYPE_GTP_PSC, 1383 RTE_FLOW_ITEM_TYPE_IPV4, 1384 RTE_FLOW_ITEM_TYPE_ICMP, 1385 RTE_FLOW_ITEM_TYPE_END, 1386 }; 1387 1388 /*IPv6 GTPU EH IPv6 */ 1389 enum rte_flow_item_type pattern_eth_ipv6_gtpu_eh_ipv6[] = { 1390 RTE_FLOW_ITEM_TYPE_ETH, 1391 RTE_FLOW_ITEM_TYPE_IPV6, 1392 RTE_FLOW_ITEM_TYPE_UDP, 1393 RTE_FLOW_ITEM_TYPE_GTPU, 1394 RTE_FLOW_ITEM_TYPE_GTP_PSC, 1395 RTE_FLOW_ITEM_TYPE_IPV6, 1396 RTE_FLOW_ITEM_TYPE_END, 1397 }; 1398 1399 enum rte_flow_item_type pattern_eth_ipv6_gtpu_eh_ipv6_udp[] = { 1400 RTE_FLOW_ITEM_TYPE_ETH, 1401 RTE_FLOW_ITEM_TYPE_IPV6, 1402 RTE_FLOW_ITEM_TYPE_UDP, 1403 RTE_FLOW_ITEM_TYPE_GTPU, 1404 RTE_FLOW_ITEM_TYPE_GTP_PSC, 1405 RTE_FLOW_ITEM_TYPE_IPV6, 1406 RTE_FLOW_ITEM_TYPE_UDP, 1407 RTE_FLOW_ITEM_TYPE_END, 1408 }; 1409 1410 enum rte_flow_item_type pattern_eth_ipv6_gtpu_eh_ipv6_tcp[] = { 1411 RTE_FLOW_ITEM_TYPE_ETH, 1412 RTE_FLOW_ITEM_TYPE_IPV6, 1413 RTE_FLOW_ITEM_TYPE_UDP, 1414 RTE_FLOW_ITEM_TYPE_GTPU, 1415 RTE_FLOW_ITEM_TYPE_GTP_PSC, 1416 RTE_FLOW_ITEM_TYPE_IPV6, 1417 RTE_FLOW_ITEM_TYPE_TCP, 1418 RTE_FLOW_ITEM_TYPE_END, 1419 }; 1420 1421 enum rte_flow_item_type pattern_eth_ipv6_gtpu_eh_ipv6_icmp[] = { 1422 RTE_FLOW_ITEM_TYPE_ETH, 1423 RTE_FLOW_ITEM_TYPE_IPV6, 1424 RTE_FLOW_ITEM_TYPE_UDP, 1425 RTE_FLOW_ITEM_TYPE_GTPU, 1426 RTE_FLOW_ITEM_TYPE_GTP_PSC, 1427 RTE_FLOW_ITEM_TYPE_IPV6, 1428 RTE_FLOW_ITEM_TYPE_ICMP, 1429 RTE_FLOW_ITEM_TYPE_END, 1430 }; 1431 1432 /* PPPoE */ 1433 enum rte_flow_item_type pattern_eth_pppoed[] = { 1434 RTE_FLOW_ITEM_TYPE_ETH, 1435 RTE_FLOW_ITEM_TYPE_PPPOED, 1436 RTE_FLOW_ITEM_TYPE_END, 1437 }; 1438 enum rte_flow_item_type pattern_eth_vlan_pppoed[] = { 1439 RTE_FLOW_ITEM_TYPE_ETH, 1440 RTE_FLOW_ITEM_TYPE_VLAN, 1441 RTE_FLOW_ITEM_TYPE_PPPOED, 1442 RTE_FLOW_ITEM_TYPE_END, 1443 }; 1444 enum rte_flow_item_type pattern_eth_qinq_pppoed[] = { 1445 RTE_FLOW_ITEM_TYPE_ETH, 1446 RTE_FLOW_ITEM_TYPE_VLAN, 1447 RTE_FLOW_ITEM_TYPE_VLAN, 1448 RTE_FLOW_ITEM_TYPE_PPPOED, 1449 RTE_FLOW_ITEM_TYPE_END, 1450 }; 1451 enum rte_flow_item_type pattern_eth_pppoes[] = { 1452 RTE_FLOW_ITEM_TYPE_ETH, 1453 RTE_FLOW_ITEM_TYPE_PPPOES, 1454 RTE_FLOW_ITEM_TYPE_END, 1455 }; 1456 enum rte_flow_item_type pattern_eth_pppoes_proto[] = { 1457 RTE_FLOW_ITEM_TYPE_ETH, 1458 RTE_FLOW_ITEM_TYPE_PPPOES, 1459 RTE_FLOW_ITEM_TYPE_PPPOE_PROTO_ID, 1460 RTE_FLOW_ITEM_TYPE_END, 1461 }; 1462 enum rte_flow_item_type pattern_eth_vlan_pppoes[] = { 1463 RTE_FLOW_ITEM_TYPE_ETH, 1464 RTE_FLOW_ITEM_TYPE_VLAN, 1465 RTE_FLOW_ITEM_TYPE_PPPOES, 1466 RTE_FLOW_ITEM_TYPE_END, 1467 }; 1468 enum rte_flow_item_type pattern_eth_vlan_pppoes_proto[] = { 1469 RTE_FLOW_ITEM_TYPE_ETH, 1470 RTE_FLOW_ITEM_TYPE_VLAN, 1471 RTE_FLOW_ITEM_TYPE_PPPOES, 1472 RTE_FLOW_ITEM_TYPE_PPPOE_PROTO_ID, 1473 RTE_FLOW_ITEM_TYPE_END, 1474 }; 1475 enum rte_flow_item_type pattern_eth_qinq_pppoes[] = { 1476 RTE_FLOW_ITEM_TYPE_ETH, 1477 RTE_FLOW_ITEM_TYPE_VLAN, 1478 RTE_FLOW_ITEM_TYPE_VLAN, 1479 RTE_FLOW_ITEM_TYPE_PPPOES, 1480 RTE_FLOW_ITEM_TYPE_END, 1481 }; 1482 enum rte_flow_item_type pattern_eth_qinq_pppoes_proto[] = { 1483 RTE_FLOW_ITEM_TYPE_ETH, 1484 RTE_FLOW_ITEM_TYPE_VLAN, 1485 RTE_FLOW_ITEM_TYPE_VLAN, 1486 RTE_FLOW_ITEM_TYPE_PPPOES, 1487 RTE_FLOW_ITEM_TYPE_PPPOE_PROTO_ID, 1488 RTE_FLOW_ITEM_TYPE_END, 1489 }; 1490 enum rte_flow_item_type pattern_eth_pppoes_ipv4[] = { 1491 RTE_FLOW_ITEM_TYPE_ETH, 1492 RTE_FLOW_ITEM_TYPE_PPPOES, 1493 RTE_FLOW_ITEM_TYPE_IPV4, 1494 RTE_FLOW_ITEM_TYPE_END, 1495 }; 1496 enum rte_flow_item_type pattern_eth_vlan_pppoes_ipv4[] = { 1497 RTE_FLOW_ITEM_TYPE_ETH, 1498 RTE_FLOW_ITEM_TYPE_VLAN, 1499 RTE_FLOW_ITEM_TYPE_PPPOES, 1500 RTE_FLOW_ITEM_TYPE_IPV4, 1501 RTE_FLOW_ITEM_TYPE_END, 1502 }; 1503 enum rte_flow_item_type pattern_eth_qinq_pppoes_ipv4[] = { 1504 RTE_FLOW_ITEM_TYPE_ETH, 1505 RTE_FLOW_ITEM_TYPE_VLAN, 1506 RTE_FLOW_ITEM_TYPE_VLAN, 1507 RTE_FLOW_ITEM_TYPE_PPPOES, 1508 RTE_FLOW_ITEM_TYPE_IPV4, 1509 RTE_FLOW_ITEM_TYPE_END, 1510 }; 1511 enum rte_flow_item_type pattern_eth_pppoes_ipv4_udp[] = { 1512 RTE_FLOW_ITEM_TYPE_ETH, 1513 RTE_FLOW_ITEM_TYPE_PPPOES, 1514 RTE_FLOW_ITEM_TYPE_IPV4, 1515 RTE_FLOW_ITEM_TYPE_UDP, 1516 RTE_FLOW_ITEM_TYPE_END, 1517 }; 1518 enum rte_flow_item_type pattern_eth_vlan_pppoes_ipv4_udp[] = { 1519 RTE_FLOW_ITEM_TYPE_ETH, 1520 RTE_FLOW_ITEM_TYPE_VLAN, 1521 RTE_FLOW_ITEM_TYPE_PPPOES, 1522 RTE_FLOW_ITEM_TYPE_IPV4, 1523 RTE_FLOW_ITEM_TYPE_UDP, 1524 RTE_FLOW_ITEM_TYPE_END, 1525 }; 1526 enum rte_flow_item_type pattern_eth_qinq_pppoes_ipv4_udp[] = { 1527 RTE_FLOW_ITEM_TYPE_ETH, 1528 RTE_FLOW_ITEM_TYPE_VLAN, 1529 RTE_FLOW_ITEM_TYPE_VLAN, 1530 RTE_FLOW_ITEM_TYPE_PPPOES, 1531 RTE_FLOW_ITEM_TYPE_IPV4, 1532 RTE_FLOW_ITEM_TYPE_UDP, 1533 RTE_FLOW_ITEM_TYPE_END, 1534 }; 1535 enum rte_flow_item_type pattern_eth_pppoes_ipv4_tcp[] = { 1536 RTE_FLOW_ITEM_TYPE_ETH, 1537 RTE_FLOW_ITEM_TYPE_PPPOES, 1538 RTE_FLOW_ITEM_TYPE_IPV4, 1539 RTE_FLOW_ITEM_TYPE_TCP, 1540 RTE_FLOW_ITEM_TYPE_END, 1541 }; 1542 enum rte_flow_item_type pattern_eth_vlan_pppoes_ipv4_tcp[] = { 1543 RTE_FLOW_ITEM_TYPE_ETH, 1544 RTE_FLOW_ITEM_TYPE_VLAN, 1545 RTE_FLOW_ITEM_TYPE_PPPOES, 1546 RTE_FLOW_ITEM_TYPE_IPV4, 1547 RTE_FLOW_ITEM_TYPE_TCP, 1548 RTE_FLOW_ITEM_TYPE_END, 1549 }; 1550 enum rte_flow_item_type pattern_eth_qinq_pppoes_ipv4_tcp[] = { 1551 RTE_FLOW_ITEM_TYPE_ETH, 1552 RTE_FLOW_ITEM_TYPE_VLAN, 1553 RTE_FLOW_ITEM_TYPE_VLAN, 1554 RTE_FLOW_ITEM_TYPE_PPPOES, 1555 RTE_FLOW_ITEM_TYPE_IPV4, 1556 RTE_FLOW_ITEM_TYPE_TCP, 1557 RTE_FLOW_ITEM_TYPE_END, 1558 }; 1559 enum rte_flow_item_type pattern_eth_pppoes_ipv4_sctp[] = { 1560 RTE_FLOW_ITEM_TYPE_ETH, 1561 RTE_FLOW_ITEM_TYPE_PPPOES, 1562 RTE_FLOW_ITEM_TYPE_IPV4, 1563 RTE_FLOW_ITEM_TYPE_SCTP, 1564 RTE_FLOW_ITEM_TYPE_END, 1565 }; 1566 enum rte_flow_item_type pattern_eth_vlan_pppoes_ipv4_sctp[] = { 1567 RTE_FLOW_ITEM_TYPE_ETH, 1568 RTE_FLOW_ITEM_TYPE_VLAN, 1569 RTE_FLOW_ITEM_TYPE_PPPOES, 1570 RTE_FLOW_ITEM_TYPE_IPV4, 1571 RTE_FLOW_ITEM_TYPE_SCTP, 1572 RTE_FLOW_ITEM_TYPE_END, 1573 }; 1574 enum rte_flow_item_type pattern_eth_qinq_pppoes_ipv4_sctp[] = { 1575 RTE_FLOW_ITEM_TYPE_ETH, 1576 RTE_FLOW_ITEM_TYPE_VLAN, 1577 RTE_FLOW_ITEM_TYPE_VLAN, 1578 RTE_FLOW_ITEM_TYPE_PPPOES, 1579 RTE_FLOW_ITEM_TYPE_IPV4, 1580 RTE_FLOW_ITEM_TYPE_SCTP, 1581 RTE_FLOW_ITEM_TYPE_END, 1582 }; 1583 enum rte_flow_item_type pattern_eth_pppoes_ipv4_icmp[] = { 1584 RTE_FLOW_ITEM_TYPE_ETH, 1585 RTE_FLOW_ITEM_TYPE_PPPOES, 1586 RTE_FLOW_ITEM_TYPE_IPV4, 1587 RTE_FLOW_ITEM_TYPE_ICMP, 1588 RTE_FLOW_ITEM_TYPE_END, 1589 }; 1590 enum rte_flow_item_type pattern_eth_vlan_pppoes_ipv4_icmp[] = { 1591 RTE_FLOW_ITEM_TYPE_ETH, 1592 RTE_FLOW_ITEM_TYPE_VLAN, 1593 RTE_FLOW_ITEM_TYPE_PPPOES, 1594 RTE_FLOW_ITEM_TYPE_IPV4, 1595 RTE_FLOW_ITEM_TYPE_ICMP, 1596 RTE_FLOW_ITEM_TYPE_END, 1597 }; 1598 enum rte_flow_item_type pattern_eth_qinq_pppoes_ipv4_icmp[] = { 1599 RTE_FLOW_ITEM_TYPE_ETH, 1600 RTE_FLOW_ITEM_TYPE_VLAN, 1601 RTE_FLOW_ITEM_TYPE_VLAN, 1602 RTE_FLOW_ITEM_TYPE_PPPOES, 1603 RTE_FLOW_ITEM_TYPE_IPV4, 1604 RTE_FLOW_ITEM_TYPE_ICMP, 1605 RTE_FLOW_ITEM_TYPE_END, 1606 }; 1607 enum rte_flow_item_type pattern_eth_pppoes_ipv6[] = { 1608 RTE_FLOW_ITEM_TYPE_ETH, 1609 RTE_FLOW_ITEM_TYPE_PPPOES, 1610 RTE_FLOW_ITEM_TYPE_IPV6, 1611 RTE_FLOW_ITEM_TYPE_END, 1612 }; 1613 enum rte_flow_item_type pattern_eth_vlan_pppoes_ipv6[] = { 1614 RTE_FLOW_ITEM_TYPE_ETH, 1615 RTE_FLOW_ITEM_TYPE_VLAN, 1616 RTE_FLOW_ITEM_TYPE_PPPOES, 1617 RTE_FLOW_ITEM_TYPE_IPV6, 1618 RTE_FLOW_ITEM_TYPE_END, 1619 }; 1620 enum rte_flow_item_type pattern_eth_qinq_pppoes_ipv6[] = { 1621 RTE_FLOW_ITEM_TYPE_ETH, 1622 RTE_FLOW_ITEM_TYPE_VLAN, 1623 RTE_FLOW_ITEM_TYPE_VLAN, 1624 RTE_FLOW_ITEM_TYPE_PPPOES, 1625 RTE_FLOW_ITEM_TYPE_IPV6, 1626 RTE_FLOW_ITEM_TYPE_END, 1627 }; 1628 enum rte_flow_item_type pattern_eth_pppoes_ipv6_udp[] = { 1629 RTE_FLOW_ITEM_TYPE_ETH, 1630 RTE_FLOW_ITEM_TYPE_PPPOES, 1631 RTE_FLOW_ITEM_TYPE_IPV6, 1632 RTE_FLOW_ITEM_TYPE_UDP, 1633 RTE_FLOW_ITEM_TYPE_END, 1634 }; 1635 enum rte_flow_item_type pattern_eth_vlan_pppoes_ipv6_udp[] = { 1636 RTE_FLOW_ITEM_TYPE_ETH, 1637 RTE_FLOW_ITEM_TYPE_VLAN, 1638 RTE_FLOW_ITEM_TYPE_PPPOES, 1639 RTE_FLOW_ITEM_TYPE_IPV6, 1640 RTE_FLOW_ITEM_TYPE_UDP, 1641 RTE_FLOW_ITEM_TYPE_END, 1642 }; 1643 enum rte_flow_item_type pattern_eth_qinq_pppoes_ipv6_udp[] = { 1644 RTE_FLOW_ITEM_TYPE_ETH, 1645 RTE_FLOW_ITEM_TYPE_VLAN, 1646 RTE_FLOW_ITEM_TYPE_VLAN, 1647 RTE_FLOW_ITEM_TYPE_PPPOES, 1648 RTE_FLOW_ITEM_TYPE_IPV6, 1649 RTE_FLOW_ITEM_TYPE_UDP, 1650 RTE_FLOW_ITEM_TYPE_END, 1651 }; 1652 enum rte_flow_item_type pattern_eth_pppoes_ipv6_tcp[] = { 1653 RTE_FLOW_ITEM_TYPE_ETH, 1654 RTE_FLOW_ITEM_TYPE_PPPOES, 1655 RTE_FLOW_ITEM_TYPE_IPV6, 1656 RTE_FLOW_ITEM_TYPE_TCP, 1657 RTE_FLOW_ITEM_TYPE_END, 1658 }; 1659 enum rte_flow_item_type pattern_eth_vlan_pppoes_ipv6_tcp[] = { 1660 RTE_FLOW_ITEM_TYPE_ETH, 1661 RTE_FLOW_ITEM_TYPE_VLAN, 1662 RTE_FLOW_ITEM_TYPE_PPPOES, 1663 RTE_FLOW_ITEM_TYPE_IPV6, 1664 RTE_FLOW_ITEM_TYPE_TCP, 1665 RTE_FLOW_ITEM_TYPE_END, 1666 }; 1667 enum rte_flow_item_type pattern_eth_qinq_pppoes_ipv6_tcp[] = { 1668 RTE_FLOW_ITEM_TYPE_ETH, 1669 RTE_FLOW_ITEM_TYPE_VLAN, 1670 RTE_FLOW_ITEM_TYPE_VLAN, 1671 RTE_FLOW_ITEM_TYPE_PPPOES, 1672 RTE_FLOW_ITEM_TYPE_IPV6, 1673 RTE_FLOW_ITEM_TYPE_TCP, 1674 RTE_FLOW_ITEM_TYPE_END, 1675 }; 1676 enum rte_flow_item_type pattern_eth_pppoes_ipv6_sctp[] = { 1677 RTE_FLOW_ITEM_TYPE_ETH, 1678 RTE_FLOW_ITEM_TYPE_PPPOES, 1679 RTE_FLOW_ITEM_TYPE_IPV6, 1680 RTE_FLOW_ITEM_TYPE_SCTP, 1681 RTE_FLOW_ITEM_TYPE_END, 1682 }; 1683 enum rte_flow_item_type pattern_eth_vlan_pppoes_ipv6_sctp[] = { 1684 RTE_FLOW_ITEM_TYPE_ETH, 1685 RTE_FLOW_ITEM_TYPE_VLAN, 1686 RTE_FLOW_ITEM_TYPE_PPPOES, 1687 RTE_FLOW_ITEM_TYPE_IPV6, 1688 RTE_FLOW_ITEM_TYPE_SCTP, 1689 RTE_FLOW_ITEM_TYPE_END, 1690 }; 1691 enum rte_flow_item_type pattern_eth_qinq_pppoes_ipv6_sctp[] = { 1692 RTE_FLOW_ITEM_TYPE_ETH, 1693 RTE_FLOW_ITEM_TYPE_VLAN, 1694 RTE_FLOW_ITEM_TYPE_VLAN, 1695 RTE_FLOW_ITEM_TYPE_PPPOES, 1696 RTE_FLOW_ITEM_TYPE_IPV6, 1697 RTE_FLOW_ITEM_TYPE_SCTP, 1698 RTE_FLOW_ITEM_TYPE_END, 1699 }; 1700 enum rte_flow_item_type pattern_eth_pppoes_ipv6_icmp6[] = { 1701 RTE_FLOW_ITEM_TYPE_ETH, 1702 RTE_FLOW_ITEM_TYPE_PPPOES, 1703 RTE_FLOW_ITEM_TYPE_IPV6, 1704 RTE_FLOW_ITEM_TYPE_ICMP6, 1705 RTE_FLOW_ITEM_TYPE_END, 1706 }; 1707 enum rte_flow_item_type pattern_eth_vlan_pppoes_ipv6_icmp6[] = { 1708 RTE_FLOW_ITEM_TYPE_ETH, 1709 RTE_FLOW_ITEM_TYPE_VLAN, 1710 RTE_FLOW_ITEM_TYPE_PPPOES, 1711 RTE_FLOW_ITEM_TYPE_IPV6, 1712 RTE_FLOW_ITEM_TYPE_ICMP6, 1713 RTE_FLOW_ITEM_TYPE_END, 1714 }; 1715 enum rte_flow_item_type pattern_eth_qinq_pppoes_ipv6_icmp6[] = { 1716 RTE_FLOW_ITEM_TYPE_ETH, 1717 RTE_FLOW_ITEM_TYPE_VLAN, 1718 RTE_FLOW_ITEM_TYPE_VLAN, 1719 RTE_FLOW_ITEM_TYPE_PPPOES, 1720 RTE_FLOW_ITEM_TYPE_IPV6, 1721 RTE_FLOW_ITEM_TYPE_ICMP6, 1722 RTE_FLOW_ITEM_TYPE_END, 1723 }; 1724 enum rte_flow_item_type pattern_eth_ipv4_esp[] = { 1725 RTE_FLOW_ITEM_TYPE_ETH, 1726 RTE_FLOW_ITEM_TYPE_IPV4, 1727 RTE_FLOW_ITEM_TYPE_ESP, 1728 RTE_FLOW_ITEM_TYPE_END, 1729 }; 1730 enum rte_flow_item_type pattern_eth_ipv6_esp[] = { 1731 RTE_FLOW_ITEM_TYPE_ETH, 1732 RTE_FLOW_ITEM_TYPE_IPV6, 1733 RTE_FLOW_ITEM_TYPE_ESP, 1734 RTE_FLOW_ITEM_TYPE_END, 1735 }; 1736 enum rte_flow_item_type pattern_eth_ipv4_ah[] = { 1737 RTE_FLOW_ITEM_TYPE_ETH, 1738 RTE_FLOW_ITEM_TYPE_IPV4, 1739 RTE_FLOW_ITEM_TYPE_AH, 1740 RTE_FLOW_ITEM_TYPE_END, 1741 }; 1742 enum rte_flow_item_type pattern_eth_ipv6_ah[] = { 1743 RTE_FLOW_ITEM_TYPE_ETH, 1744 RTE_FLOW_ITEM_TYPE_IPV6, 1745 RTE_FLOW_ITEM_TYPE_AH, 1746 RTE_FLOW_ITEM_TYPE_END, 1747 }; 1748 enum rte_flow_item_type pattern_eth_ipv4_udp_esp[] = { 1749 RTE_FLOW_ITEM_TYPE_ETH, 1750 RTE_FLOW_ITEM_TYPE_IPV4, 1751 RTE_FLOW_ITEM_TYPE_UDP, 1752 RTE_FLOW_ITEM_TYPE_ESP, 1753 RTE_FLOW_ITEM_TYPE_END, 1754 }; 1755 enum rte_flow_item_type pattern_eth_ipv6_udp_esp[] = { 1756 RTE_FLOW_ITEM_TYPE_ETH, 1757 RTE_FLOW_ITEM_TYPE_IPV6, 1758 RTE_FLOW_ITEM_TYPE_UDP, 1759 RTE_FLOW_ITEM_TYPE_ESP, 1760 RTE_FLOW_ITEM_TYPE_END, 1761 }; 1762 enum rte_flow_item_type pattern_eth_ipv6_udp_ah[] = { 1763 RTE_FLOW_ITEM_TYPE_ETH, 1764 RTE_FLOW_ITEM_TYPE_IPV6, 1765 RTE_FLOW_ITEM_TYPE_UDP, 1766 RTE_FLOW_ITEM_TYPE_AH, 1767 RTE_FLOW_ITEM_TYPE_END, 1768 }; 1769 enum rte_flow_item_type pattern_eth_ipv4_l2tp[] = { 1770 RTE_FLOW_ITEM_TYPE_ETH, 1771 RTE_FLOW_ITEM_TYPE_IPV4, 1772 RTE_FLOW_ITEM_TYPE_L2TPV3OIP, 1773 RTE_FLOW_ITEM_TYPE_END, 1774 }; 1775 enum rte_flow_item_type pattern_eth_ipv6_l2tp[] = { 1776 RTE_FLOW_ITEM_TYPE_ETH, 1777 RTE_FLOW_ITEM_TYPE_IPV6, 1778 RTE_FLOW_ITEM_TYPE_L2TPV3OIP, 1779 RTE_FLOW_ITEM_TYPE_END, 1780 }; 1781 enum rte_flow_item_type pattern_eth_ipv4_pfcp[] = { 1782 RTE_FLOW_ITEM_TYPE_ETH, 1783 RTE_FLOW_ITEM_TYPE_IPV4, 1784 RTE_FLOW_ITEM_TYPE_UDP, 1785 RTE_FLOW_ITEM_TYPE_PFCP, 1786 RTE_FLOW_ITEM_TYPE_END, 1787 }; 1788 enum rte_flow_item_type pattern_eth_ipv6_pfcp[] = { 1789 RTE_FLOW_ITEM_TYPE_ETH, 1790 RTE_FLOW_ITEM_TYPE_IPV6, 1791 RTE_FLOW_ITEM_TYPE_UDP, 1792 RTE_FLOW_ITEM_TYPE_PFCP, 1793 RTE_FLOW_ITEM_TYPE_END, 1794 }; 1795 1796 typedef bool (*parse_engine_t)(struct ice_adapter *ad, 1797 struct rte_flow *flow, 1798 struct ice_flow_parser *parser, 1799 uint32_t priority, 1800 const struct rte_flow_item pattern[], 1801 const struct rte_flow_action actions[], 1802 struct rte_flow_error *error); 1803 1804 void 1805 ice_register_flow_engine(struct ice_flow_engine *engine) 1806 { 1807 TAILQ_INSERT_TAIL(&engine_list, engine, node); 1808 } 1809 1810 int 1811 ice_flow_init(struct ice_adapter *ad) 1812 { 1813 int ret; 1814 struct ice_pf *pf = &ad->pf; 1815 void *temp; 1816 struct ice_flow_engine *engine; 1817 1818 TAILQ_INIT(&pf->flow_list); 1819 rte_spinlock_init(&pf->flow_ops_lock); 1820 1821 if (ice_parser_create(&ad->hw, &ad->psr) != ICE_SUCCESS) 1822 PMD_INIT_LOG(WARNING, "Failed to initialize DDP parser, raw packet filter will not be supported"); 1823 1824 if (ad->psr) { 1825 if (ice_is_dvm_ena(&ad->hw)) 1826 ice_parser_dvm_set(ad->psr, true); 1827 else 1828 ice_parser_dvm_set(ad->psr, false); 1829 } 1830 1831 RTE_TAILQ_FOREACH_SAFE(engine, &engine_list, node, temp) { 1832 if (engine->init == NULL) { 1833 PMD_INIT_LOG(ERR, "Invalid engine type (%d)", 1834 engine->type); 1835 return -ENOTSUP; 1836 } 1837 1838 if (ICE_FLOW_ENGINE_DISABLED(ad->disabled_engine_mask, engine->type)) { 1839 PMD_INIT_LOG(INFO, "Engine %d disabled", engine->type); 1840 continue; 1841 } 1842 1843 ret = engine->init(ad); 1844 if (ret) { 1845 PMD_INIT_LOG(ERR, "Failed to initialize engine %d", 1846 engine->type); 1847 return ret; 1848 } 1849 } 1850 return 0; 1851 } 1852 1853 void 1854 ice_flow_uninit(struct ice_adapter *ad) 1855 { 1856 struct ice_pf *pf = &ad->pf; 1857 struct ice_flow_engine *engine; 1858 struct rte_flow *p_flow; 1859 void *temp; 1860 1861 RTE_TAILQ_FOREACH_SAFE(engine, &engine_list, node, temp) { 1862 if (ICE_FLOW_ENGINE_DISABLED(ad->disabled_engine_mask, engine->type)) { 1863 PMD_DRV_LOG(DEBUG, "Engine %d disabled skip it", engine->type); 1864 continue; 1865 } 1866 1867 if (engine->uninit) 1868 engine->uninit(ad); 1869 } 1870 1871 /* Remove all flows */ 1872 while ((p_flow = TAILQ_FIRST(&pf->flow_list))) { 1873 TAILQ_REMOVE(&pf->flow_list, p_flow, node); 1874 if (p_flow->engine->free) 1875 p_flow->engine->free(p_flow); 1876 rte_free(p_flow); 1877 } 1878 1879 if (ad->psr != NULL) { 1880 ice_parser_destroy(ad->psr); 1881 ad->psr = NULL; 1882 } 1883 } 1884 1885 static int 1886 ice_flow_valid_attr(const struct rte_flow_attr *attr, 1887 struct rte_flow_error *error) 1888 { 1889 /* Must be input direction */ 1890 if (!attr->ingress) { 1891 rte_flow_error_set(error, EINVAL, 1892 RTE_FLOW_ERROR_TYPE_ATTR_INGRESS, 1893 attr, "Only support ingress."); 1894 return -rte_errno; 1895 } 1896 1897 /* Not supported */ 1898 if (attr->egress) { 1899 rte_flow_error_set(error, EINVAL, 1900 RTE_FLOW_ERROR_TYPE_ATTR_EGRESS, 1901 attr, "Not support egress."); 1902 return -rte_errno; 1903 } 1904 1905 /* Not supported */ 1906 if (attr->transfer) { 1907 rte_flow_error_set(error, EINVAL, 1908 RTE_FLOW_ERROR_TYPE_ATTR_TRANSFER, 1909 attr, "Not support transfer."); 1910 return -rte_errno; 1911 } 1912 1913 if (attr->priority > 1) { 1914 rte_flow_error_set(error, EINVAL, 1915 RTE_FLOW_ERROR_TYPE_ATTR_PRIORITY, 1916 attr, "Only support priority 0 and 1."); 1917 return -rte_errno; 1918 } 1919 1920 return 0; 1921 } 1922 1923 /* Find the first VOID or non-VOID item pointer */ 1924 static const struct rte_flow_item * 1925 ice_find_first_item(const struct rte_flow_item *item, bool is_void) 1926 { 1927 bool is_find; 1928 1929 while (item->type != RTE_FLOW_ITEM_TYPE_END) { 1930 if (is_void) 1931 is_find = item->type == RTE_FLOW_ITEM_TYPE_VOID; 1932 else 1933 is_find = item->type != RTE_FLOW_ITEM_TYPE_VOID; 1934 if (is_find) 1935 break; 1936 item++; 1937 } 1938 return item; 1939 } 1940 1941 /* Skip all VOID items of the pattern */ 1942 static void 1943 ice_pattern_skip_void_item(struct rte_flow_item *items, 1944 const struct rte_flow_item *pattern) 1945 { 1946 uint32_t cpy_count = 0; 1947 const struct rte_flow_item *pb = pattern, *pe = pattern; 1948 1949 for (;;) { 1950 /* Find a non-void item first */ 1951 pb = ice_find_first_item(pb, false); 1952 if (pb->type == RTE_FLOW_ITEM_TYPE_END) { 1953 pe = pb; 1954 break; 1955 } 1956 1957 /* Find a void item */ 1958 pe = ice_find_first_item(pb + 1, true); 1959 1960 cpy_count = pe - pb; 1961 rte_memcpy(items, pb, sizeof(struct rte_flow_item) * cpy_count); 1962 1963 items += cpy_count; 1964 1965 if (pe->type == RTE_FLOW_ITEM_TYPE_END) { 1966 break; 1967 } 1968 1969 pb = pe + 1; 1970 } 1971 /* Copy the END item. */ 1972 rte_memcpy(items, pe, sizeof(struct rte_flow_item)); 1973 } 1974 1975 /* Check if the pattern matches a supported item type array */ 1976 static bool 1977 ice_match_pattern(enum rte_flow_item_type *item_array, 1978 const struct rte_flow_item *pattern) 1979 { 1980 const struct rte_flow_item *item = pattern; 1981 1982 while ((*item_array == item->type) && 1983 (*item_array != RTE_FLOW_ITEM_TYPE_END)) { 1984 item_array++; 1985 item++; 1986 } 1987 1988 return (*item_array == RTE_FLOW_ITEM_TYPE_END && 1989 item->type == RTE_FLOW_ITEM_TYPE_END); 1990 } 1991 1992 struct ice_ptype_match { 1993 enum rte_flow_item_type *pattern_list; 1994 uint16_t hw_ptype; 1995 }; 1996 1997 static struct ice_ptype_match ice_ptype_map[] = { 1998 {pattern_raw, ICE_PTYPE_IPV4_PAY}, 1999 {pattern_any, ICE_PTYPE_IPV4_PAY}, 2000 {pattern_eth_ipv4, ICE_PTYPE_IPV4_PAY}, 2001 {pattern_eth_ipv4_udp, ICE_PTYPE_IPV4_UDP_PAY}, 2002 {pattern_eth_ipv4_tcp, ICE_PTYPE_IPV4_TCP_PAY}, 2003 {pattern_eth_ipv4_sctp, ICE_PTYPE_IPV4_SCTP_PAY}, 2004 {pattern_eth_ipv4_gtpu, ICE_MAC_IPV4_GTPU}, 2005 {pattern_eth_ipv4_gtpu_eh, ICE_MAC_IPV4_GTPU}, 2006 {pattern_eth_ipv4_gtpu_ipv4, ICE_MAC_IPV4_GTPU_IPV4_PAY}, 2007 {pattern_eth_ipv4_gtpu_ipv4_udp, ICE_MAC_IPV4_GTPU_IPV4_UDP_PAY}, 2008 {pattern_eth_ipv4_gtpu_ipv4_tcp, ICE_MAC_IPV4_GTPU_IPV4_TCP}, 2009 {pattern_eth_ipv4_gtpu_ipv6, ICE_MAC_IPV4_GTPU_IPV6_PAY}, 2010 {pattern_eth_ipv4_gtpu_ipv6_udp, ICE_MAC_IPV4_GTPU_IPV6_UDP_PAY}, 2011 {pattern_eth_ipv4_gtpu_ipv6_tcp, ICE_MAC_IPV4_GTPU_IPV6_TCP}, 2012 {pattern_eth_ipv4_gtpu_eh_ipv4, ICE_MAC_IPV4_GTPU_IPV4_PAY}, 2013 {pattern_eth_ipv4_gtpu_eh_ipv4_udp, ICE_MAC_IPV4_GTPU_IPV4_UDP_PAY}, 2014 {pattern_eth_ipv4_gtpu_eh_ipv4_tcp, ICE_MAC_IPV4_GTPU_IPV4_TCP}, 2015 {pattern_eth_ipv4_gtpu_eh_ipv6, ICE_MAC_IPV4_GTPU_IPV6_PAY}, 2016 {pattern_eth_ipv4_gtpu_eh_ipv6_udp, ICE_MAC_IPV4_GTPU_IPV6_UDP_PAY}, 2017 {pattern_eth_ipv4_gtpu_eh_ipv6_tcp, ICE_MAC_IPV4_GTPU_IPV6_TCP}, 2018 {pattern_eth_ipv4_esp, ICE_MAC_IPV4_ESP}, 2019 {pattern_eth_ipv4_udp_esp, ICE_MAC_IPV4_NAT_T_ESP}, 2020 {pattern_eth_ipv4_ah, ICE_MAC_IPV4_AH}, 2021 {pattern_eth_ipv4_l2tp, ICE_MAC_IPV4_L2TPV3}, 2022 {pattern_eth_ipv4_pfcp, ICE_MAC_IPV4_PFCP_SESSION}, 2023 {pattern_eth_ipv6, ICE_PTYPE_IPV6_PAY}, 2024 {pattern_eth_ipv6_udp, ICE_PTYPE_IPV6_UDP_PAY}, 2025 {pattern_eth_ipv6_tcp, ICE_PTYPE_IPV6_TCP_PAY}, 2026 {pattern_eth_ipv6_sctp, ICE_PTYPE_IPV6_SCTP_PAY}, 2027 {pattern_eth_ipv6_frag_ext, ICE_PTYPE_IPV6FRAG_PAY}, 2028 {pattern_eth_ipv6_gtpu, ICE_MAC_IPV6_GTPU}, 2029 {pattern_eth_ipv6_gtpu_eh, ICE_MAC_IPV6_GTPU}, 2030 {pattern_eth_ipv6_gtpu_ipv4, ICE_MAC_IPV6_GTPU_IPV4_PAY}, 2031 {pattern_eth_ipv6_gtpu_ipv4_udp, ICE_MAC_IPV6_GTPU_IPV4_UDP_PAY}, 2032 {pattern_eth_ipv6_gtpu_ipv4_tcp, ICE_MAC_IPV6_GTPU_IPV4_TCP}, 2033 {pattern_eth_ipv6_gtpu_ipv6, ICE_MAC_IPV6_GTPU_IPV6_PAY}, 2034 {pattern_eth_ipv6_gtpu_ipv6_udp, ICE_MAC_IPV6_GTPU_IPV6_UDP_PAY}, 2035 {pattern_eth_ipv6_gtpu_ipv6_tcp, ICE_MAC_IPV6_GTPU_IPV6_TCP}, 2036 {pattern_eth_ipv6_gtpu_eh_ipv4, ICE_MAC_IPV6_GTPU_IPV4_PAY}, 2037 {pattern_eth_ipv6_gtpu_eh_ipv4_udp, ICE_MAC_IPV6_GTPU_IPV4_UDP_PAY}, 2038 {pattern_eth_ipv6_gtpu_eh_ipv4_tcp, ICE_MAC_IPV6_GTPU_IPV4_TCP}, 2039 {pattern_eth_ipv6_gtpu_eh_ipv6, ICE_MAC_IPV6_GTPU_IPV6_PAY}, 2040 {pattern_eth_ipv6_gtpu_eh_ipv6_udp, ICE_MAC_IPV6_GTPU_IPV6_UDP_PAY}, 2041 {pattern_eth_ipv6_gtpu_eh_ipv6_tcp, ICE_MAC_IPV6_GTPU_IPV6_TCP}, 2042 {pattern_eth_ipv6_esp, ICE_MAC_IPV6_ESP}, 2043 {pattern_eth_ipv6_udp_esp, ICE_MAC_IPV6_NAT_T_ESP}, 2044 {pattern_eth_ipv6_ah, ICE_MAC_IPV6_AH}, 2045 {pattern_eth_ipv6_l2tp, ICE_MAC_IPV6_L2TPV3}, 2046 {pattern_eth_ipv6_pfcp, ICE_MAC_IPV6_PFCP_SESSION}, 2047 {pattern_ethertype, ICE_PTYPE_MAC_PAY}, 2048 {pattern_ethertype_vlan, ICE_PTYPE_MAC_PAY}, 2049 {pattern_ethertype_qinq, ICE_PTYPE_MAC_PAY}, 2050 {pattern_eth_arp, ICE_PTYPE_MAC_PAY}, 2051 {pattern_eth_vlan_ipv4, ICE_PTYPE_IPV4_PAY}, 2052 {pattern_eth_qinq_ipv4, ICE_PTYPE_IPV4_PAY}, 2053 {pattern_eth_qinq_ipv4_udp, ICE_PTYPE_IPV4_UDP_PAY}, 2054 {pattern_eth_qinq_ipv4_tcp, ICE_PTYPE_IPV4_TCP_PAY}, 2055 {pattern_eth_vlan_ipv4_udp, ICE_PTYPE_IPV4_UDP_PAY}, 2056 {pattern_eth_vlan_ipv4_tcp, ICE_PTYPE_IPV4_TCP_PAY}, 2057 {pattern_eth_vlan_ipv4_sctp, ICE_PTYPE_IPV4_SCTP_PAY}, 2058 {pattern_eth_vlan_ipv6, ICE_PTYPE_IPV6_PAY}, 2059 {pattern_eth_qinq_ipv6, ICE_PTYPE_IPV6_PAY}, 2060 {pattern_eth_qinq_ipv6_udp, ICE_PTYPE_IPV6_UDP_PAY}, 2061 {pattern_eth_qinq_ipv6_tcp, ICE_PTYPE_IPV6_TCP_PAY}, 2062 {pattern_eth_vlan_ipv6_udp, ICE_PTYPE_IPV6_UDP_PAY}, 2063 {pattern_eth_vlan_ipv6_tcp, ICE_PTYPE_IPV6_TCP_PAY}, 2064 {pattern_eth_vlan_ipv6_sctp, ICE_PTYPE_IPV6_SCTP_PAY}, 2065 {pattern_eth_pppoes, ICE_MAC_PPPOE_PAY}, 2066 {pattern_eth_vlan_pppoes, ICE_MAC_PPPOE_PAY}, 2067 {pattern_eth_qinq_pppoes, ICE_MAC_PPPOE_PAY}, 2068 {pattern_eth_pppoes_proto, ICE_MAC_PPPOE_PAY}, 2069 {pattern_eth_vlan_pppoes_proto, ICE_MAC_PPPOE_PAY}, 2070 {pattern_eth_qinq_pppoes_proto, ICE_MAC_PPPOE_PAY}, 2071 {pattern_eth_pppoes_ipv4, ICE_MAC_PPPOE_IPV4_PAY}, 2072 {pattern_eth_pppoes_ipv4_udp, ICE_MAC_PPPOE_IPV4_UDP_PAY}, 2073 {pattern_eth_pppoes_ipv4_tcp, ICE_MAC_PPPOE_IPV4_TCP}, 2074 {pattern_eth_vlan_pppoes_ipv4, ICE_MAC_PPPOE_IPV4_PAY}, 2075 {pattern_eth_qinq_pppoes_ipv4, ICE_MAC_PPPOE_IPV4_PAY}, 2076 {pattern_eth_vlan_pppoes_ipv4_tcp, ICE_MAC_PPPOE_IPV4_TCP}, 2077 {pattern_eth_vlan_pppoes_ipv4_udp, ICE_MAC_PPPOE_IPV4_UDP_PAY}, 2078 {pattern_eth_pppoes_ipv6, ICE_MAC_PPPOE_IPV6_PAY}, 2079 {pattern_eth_pppoes_ipv6_udp, ICE_MAC_PPPOE_IPV6_UDP_PAY}, 2080 {pattern_eth_pppoes_ipv6_tcp, ICE_MAC_PPPOE_IPV6_TCP}, 2081 {pattern_eth_vlan_pppoes_ipv6, ICE_MAC_PPPOE_IPV6_PAY}, 2082 {pattern_eth_qinq_pppoes_ipv6, ICE_MAC_PPPOE_IPV6_PAY}, 2083 {pattern_eth_vlan_pppoes_ipv6_tcp, ICE_MAC_PPPOE_IPV6_TCP}, 2084 {pattern_eth_vlan_pppoes_ipv6_udp, ICE_MAC_PPPOE_IPV6_UDP_PAY}, 2085 {pattern_eth_ipv4_udp_vxlan_ipv4, ICE_MAC_IPV4_TUN_IPV4_PAY}, 2086 {pattern_eth_ipv4_udp_vxlan_ipv4_udp, ICE_MAC_IPV4_TUN_IPV4_UDP_PAY}, 2087 {pattern_eth_ipv4_udp_vxlan_ipv4_tcp, ICE_MAC_IPV4_TUN_IPV4_TCP}, 2088 {pattern_eth_ipv4_udp_vxlan_ipv4_sctp, ICE_MAC_IPV4_TUN_IPV4_SCTP}, 2089 {pattern_eth_ipv4_udp_vxlan_eth_ipv4, ICE_MAC_IPV4_TUN_IPV4_PAY}, 2090 {pattern_eth_ipv4_udp_vxlan_eth_ipv4_udp, ICE_MAC_IPV4_TUN_IPV4_UDP_PAY}, 2091 {pattern_eth_ipv4_udp_vxlan_eth_ipv4_tcp, ICE_MAC_IPV4_TUN_IPV4_TCP}, 2092 {pattern_eth_ipv4_udp_vxlan_eth_ipv4_sctp, ICE_MAC_IPV4_TUN_IPV4_SCTP}, 2093 {pattern_eth_ipv4_nvgre_eth_ipv4, ICE_MAC_IPV4_TUN_IPV4_PAY}, 2094 {pattern_eth_ipv4_nvgre_eth_ipv4_udp, ICE_MAC_IPV4_TUN_IPV4_UDP_PAY}, 2095 {pattern_eth_ipv4_nvgre_eth_ipv4_tcp, ICE_MAC_IPV4_TUN_IPV4_TCP}, 2096 {pattern_empty, 0}, 2097 }; 2098 2099 static bool 2100 ice_pattern_is_supported(__rte_unused struct ice_adapter *ad, 2101 const struct rte_flow_item *pattern) 2102 { 2103 uint16_t i; 2104 2105 for (i = 0; i < RTE_DIM(ice_ptype_map); i++) { 2106 if (ice_match_pattern(ice_ptype_map[i].pattern_list, 2107 pattern)) { 2108 return ice_hw_ptype_ena(&ad->hw, 2109 ice_ptype_map[i].hw_ptype); 2110 } 2111 } 2112 2113 return false; 2114 } 2115 2116 struct ice_pattern_match_item * 2117 ice_search_pattern_match_item(struct ice_adapter *ad, 2118 const struct rte_flow_item pattern[], 2119 struct ice_pattern_match_item *array, 2120 uint32_t array_len, 2121 struct rte_flow_error *error) 2122 { 2123 struct ice_pattern_match_item *pattern_match_item; 2124 /* need free by each filter */ 2125 struct rte_flow_item *items; /* used for pattern without VOID items */ 2126 uint32_t item_num = 0; /* non-void item number */ 2127 uint16_t i = 0; 2128 2129 /* Get the non-void item number of pattern */ 2130 while ((pattern + i)->type != RTE_FLOW_ITEM_TYPE_END) { 2131 if ((pattern + i)->type != RTE_FLOW_ITEM_TYPE_VOID) 2132 item_num++; 2133 i++; 2134 } 2135 item_num++; 2136 2137 items = rte_zmalloc("ice_pattern", 2138 item_num * sizeof(struct rte_flow_item), 0); 2139 if (!items) { 2140 rte_flow_error_set(error, ENOMEM, RTE_FLOW_ERROR_TYPE_ITEM_NUM, 2141 NULL, "No memory for PMD internal items."); 2142 return NULL; 2143 } 2144 pattern_match_item = rte_zmalloc("ice_pattern_match_item", 2145 sizeof(struct ice_pattern_match_item), 0); 2146 if (!pattern_match_item) { 2147 rte_flow_error_set(error, ENOMEM, RTE_FLOW_ERROR_TYPE_HANDLE, 2148 NULL, "Failed to allocate memory."); 2149 rte_free(items); 2150 return NULL; 2151 } 2152 2153 ice_pattern_skip_void_item(items, pattern); 2154 2155 if (!ice_pattern_is_supported(ad, pattern)) 2156 goto unsupported; 2157 2158 for (i = 0; i < array_len; i++) { 2159 if (ice_match_pattern(array[i].pattern_list, 2160 items)) { 2161 pattern_match_item->input_set_mask_o = 2162 array[i].input_set_mask_o; 2163 pattern_match_item->input_set_mask_i = 2164 array[i].input_set_mask_i; 2165 pattern_match_item->pattern_list = 2166 array[i].pattern_list; 2167 pattern_match_item->meta = array[i].meta; 2168 rte_free(items); 2169 return pattern_match_item; 2170 } 2171 } 2172 2173 unsupported: 2174 rte_flow_error_set(error, EINVAL, RTE_FLOW_ERROR_TYPE_ITEM, 2175 pattern, "Unsupported pattern"); 2176 rte_free(items); 2177 rte_free(pattern_match_item); 2178 return NULL; 2179 } 2180 2181 static bool 2182 ice_parse_engine_create(struct ice_adapter *ad, 2183 struct rte_flow *flow, 2184 struct ice_flow_parser *parser, 2185 uint32_t priority, 2186 const struct rte_flow_item pattern[], 2187 const struct rte_flow_action actions[], 2188 struct rte_flow_error *error) 2189 { 2190 void *meta = NULL; 2191 2192 if (ICE_FLOW_ENGINE_DISABLED(ad->disabled_engine_mask, 2193 parser->engine->type)) { 2194 rte_flow_error_set(error, EINVAL, 2195 RTE_FLOW_ERROR_TYPE_UNSPECIFIED, 2196 NULL, "engine is not enabled."); 2197 return false; 2198 } 2199 2200 if (parser->parse_pattern_action(ad, 2201 parser->array, 2202 parser->array_len, 2203 pattern, actions, priority, &meta, error) < 0) 2204 return false; 2205 2206 RTE_ASSERT(parser->engine->create != NULL); 2207 2208 return parser->engine->create(ad, flow, meta, error) == 0; 2209 } 2210 2211 static bool 2212 ice_parse_engine_validate(struct ice_adapter *ad, 2213 struct rte_flow *flow __rte_unused, 2214 struct ice_flow_parser *parser, 2215 uint32_t priority, 2216 const struct rte_flow_item pattern[], 2217 const struct rte_flow_action actions[], 2218 struct rte_flow_error *error) 2219 { 2220 2221 if (ICE_FLOW_ENGINE_DISABLED(ad->disabled_engine_mask, 2222 parser->engine->type)) { 2223 rte_flow_error_set(error, EINVAL, 2224 RTE_FLOW_ERROR_TYPE_UNSPECIFIED, 2225 NULL, "engine is not enabled."); 2226 return false; 2227 } 2228 2229 return parser->parse_pattern_action(ad, 2230 parser->array, 2231 parser->array_len, 2232 pattern, actions, priority, 2233 NULL, error) >= 0; 2234 } 2235 2236 static struct ice_flow_parser *get_flow_parser(uint32_t group) 2237 { 2238 switch (group) { 2239 case 0: 2240 return &ice_switch_parser; 2241 case 1: 2242 return &ice_acl_parser; 2243 case 2: 2244 return &ice_fdir_parser; 2245 default: 2246 return NULL; 2247 } 2248 } 2249 2250 static int 2251 ice_flow_process_filter(struct rte_eth_dev *dev, 2252 struct rte_flow *flow, 2253 const struct rte_flow_attr *attr, 2254 const struct rte_flow_item pattern[], 2255 const struct rte_flow_action actions[], 2256 struct ice_flow_engine **engine, 2257 parse_engine_t ice_parse_engine, 2258 struct rte_flow_error *error) 2259 { 2260 int ret = ICE_ERR_NOT_SUPPORTED; 2261 struct ice_adapter *ad = 2262 ICE_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private); 2263 struct ice_flow_parser *parser; 2264 2265 if (!pattern) { 2266 rte_flow_error_set(error, EINVAL, RTE_FLOW_ERROR_TYPE_ITEM_NUM, 2267 NULL, "NULL pattern."); 2268 return -rte_errno; 2269 } 2270 2271 if (!actions || actions->type == RTE_FLOW_ACTION_TYPE_END) { 2272 rte_flow_error_set(error, EINVAL, 2273 RTE_FLOW_ERROR_TYPE_ACTION_NUM, 2274 NULL, "NULL action."); 2275 return -rte_errno; 2276 } 2277 2278 if (!attr) { 2279 rte_flow_error_set(error, EINVAL, 2280 RTE_FLOW_ERROR_TYPE_ATTR, 2281 NULL, "NULL attribute."); 2282 return -rte_errno; 2283 } 2284 2285 ret = ice_flow_valid_attr(attr, error); 2286 if (ret) 2287 return ret; 2288 2289 *engine = NULL; 2290 /* always try hash engine first */ 2291 if (ice_parse_engine(ad, flow, &ice_hash_parser, 2292 attr->priority, pattern, 2293 actions, error)) { 2294 *engine = ice_hash_parser.engine; 2295 return 0; 2296 } 2297 2298 parser = get_flow_parser(attr->group); 2299 if (parser == NULL) { 2300 rte_flow_error_set(error, EINVAL, 2301 RTE_FLOW_ERROR_TYPE_ATTR, 2302 NULL, "NULL attribute."); 2303 return -rte_errno; 2304 } 2305 2306 if (ice_parse_engine(ad, flow, parser, attr->priority, 2307 pattern, actions, error)) { 2308 *engine = parser->engine; 2309 return 0; 2310 } else { 2311 return -rte_errno; 2312 } 2313 } 2314 2315 static int 2316 ice_flow_validate(struct rte_eth_dev *dev, 2317 const struct rte_flow_attr *attr, 2318 const struct rte_flow_item pattern[], 2319 const struct rte_flow_action actions[], 2320 struct rte_flow_error *error) 2321 { 2322 struct ice_flow_engine *engine; 2323 2324 return ice_flow_process_filter(dev, NULL, attr, pattern, actions, 2325 &engine, ice_parse_engine_validate, error); 2326 } 2327 2328 static struct rte_flow * 2329 ice_flow_create(struct rte_eth_dev *dev, 2330 const struct rte_flow_attr *attr, 2331 const struct rte_flow_item pattern[], 2332 const struct rte_flow_action actions[], 2333 struct rte_flow_error *error) 2334 { 2335 struct ice_pf *pf = ICE_DEV_PRIVATE_TO_PF(dev->data->dev_private); 2336 struct rte_flow *flow = NULL; 2337 int ret; 2338 struct ice_flow_engine *engine = NULL; 2339 2340 flow = rte_zmalloc("ice_flow", sizeof(struct rte_flow), 0); 2341 if (!flow) { 2342 rte_flow_error_set(error, ENOMEM, 2343 RTE_FLOW_ERROR_TYPE_HANDLE, NULL, 2344 "Failed to allocate memory"); 2345 return flow; 2346 } 2347 2348 rte_spinlock_lock(&pf->flow_ops_lock); 2349 2350 ret = ice_flow_process_filter(dev, flow, attr, pattern, actions, 2351 &engine, ice_parse_engine_create, error); 2352 if (ret < 0) { 2353 PMD_DRV_LOG(ERR, "Failed to create flow"); 2354 rte_free(flow); 2355 flow = NULL; 2356 goto out; 2357 } 2358 2359 flow->engine = engine; 2360 TAILQ_INSERT_TAIL(&pf->flow_list, flow, node); 2361 PMD_DRV_LOG(INFO, "Succeeded to create (%d) flow", engine->type); 2362 2363 out: 2364 rte_spinlock_unlock(&pf->flow_ops_lock); 2365 return flow; 2366 } 2367 2368 static int 2369 ice_flow_destroy(struct rte_eth_dev *dev, 2370 struct rte_flow *flow, 2371 struct rte_flow_error *error) 2372 { 2373 struct ice_pf *pf = ICE_DEV_PRIVATE_TO_PF(dev->data->dev_private); 2374 struct ice_adapter *ad = 2375 ICE_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private); 2376 int ret = 0; 2377 2378 if (!flow || !flow->engine || !flow->engine->destroy) { 2379 rte_flow_error_set(error, EINVAL, 2380 RTE_FLOW_ERROR_TYPE_HANDLE, 2381 NULL, "Invalid flow"); 2382 return -rte_errno; 2383 } 2384 2385 rte_spinlock_lock(&pf->flow_ops_lock); 2386 2387 ret = flow->engine->destroy(ad, flow, error); 2388 if (!ret) { 2389 TAILQ_REMOVE(&pf->flow_list, flow, node); 2390 rte_free(flow); 2391 } else { 2392 PMD_DRV_LOG(ERR, "Failed to destroy flow"); 2393 } 2394 2395 rte_spinlock_unlock(&pf->flow_ops_lock); 2396 2397 return ret; 2398 } 2399 2400 static int 2401 ice_flow_flush(struct rte_eth_dev *dev, 2402 struct rte_flow_error *error) 2403 { 2404 struct ice_pf *pf = ICE_DEV_PRIVATE_TO_PF(dev->data->dev_private); 2405 struct rte_flow *p_flow; 2406 void *temp; 2407 int ret = 0; 2408 2409 RTE_TAILQ_FOREACH_SAFE(p_flow, &pf->flow_list, node, temp) { 2410 ret = ice_flow_destroy(dev, p_flow, error); 2411 if (ret) { 2412 PMD_DRV_LOG(ERR, "Failed to flush flows"); 2413 if (ret != -EAGAIN) 2414 ret = -EINVAL; 2415 return ret; 2416 } 2417 } 2418 2419 return ret; 2420 } 2421 2422 static int 2423 ice_flow_query(struct rte_eth_dev *dev, 2424 struct rte_flow *flow, 2425 const struct rte_flow_action *actions, 2426 void *data, 2427 struct rte_flow_error *error) 2428 { 2429 int ret = -EINVAL; 2430 struct ice_adapter *ad = 2431 ICE_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private); 2432 struct rte_flow_query_count *count = data; 2433 struct ice_pf *pf = &ad->pf; 2434 2435 if (!flow || !flow->engine || !flow->engine->query_count) { 2436 rte_flow_error_set(error, EINVAL, 2437 RTE_FLOW_ERROR_TYPE_HANDLE, 2438 NULL, "Invalid flow"); 2439 return -rte_errno; 2440 } 2441 2442 rte_spinlock_lock(&pf->flow_ops_lock); 2443 2444 for (; actions->type != RTE_FLOW_ACTION_TYPE_END; actions++) { 2445 switch (actions->type) { 2446 case RTE_FLOW_ACTION_TYPE_VOID: 2447 break; 2448 case RTE_FLOW_ACTION_TYPE_COUNT: 2449 ret = flow->engine->query_count(ad, flow, count, error); 2450 break; 2451 default: 2452 ret = rte_flow_error_set(error, ENOTSUP, 2453 RTE_FLOW_ERROR_TYPE_ACTION, 2454 actions, 2455 "action not supported"); 2456 goto out; 2457 } 2458 } 2459 2460 out: 2461 rte_spinlock_unlock(&pf->flow_ops_lock); 2462 return ret; 2463 } 2464 2465 int 2466 ice_flow_redirect(struct ice_adapter *ad, 2467 struct ice_flow_redirect *rd) 2468 { 2469 struct ice_pf *pf = &ad->pf; 2470 struct rte_flow *p_flow; 2471 void *temp; 2472 int ret = 0; 2473 2474 rte_spinlock_lock(&pf->flow_ops_lock); 2475 2476 RTE_TAILQ_FOREACH_SAFE(p_flow, &pf->flow_list, node, temp) { 2477 if (!p_flow->engine->redirect) 2478 continue; 2479 ret = p_flow->engine->redirect(ad, p_flow, rd); 2480 if (ret) { 2481 PMD_DRV_LOG(ERR, "Failed to redirect flows"); 2482 break; 2483 } 2484 } 2485 2486 rte_spinlock_unlock(&pf->flow_ops_lock); 2487 2488 return ret; 2489 } 2490