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