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