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