7f89f41860
The order of flow filter parser list was not definite and
linked to the register order of parsers. It caused ACL filter
covered by switch filter in some cases.
This patch fixed order of parser list to guarantee the usage
of each filter. Below lists the order.
ACL filter > Switch filter > FDIR > Hash filter.
Fixes: e4a0a7599d
("net/ice: fix flow priority support in non-pipeline mode")
Cc: stable@dpdk.org
Signed-off-by: Yuying Zhang <yuying.zhang@intel.com>
Acked-by: Qi Zhang <qi.z.zhang@intel.com>
2593 lines
68 KiB
C
2593 lines
68 KiB
C
/* SPDX-License-Identifier: BSD-3-Clause
|
|
* Copyright(c) 2019 Intel Corporation
|
|
*/
|
|
|
|
#include <sys/queue.h>
|
|
#include <stdio.h>
|
|
#include <errno.h>
|
|
#include <stdint.h>
|
|
#include <string.h>
|
|
#include <unistd.h>
|
|
#include <stdarg.h>
|
|
|
|
#include <rte_ether.h>
|
|
#include <ethdev_driver.h>
|
|
#include <rte_malloc.h>
|
|
#include <rte_tailq.h>
|
|
|
|
#include "ice_ethdev.h"
|
|
#include "ice_generic_flow.h"
|
|
|
|
/**
|
|
* Non-pipeline mode, fdir and switch both used as distributor,
|
|
* fdir used first, switch used as fdir's backup.
|
|
*/
|
|
#define ICE_FLOW_CLASSIFY_STAGE_DISTRIBUTOR_ONLY 0
|
|
/*Pipeline mode, switch used at permission stage*/
|
|
#define ICE_FLOW_CLASSIFY_STAGE_PERMISSION 1
|
|
/*Pipeline mode, fdir used at distributor stage*/
|
|
#define ICE_FLOW_CLASSIFY_STAGE_DISTRIBUTOR 2
|
|
|
|
static struct ice_engine_list engine_list =
|
|
TAILQ_HEAD_INITIALIZER(engine_list);
|
|
|
|
static int ice_flow_validate(struct rte_eth_dev *dev,
|
|
const struct rte_flow_attr *attr,
|
|
const struct rte_flow_item pattern[],
|
|
const struct rte_flow_action actions[],
|
|
struct rte_flow_error *error);
|
|
static struct rte_flow *ice_flow_create(struct rte_eth_dev *dev,
|
|
const struct rte_flow_attr *attr,
|
|
const struct rte_flow_item pattern[],
|
|
const struct rte_flow_action actions[],
|
|
struct rte_flow_error *error);
|
|
static int ice_flow_destroy(struct rte_eth_dev *dev,
|
|
struct rte_flow *flow,
|
|
struct rte_flow_error *error);
|
|
static int ice_flow_flush(struct rte_eth_dev *dev,
|
|
struct rte_flow_error *error);
|
|
static int ice_flow_query(struct rte_eth_dev *dev,
|
|
struct rte_flow *flow,
|
|
const struct rte_flow_action *actions,
|
|
void *data,
|
|
struct rte_flow_error *error);
|
|
|
|
const struct rte_flow_ops ice_flow_ops = {
|
|
.validate = ice_flow_validate,
|
|
.create = ice_flow_create,
|
|
.destroy = ice_flow_destroy,
|
|
.flush = ice_flow_flush,
|
|
.query = ice_flow_query,
|
|
};
|
|
|
|
/* empty */
|
|
enum rte_flow_item_type pattern_empty[] = {
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
/* raw */
|
|
enum rte_flow_item_type pattern_raw[] = {
|
|
RTE_FLOW_ITEM_TYPE_RAW,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
/* L2 */
|
|
enum rte_flow_item_type pattern_ethertype[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_ethertype_vlan[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_VLAN,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_ethertype_qinq[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_VLAN,
|
|
RTE_FLOW_ITEM_TYPE_VLAN,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
/* ARP */
|
|
enum rte_flow_item_type pattern_eth_arp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_ARP_ETH_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
/* non-tunnel IPv4 */
|
|
enum rte_flow_item_type pattern_eth_ipv4[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_vlan_ipv4[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_VLAN,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_qinq_ipv4[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_VLAN,
|
|
RTE_FLOW_ITEM_TYPE_VLAN,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_ipv4_udp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_vlan_ipv4_udp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_VLAN,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_qinq_ipv4_udp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_VLAN,
|
|
RTE_FLOW_ITEM_TYPE_VLAN,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_ipv4_tcp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_TCP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_vlan_ipv4_tcp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_VLAN,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_TCP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_qinq_ipv4_tcp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_VLAN,
|
|
RTE_FLOW_ITEM_TYPE_VLAN,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_TCP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_ipv4_sctp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_SCTP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_vlan_ipv4_sctp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_VLAN,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_SCTP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_qinq_ipv4_sctp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_VLAN,
|
|
RTE_FLOW_ITEM_TYPE_VLAN,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_SCTP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_ipv4_icmp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_ICMP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_vlan_ipv4_icmp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_VLAN,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_ICMP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_qinq_ipv4_icmp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_VLAN,
|
|
RTE_FLOW_ITEM_TYPE_VLAN,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_ICMP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
/* non-tunnel IPv6 */
|
|
enum rte_flow_item_type pattern_eth_ipv6[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_vlan_ipv6[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_VLAN,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_qinq_ipv6[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_VLAN,
|
|
RTE_FLOW_ITEM_TYPE_VLAN,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_ipv6_frag_ext[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_IPV6_FRAG_EXT,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_vlan_ipv6_frag_ext[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_VLAN,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_IPV6_FRAG_EXT,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_qinq_ipv6_frag_ext[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_VLAN,
|
|
RTE_FLOW_ITEM_TYPE_VLAN,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_IPV6_FRAG_EXT,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_ipv6_udp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_vlan_ipv6_udp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_VLAN,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_qinq_ipv6_udp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_VLAN,
|
|
RTE_FLOW_ITEM_TYPE_VLAN,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_ipv6_tcp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_TCP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_vlan_ipv6_tcp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_VLAN,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_TCP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_qinq_ipv6_tcp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_VLAN,
|
|
RTE_FLOW_ITEM_TYPE_VLAN,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_TCP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_ipv6_sctp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_SCTP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_vlan_ipv6_sctp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_VLAN,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_SCTP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_qinq_ipv6_sctp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_VLAN,
|
|
RTE_FLOW_ITEM_TYPE_VLAN,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_SCTP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_ipv6_icmp6[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_ICMP6,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_vlan_ipv6_icmp6[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_VLAN,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_ICMP6,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_qinq_ipv6_icmp6[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_VLAN,
|
|
RTE_FLOW_ITEM_TYPE_VLAN,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_ICMP6,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
/* IPv4 VXLAN IPv4 */
|
|
enum rte_flow_item_type pattern_eth_ipv4_udp_vxlan_ipv4[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_VXLAN,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_ipv4_udp_vxlan_ipv4_udp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_VXLAN,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_ipv4_udp_vxlan_ipv4_tcp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_VXLAN,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_TCP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_ipv4_udp_vxlan_ipv4_sctp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_VXLAN,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_SCTP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_ipv4_udp_vxlan_ipv4_icmp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_VXLAN,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_ICMP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
/* IPv4 VXLAN MAC IPv4 */
|
|
enum rte_flow_item_type pattern_eth_ipv4_udp_vxlan_eth_ipv4[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_VXLAN,
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_ipv4_udp_vxlan_eth_ipv4_udp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_VXLAN,
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_ipv4_udp_vxlan_eth_ipv4_tcp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_VXLAN,
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_TCP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_ipv4_udp_vxlan_eth_ipv4_sctp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_VXLAN,
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_SCTP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_ipv4_udp_vxlan_eth_ipv4_icmp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_VXLAN,
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_ICMP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
/* IPv6 VXLAN IPv4 */
|
|
enum rte_flow_item_type pattern_eth_ipv6_udp_vxlan_ipv4[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_VXLAN,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_ipv6_udp_vxlan_ipv4_tcp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_VXLAN,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_TCP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_ipv6_udp_vxlan_ipv4_udp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_VXLAN,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_ipv6_udp_vxlan_ipv4_sctp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_VXLAN,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_SCTP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_ipv6_udp_vxlan_ipv4_icmp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_VXLAN,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_ICMP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
/* IPv6 VXLAN MAC IPv4 */
|
|
enum rte_flow_item_type pattern_eth_ipv6_udp_vxlan_eth_ipv4[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_VXLAN,
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_ipv6_udp_vxlan_eth_ipv4_tcp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_VXLAN,
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_TCP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_ipv6_udp_vxlan_eth_ipv4_udp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_VXLAN,
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_ipv6_udp_vxlan_eth_ipv4_sctp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_VXLAN,
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_SCTP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_ipv6_udp_vxlan_eth_ipv4_icmp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_VXLAN,
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_ICMP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
/* IPv4 VXLAN IPv6 */
|
|
enum rte_flow_item_type pattern_eth_ipv4_udp_vxlan_ipv6[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_VXLAN,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_ipv4_udp_vxlan_ipv6_udp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_VXLAN,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_ipv4_udp_vxlan_ipv6_tcp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_VXLAN,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_TCP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_ipv4_udp_vxlan_ipv6_sctp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_VXLAN,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_SCTP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_ipv4_udp_vxlan_ipv6_icmp6[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_VXLAN,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_ICMP6,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
/* IPv4 VXLAN MAC IPv6 */
|
|
enum rte_flow_item_type pattern_eth_ipv4_udp_vxlan_eth_ipv6[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_VXLAN,
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_ipv4_udp_vxlan_eth_ipv6_udp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_VXLAN,
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_ipv4_udp_vxlan_eth_ipv6_tcp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_VXLAN,
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_TCP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_ipv4_udp_vxlan_eth_ipv6_sctp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_VXLAN,
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_SCTP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_ipv4_udp_vxlan_eth_ipv6_icmp6[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_VXLAN,
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_ICMP6,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
/* IPv6 VXLAN IPv6 */
|
|
enum rte_flow_item_type pattern_eth_ipv6_udp_vxlan_ipv6[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_VXLAN,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_ipv6_udp_vxlan_ipv6_tcp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_VXLAN,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_TCP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_ipv6_udp_vxlan_ipv6_udp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_VXLAN,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_ipv6_udp_vxlan_ipv6_sctp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_VXLAN,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_SCTP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_ipv6_udp_vxlan_ipv6_icmp6[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_VXLAN,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_ICMP6,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
/* IPv6 VXLAN MAC IPv6 */
|
|
enum rte_flow_item_type pattern_eth_ipv6_udp_vxlan_eth_ipv6[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_VXLAN,
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_ipv6_udp_vxlan_eth_ipv6_tcp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_VXLAN,
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_TCP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_ipv6_udp_vxlan_eth_ipv6_udp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_VXLAN,
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_ipv6_udp_vxlan_eth_ipv6_sctp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_VXLAN,
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_SCTP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_ipv6_udp_vxlan_eth_ipv6_icmp6[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_VXLAN,
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_ICMP6,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
/* IPv4 NVGRE IPv4 */
|
|
enum rte_flow_item_type pattern_eth_ipv4_nvgre_ipv4[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_NVGRE,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_ipv4_nvgre_ipv4_udp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_NVGRE,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_ipv4_nvgre_ipv4_tcp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_NVGRE,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_TCP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_ipv4_nvgre_ipv4_sctp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_NVGRE,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_SCTP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_ipv4_nvgre_ipv4_icmp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_NVGRE,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_ICMP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
/* IPv4 NVGRE MAC IPv4 */
|
|
enum rte_flow_item_type pattern_eth_ipv4_nvgre_eth_ipv4[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_NVGRE,
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_ipv4_nvgre_eth_ipv4_udp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_NVGRE,
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_ipv4_nvgre_eth_ipv4_tcp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_NVGRE,
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_TCP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_ipv4_nvgre_eth_ipv4_sctp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_NVGRE,
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_SCTP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_ipv4_nvgre_eth_ipv4_icmp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_NVGRE,
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_ICMP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
/* IPv6 NVGRE IPv4 */
|
|
enum rte_flow_item_type pattern_eth_ipv6_nvgre_ipv4[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_NVGRE,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_ipv6_nvgre_ipv4_tcp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_NVGRE,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_TCP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_ipv6_nvgre_ipv4_udp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_NVGRE,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_ipv6_nvgre_ipv4_sctp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_NVGRE,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_SCTP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_ipv6_nvgre_ipv4_icmp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_NVGRE,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_ICMP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
/* IPv6 NVGRE MAC IPv4 */
|
|
enum rte_flow_item_type pattern_eth_ipv6_nvgre_eth_ipv4[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_NVGRE,
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_ipv6_nvgre_eth_ipv4_tcp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_NVGRE,
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_TCP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_ipv6_nvgre_eth_ipv4_udp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_NVGRE,
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_ipv6_nvgre_eth_ipv4_sctp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_NVGRE,
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_SCTP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_ipv6_nvgre_eth_ipv4_icmp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_NVGRE,
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_ICMP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
/* IPv4 NVGRE IPv6 */
|
|
enum rte_flow_item_type pattern_eth_ipv4_nvgre_ipv6[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_NVGRE,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_ipv4_nvgre_ipv6_udp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_NVGRE,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_ipv4_nvgre_ipv6_tcp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_NVGRE,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_TCP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_ipv4_nvgre_ipv6_sctp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_NVGRE,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_SCTP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_ipv4_nvgre_ipv6_icmp6[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_NVGRE,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_ICMP6,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
/* IPv4 NVGRE MAC IPv6 */
|
|
enum rte_flow_item_type pattern_eth_ipv4_nvgre_eth_ipv6[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_NVGRE,
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_ipv4_nvgre_eth_ipv6_udp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_NVGRE,
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_ipv4_nvgre_eth_ipv6_tcp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_NVGRE,
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_TCP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_ipv4_nvgre_eth_ipv6_sctp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_NVGRE,
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_SCTP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_ipv4_nvgre_eth_ipv6_icmp6[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_NVGRE,
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_ICMP6,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
/* IPv6 NVGRE IPv6 */
|
|
enum rte_flow_item_type pattern_eth_ipv6_nvgre_ipv6[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_NVGRE,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_ipv6_nvgre_ipv6_tcp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_NVGRE,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_TCP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_ipv6_nvgre_ipv6_udp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_NVGRE,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_ipv6_nvgre_ipv6_sctp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_NVGRE,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_SCTP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_ipv6_nvgre_ipv6_icmp6[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_NVGRE,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_ICMP6,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
/* IPv6 NVGRE MAC IPv6 */
|
|
enum rte_flow_item_type pattern_eth_ipv6_nvgre_eth_ipv6[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_NVGRE,
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_ipv6_nvgre_eth_ipv6_tcp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_NVGRE,
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_TCP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_ipv6_nvgre_eth_ipv6_udp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_NVGRE,
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_ipv6_nvgre_eth_ipv6_sctp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_NVGRE,
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_SCTP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_ipv6_nvgre_eth_ipv6_icmp6[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_NVGRE,
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_ICMP6,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
/*IPv4 GTPU (EH) */
|
|
enum rte_flow_item_type pattern_eth_ipv4_gtpu[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_GTPU,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum rte_flow_item_type pattern_eth_ipv4_gtpu_eh[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_GTPU,
|
|
RTE_FLOW_ITEM_TYPE_GTP_PSC,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
/*IPv6 GTPU (EH) */
|
|
enum rte_flow_item_type pattern_eth_ipv6_gtpu[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_GTPU,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum rte_flow_item_type pattern_eth_ipv6_gtpu_eh[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_GTPU,
|
|
RTE_FLOW_ITEM_TYPE_GTP_PSC,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
/*IPv4 GTPU IPv4 */
|
|
enum rte_flow_item_type pattern_eth_ipv4_gtpu_ipv4[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_GTPU,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum rte_flow_item_type pattern_eth_ipv4_gtpu_ipv4_udp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_GTPU,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum rte_flow_item_type pattern_eth_ipv4_gtpu_ipv4_tcp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_GTPU,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_TCP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum rte_flow_item_type pattern_eth_ipv4_gtpu_ipv4_icmp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_GTPU,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_ICMP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
/*IPv4 GTPU IPv6 */
|
|
enum rte_flow_item_type pattern_eth_ipv4_gtpu_ipv6[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_GTPU,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum rte_flow_item_type pattern_eth_ipv4_gtpu_ipv6_udp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_GTPU,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum rte_flow_item_type pattern_eth_ipv4_gtpu_ipv6_tcp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_GTPU,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_TCP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum rte_flow_item_type pattern_eth_ipv4_gtpu_ipv6_icmp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_GTPU,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_ICMP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
/*IPv6 GTPU IPv4 */
|
|
enum rte_flow_item_type pattern_eth_ipv6_gtpu_ipv4[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_GTPU,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum rte_flow_item_type pattern_eth_ipv6_gtpu_ipv4_udp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_GTPU,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum rte_flow_item_type pattern_eth_ipv6_gtpu_ipv4_tcp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_GTPU,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_TCP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum rte_flow_item_type pattern_eth_ipv6_gtpu_ipv4_icmp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_GTPU,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_ICMP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
/*IPv6 GTPU IPv6 */
|
|
enum rte_flow_item_type pattern_eth_ipv6_gtpu_ipv6[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_GTPU,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum rte_flow_item_type pattern_eth_ipv6_gtpu_ipv6_udp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_GTPU,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum rte_flow_item_type pattern_eth_ipv6_gtpu_ipv6_tcp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_GTPU,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_TCP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum rte_flow_item_type pattern_eth_ipv6_gtpu_ipv6_icmp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_GTPU,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_ICMP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
/*IPv4 GTPU EH IPv4 */
|
|
enum rte_flow_item_type pattern_eth_ipv4_gtpu_eh_ipv4[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_GTPU,
|
|
RTE_FLOW_ITEM_TYPE_GTP_PSC,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum rte_flow_item_type pattern_eth_ipv4_gtpu_eh_ipv4_udp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_GTPU,
|
|
RTE_FLOW_ITEM_TYPE_GTP_PSC,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum rte_flow_item_type pattern_eth_ipv4_gtpu_eh_ipv4_tcp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_GTPU,
|
|
RTE_FLOW_ITEM_TYPE_GTP_PSC,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_TCP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum rte_flow_item_type pattern_eth_ipv4_gtpu_eh_ipv4_icmp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_GTPU,
|
|
RTE_FLOW_ITEM_TYPE_GTP_PSC,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_ICMP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
/*IPv4 GTPU EH IPv6 */
|
|
enum rte_flow_item_type pattern_eth_ipv4_gtpu_eh_ipv6[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_GTPU,
|
|
RTE_FLOW_ITEM_TYPE_GTP_PSC,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum rte_flow_item_type pattern_eth_ipv4_gtpu_eh_ipv6_udp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_GTPU,
|
|
RTE_FLOW_ITEM_TYPE_GTP_PSC,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum rte_flow_item_type pattern_eth_ipv4_gtpu_eh_ipv6_tcp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_GTPU,
|
|
RTE_FLOW_ITEM_TYPE_GTP_PSC,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_TCP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum rte_flow_item_type pattern_eth_ipv4_gtpu_eh_ipv6_icmp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_GTPU,
|
|
RTE_FLOW_ITEM_TYPE_GTP_PSC,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_ICMP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
/*IPv6 GTPU EH IPv4 */
|
|
enum rte_flow_item_type pattern_eth_ipv6_gtpu_eh_ipv4[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_GTPU,
|
|
RTE_FLOW_ITEM_TYPE_GTP_PSC,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum rte_flow_item_type pattern_eth_ipv6_gtpu_eh_ipv4_udp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_GTPU,
|
|
RTE_FLOW_ITEM_TYPE_GTP_PSC,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum rte_flow_item_type pattern_eth_ipv6_gtpu_eh_ipv4_tcp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_GTPU,
|
|
RTE_FLOW_ITEM_TYPE_GTP_PSC,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_TCP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum rte_flow_item_type pattern_eth_ipv6_gtpu_eh_ipv4_icmp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_GTPU,
|
|
RTE_FLOW_ITEM_TYPE_GTP_PSC,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_ICMP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
/*IPv6 GTPU EH IPv6 */
|
|
enum rte_flow_item_type pattern_eth_ipv6_gtpu_eh_ipv6[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_GTPU,
|
|
RTE_FLOW_ITEM_TYPE_GTP_PSC,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum rte_flow_item_type pattern_eth_ipv6_gtpu_eh_ipv6_udp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_GTPU,
|
|
RTE_FLOW_ITEM_TYPE_GTP_PSC,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum rte_flow_item_type pattern_eth_ipv6_gtpu_eh_ipv6_tcp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_GTPU,
|
|
RTE_FLOW_ITEM_TYPE_GTP_PSC,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_TCP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
enum rte_flow_item_type pattern_eth_ipv6_gtpu_eh_ipv6_icmp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_GTPU,
|
|
RTE_FLOW_ITEM_TYPE_GTP_PSC,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_ICMP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
/* PPPoE */
|
|
enum rte_flow_item_type pattern_eth_pppoed[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_PPPOED,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_vlan_pppoed[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_VLAN,
|
|
RTE_FLOW_ITEM_TYPE_PPPOED,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_qinq_pppoed[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_VLAN,
|
|
RTE_FLOW_ITEM_TYPE_VLAN,
|
|
RTE_FLOW_ITEM_TYPE_PPPOED,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_pppoes[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_PPPOES,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_pppoes_proto[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_PPPOES,
|
|
RTE_FLOW_ITEM_TYPE_PPPOE_PROTO_ID,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_vlan_pppoes[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_VLAN,
|
|
RTE_FLOW_ITEM_TYPE_PPPOES,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_vlan_pppoes_proto[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_VLAN,
|
|
RTE_FLOW_ITEM_TYPE_PPPOES,
|
|
RTE_FLOW_ITEM_TYPE_PPPOE_PROTO_ID,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_qinq_pppoes[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_VLAN,
|
|
RTE_FLOW_ITEM_TYPE_VLAN,
|
|
RTE_FLOW_ITEM_TYPE_PPPOES,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_qinq_pppoes_proto[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_VLAN,
|
|
RTE_FLOW_ITEM_TYPE_VLAN,
|
|
RTE_FLOW_ITEM_TYPE_PPPOES,
|
|
RTE_FLOW_ITEM_TYPE_PPPOE_PROTO_ID,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_pppoes_ipv4[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_PPPOES,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_vlan_pppoes_ipv4[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_VLAN,
|
|
RTE_FLOW_ITEM_TYPE_PPPOES,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_qinq_pppoes_ipv4[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_VLAN,
|
|
RTE_FLOW_ITEM_TYPE_VLAN,
|
|
RTE_FLOW_ITEM_TYPE_PPPOES,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_pppoes_ipv4_udp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_PPPOES,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_vlan_pppoes_ipv4_udp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_VLAN,
|
|
RTE_FLOW_ITEM_TYPE_PPPOES,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_qinq_pppoes_ipv4_udp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_VLAN,
|
|
RTE_FLOW_ITEM_TYPE_VLAN,
|
|
RTE_FLOW_ITEM_TYPE_PPPOES,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_pppoes_ipv4_tcp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_PPPOES,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_TCP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_vlan_pppoes_ipv4_tcp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_VLAN,
|
|
RTE_FLOW_ITEM_TYPE_PPPOES,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_TCP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_qinq_pppoes_ipv4_tcp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_VLAN,
|
|
RTE_FLOW_ITEM_TYPE_VLAN,
|
|
RTE_FLOW_ITEM_TYPE_PPPOES,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_TCP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_pppoes_ipv4_sctp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_PPPOES,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_SCTP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_vlan_pppoes_ipv4_sctp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_VLAN,
|
|
RTE_FLOW_ITEM_TYPE_PPPOES,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_SCTP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_qinq_pppoes_ipv4_sctp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_VLAN,
|
|
RTE_FLOW_ITEM_TYPE_VLAN,
|
|
RTE_FLOW_ITEM_TYPE_PPPOES,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_SCTP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_pppoes_ipv4_icmp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_PPPOES,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_ICMP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_vlan_pppoes_ipv4_icmp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_VLAN,
|
|
RTE_FLOW_ITEM_TYPE_PPPOES,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_ICMP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_qinq_pppoes_ipv4_icmp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_VLAN,
|
|
RTE_FLOW_ITEM_TYPE_VLAN,
|
|
RTE_FLOW_ITEM_TYPE_PPPOES,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_ICMP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_pppoes_ipv6[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_PPPOES,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_vlan_pppoes_ipv6[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_VLAN,
|
|
RTE_FLOW_ITEM_TYPE_PPPOES,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_qinq_pppoes_ipv6[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_VLAN,
|
|
RTE_FLOW_ITEM_TYPE_VLAN,
|
|
RTE_FLOW_ITEM_TYPE_PPPOES,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_pppoes_ipv6_udp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_PPPOES,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_vlan_pppoes_ipv6_udp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_VLAN,
|
|
RTE_FLOW_ITEM_TYPE_PPPOES,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_qinq_pppoes_ipv6_udp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_VLAN,
|
|
RTE_FLOW_ITEM_TYPE_VLAN,
|
|
RTE_FLOW_ITEM_TYPE_PPPOES,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_pppoes_ipv6_tcp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_PPPOES,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_TCP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_vlan_pppoes_ipv6_tcp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_VLAN,
|
|
RTE_FLOW_ITEM_TYPE_PPPOES,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_TCP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_qinq_pppoes_ipv6_tcp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_VLAN,
|
|
RTE_FLOW_ITEM_TYPE_VLAN,
|
|
RTE_FLOW_ITEM_TYPE_PPPOES,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_TCP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_pppoes_ipv6_sctp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_PPPOES,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_SCTP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_vlan_pppoes_ipv6_sctp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_VLAN,
|
|
RTE_FLOW_ITEM_TYPE_PPPOES,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_SCTP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_qinq_pppoes_ipv6_sctp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_VLAN,
|
|
RTE_FLOW_ITEM_TYPE_VLAN,
|
|
RTE_FLOW_ITEM_TYPE_PPPOES,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_SCTP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_pppoes_ipv6_icmp6[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_PPPOES,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_ICMP6,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_vlan_pppoes_ipv6_icmp6[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_VLAN,
|
|
RTE_FLOW_ITEM_TYPE_PPPOES,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_ICMP6,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_qinq_pppoes_ipv6_icmp6[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_VLAN,
|
|
RTE_FLOW_ITEM_TYPE_VLAN,
|
|
RTE_FLOW_ITEM_TYPE_PPPOES,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_ICMP6,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_ipv4_esp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_ESP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_ipv6_esp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_ESP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_ipv4_ah[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_AH,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_ipv6_ah[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_AH,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_ipv4_udp_esp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_ESP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_ipv6_udp_esp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_ESP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_ipv6_udp_ah[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_AH,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_ipv4_l2tp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_L2TPV3OIP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_ipv6_l2tp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_L2TPV3OIP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_ipv4_pfcp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV4,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_PFCP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
enum rte_flow_item_type pattern_eth_ipv6_pfcp[] = {
|
|
RTE_FLOW_ITEM_TYPE_ETH,
|
|
RTE_FLOW_ITEM_TYPE_IPV6,
|
|
RTE_FLOW_ITEM_TYPE_UDP,
|
|
RTE_FLOW_ITEM_TYPE_PFCP,
|
|
RTE_FLOW_ITEM_TYPE_END,
|
|
};
|
|
|
|
|
|
|
|
typedef struct ice_flow_engine * (*parse_engine_t)(struct ice_adapter *ad,
|
|
struct rte_flow *flow,
|
|
struct ice_parser_list *parser_list,
|
|
uint32_t priority,
|
|
const struct rte_flow_item pattern[],
|
|
const struct rte_flow_action actions[],
|
|
struct rte_flow_error *error);
|
|
|
|
void
|
|
ice_register_flow_engine(struct ice_flow_engine *engine)
|
|
{
|
|
TAILQ_INSERT_TAIL(&engine_list, engine, node);
|
|
}
|
|
|
|
int
|
|
ice_flow_init(struct ice_adapter *ad)
|
|
{
|
|
int ret;
|
|
struct ice_pf *pf = &ad->pf;
|
|
void *temp;
|
|
struct ice_flow_engine *engine;
|
|
|
|
TAILQ_INIT(&pf->flow_list);
|
|
TAILQ_INIT(&pf->rss_parser_list);
|
|
TAILQ_INIT(&pf->perm_parser_list);
|
|
TAILQ_INIT(&pf->dist_parser_list);
|
|
rte_spinlock_init(&pf->flow_ops_lock);
|
|
|
|
RTE_TAILQ_FOREACH_SAFE(engine, &engine_list, node, temp) {
|
|
if (engine->init == NULL) {
|
|
PMD_INIT_LOG(ERR, "Invalid engine type (%d)",
|
|
engine->type);
|
|
return -ENOTSUP;
|
|
}
|
|
|
|
ret = engine->init(ad);
|
|
if (ret) {
|
|
PMD_INIT_LOG(ERR, "Failed to initialize engine %d",
|
|
engine->type);
|
|
return ret;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
void
|
|
ice_flow_uninit(struct ice_adapter *ad)
|
|
{
|
|
struct ice_pf *pf = &ad->pf;
|
|
struct ice_flow_engine *engine;
|
|
struct rte_flow *p_flow;
|
|
struct ice_flow_parser_node *p_parser;
|
|
void *temp;
|
|
|
|
RTE_TAILQ_FOREACH_SAFE(engine, &engine_list, node, temp) {
|
|
if (engine->uninit)
|
|
engine->uninit(ad);
|
|
}
|
|
|
|
/* Remove all flows */
|
|
while ((p_flow = TAILQ_FIRST(&pf->flow_list))) {
|
|
TAILQ_REMOVE(&pf->flow_list, p_flow, node);
|
|
if (p_flow->engine->free)
|
|
p_flow->engine->free(p_flow);
|
|
rte_free(p_flow);
|
|
}
|
|
|
|
/* Cleanup parser list */
|
|
while ((p_parser = TAILQ_FIRST(&pf->rss_parser_list))) {
|
|
TAILQ_REMOVE(&pf->rss_parser_list, p_parser, node);
|
|
rte_free(p_parser);
|
|
}
|
|
|
|
while ((p_parser = TAILQ_FIRST(&pf->perm_parser_list))) {
|
|
TAILQ_REMOVE(&pf->perm_parser_list, p_parser, node);
|
|
rte_free(p_parser);
|
|
}
|
|
|
|
while ((p_parser = TAILQ_FIRST(&pf->dist_parser_list))) {
|
|
TAILQ_REMOVE(&pf->dist_parser_list, p_parser, node);
|
|
rte_free(p_parser);
|
|
}
|
|
}
|
|
|
|
static struct ice_parser_list *
|
|
ice_get_parser_list(struct ice_flow_parser *parser,
|
|
struct ice_adapter *ad)
|
|
{
|
|
struct ice_parser_list *list;
|
|
struct ice_pf *pf = &ad->pf;
|
|
|
|
switch (parser->stage) {
|
|
case ICE_FLOW_STAGE_RSS:
|
|
list = &pf->rss_parser_list;
|
|
break;
|
|
case ICE_FLOW_STAGE_PERMISSION:
|
|
list = &pf->perm_parser_list;
|
|
break;
|
|
case ICE_FLOW_STAGE_DISTRIBUTOR:
|
|
list = &pf->dist_parser_list;
|
|
break;
|
|
default:
|
|
return NULL;
|
|
}
|
|
|
|
return list;
|
|
}
|
|
|
|
int
|
|
ice_register_parser(struct ice_flow_parser *parser,
|
|
struct ice_adapter *ad)
|
|
{
|
|
struct ice_parser_list *list;
|
|
struct ice_flow_parser_node *parser_node;
|
|
struct ice_flow_parser_node *existing_node;
|
|
void *temp;
|
|
|
|
parser_node = rte_zmalloc("ice_parser", sizeof(*parser_node), 0);
|
|
if (parser_node == NULL) {
|
|
PMD_DRV_LOG(ERR, "Failed to allocate memory.");
|
|
return -ENOMEM;
|
|
}
|
|
parser_node->parser = parser;
|
|
|
|
list = ice_get_parser_list(parser, ad);
|
|
if (list == NULL)
|
|
return -EINVAL;
|
|
|
|
if (ad->devargs.pipe_mode_support) {
|
|
TAILQ_INSERT_TAIL(list, parser_node, node);
|
|
} else {
|
|
if (parser->engine->type == ICE_FLOW_ENGINE_SWITCH) {
|
|
RTE_TAILQ_FOREACH_SAFE(existing_node, list,
|
|
node, temp) {
|
|
if (existing_node->parser->engine->type ==
|
|
ICE_FLOW_ENGINE_ACL) {
|
|
TAILQ_INSERT_AFTER(list, existing_node,
|
|
parser_node, node);
|
|
goto DONE;
|
|
}
|
|
}
|
|
TAILQ_INSERT_HEAD(list, parser_node, node);
|
|
} else if (parser->engine->type == ICE_FLOW_ENGINE_FDIR) {
|
|
RTE_TAILQ_FOREACH_SAFE(existing_node, list,
|
|
node, temp) {
|
|
if (existing_node->parser->engine->type ==
|
|
ICE_FLOW_ENGINE_SWITCH) {
|
|
TAILQ_INSERT_AFTER(list, existing_node,
|
|
parser_node, node);
|
|
goto DONE;
|
|
}
|
|
}
|
|
TAILQ_INSERT_HEAD(list, parser_node, node);
|
|
} else if (parser->engine->type == ICE_FLOW_ENGINE_HASH) {
|
|
TAILQ_INSERT_TAIL(list, parser_node, node);
|
|
} else if (parser->engine->type == ICE_FLOW_ENGINE_ACL) {
|
|
TAILQ_INSERT_HEAD(list, parser_node, node);
|
|
} else {
|
|
return -EINVAL;
|
|
}
|
|
}
|
|
DONE:
|
|
return 0;
|
|
}
|
|
|
|
void
|
|
ice_unregister_parser(struct ice_flow_parser *parser,
|
|
struct ice_adapter *ad)
|
|
{
|
|
struct ice_parser_list *list;
|
|
struct ice_flow_parser_node *p_parser;
|
|
void *temp;
|
|
|
|
list = ice_get_parser_list(parser, ad);
|
|
if (list == NULL)
|
|
return;
|
|
|
|
RTE_TAILQ_FOREACH_SAFE(p_parser, list, node, temp) {
|
|
if (p_parser->parser->engine->type == parser->engine->type) {
|
|
TAILQ_REMOVE(list, p_parser, node);
|
|
rte_free(p_parser);
|
|
}
|
|
}
|
|
}
|
|
|
|
static int
|
|
ice_flow_valid_attr(struct ice_adapter *ad,
|
|
const struct rte_flow_attr *attr,
|
|
int *ice_pipeline_stage,
|
|
struct rte_flow_error *error)
|
|
{
|
|
/* Must be input direction */
|
|
if (!attr->ingress) {
|
|
rte_flow_error_set(error, EINVAL,
|
|
RTE_FLOW_ERROR_TYPE_ATTR_INGRESS,
|
|
attr, "Only support ingress.");
|
|
return -rte_errno;
|
|
}
|
|
|
|
/* Not supported */
|
|
if (attr->egress) {
|
|
rte_flow_error_set(error, EINVAL,
|
|
RTE_FLOW_ERROR_TYPE_ATTR_EGRESS,
|
|
attr, "Not support egress.");
|
|
return -rte_errno;
|
|
}
|
|
|
|
/* Check pipeline mode support to set classification stage */
|
|
if (ad->devargs.pipe_mode_support) {
|
|
if (attr->priority == 0)
|
|
*ice_pipeline_stage =
|
|
ICE_FLOW_CLASSIFY_STAGE_PERMISSION;
|
|
else
|
|
*ice_pipeline_stage =
|
|
ICE_FLOW_CLASSIFY_STAGE_DISTRIBUTOR;
|
|
} else {
|
|
*ice_pipeline_stage =
|
|
ICE_FLOW_CLASSIFY_STAGE_DISTRIBUTOR_ONLY;
|
|
if (attr->priority > 1) {
|
|
rte_flow_error_set(error, EINVAL,
|
|
RTE_FLOW_ERROR_TYPE_ATTR_PRIORITY,
|
|
attr, "Only support priority 0 and 1.");
|
|
return -rte_errno;
|
|
}
|
|
}
|
|
|
|
/* Not supported */
|
|
if (attr->group) {
|
|
rte_flow_error_set(error, EINVAL,
|
|
RTE_FLOW_ERROR_TYPE_ATTR_GROUP,
|
|
attr, "Not support group.");
|
|
return -rte_errno;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
/* Find the first VOID or non-VOID item pointer */
|
|
static const struct rte_flow_item *
|
|
ice_find_first_item(const struct rte_flow_item *item, bool is_void)
|
|
{
|
|
bool is_find;
|
|
|
|
while (item->type != RTE_FLOW_ITEM_TYPE_END) {
|
|
if (is_void)
|
|
is_find = item->type == RTE_FLOW_ITEM_TYPE_VOID;
|
|
else
|
|
is_find = item->type != RTE_FLOW_ITEM_TYPE_VOID;
|
|
if (is_find)
|
|
break;
|
|
item++;
|
|
}
|
|
return item;
|
|
}
|
|
|
|
/* Skip all VOID items of the pattern */
|
|
static void
|
|
ice_pattern_skip_void_item(struct rte_flow_item *items,
|
|
const struct rte_flow_item *pattern)
|
|
{
|
|
uint32_t cpy_count = 0;
|
|
const struct rte_flow_item *pb = pattern, *pe = pattern;
|
|
|
|
for (;;) {
|
|
/* Find a non-void item first */
|
|
pb = ice_find_first_item(pb, false);
|
|
if (pb->type == RTE_FLOW_ITEM_TYPE_END) {
|
|
pe = pb;
|
|
break;
|
|
}
|
|
|
|
/* Find a void item */
|
|
pe = ice_find_first_item(pb + 1, true);
|
|
|
|
cpy_count = pe - pb;
|
|
rte_memcpy(items, pb, sizeof(struct rte_flow_item) * cpy_count);
|
|
|
|
items += cpy_count;
|
|
|
|
if (pe->type == RTE_FLOW_ITEM_TYPE_END) {
|
|
break;
|
|
}
|
|
|
|
pb = pe + 1;
|
|
}
|
|
/* Copy the END item. */
|
|
rte_memcpy(items, pe, sizeof(struct rte_flow_item));
|
|
}
|
|
|
|
/* Check if the pattern matches a supported item type array */
|
|
static bool
|
|
ice_match_pattern(enum rte_flow_item_type *item_array,
|
|
const struct rte_flow_item *pattern)
|
|
{
|
|
const struct rte_flow_item *item = pattern;
|
|
|
|
while ((*item_array == item->type) &&
|
|
(*item_array != RTE_FLOW_ITEM_TYPE_END)) {
|
|
item_array++;
|
|
item++;
|
|
}
|
|
|
|
return (*item_array == RTE_FLOW_ITEM_TYPE_END &&
|
|
item->type == RTE_FLOW_ITEM_TYPE_END);
|
|
}
|
|
|
|
struct ice_ptype_match {
|
|
enum rte_flow_item_type *pattern_list;
|
|
uint16_t hw_ptype;
|
|
};
|
|
|
|
static struct ice_ptype_match ice_ptype_map[] = {
|
|
{pattern_raw, ICE_PTYPE_IPV4_PAY},
|
|
{pattern_eth_ipv4, ICE_PTYPE_IPV4_PAY},
|
|
{pattern_eth_ipv4_udp, ICE_PTYPE_IPV4_UDP_PAY},
|
|
{pattern_eth_ipv4_tcp, ICE_PTYPE_IPV4_TCP_PAY},
|
|
{pattern_eth_ipv4_sctp, ICE_PTYPE_IPV4_SCTP_PAY},
|
|
{pattern_eth_ipv4_gtpu, ICE_MAC_IPV4_GTPU},
|
|
{pattern_eth_ipv4_gtpu_eh, ICE_MAC_IPV4_GTPU},
|
|
{pattern_eth_ipv4_gtpu_ipv4, ICE_MAC_IPV4_GTPU_IPV4_PAY},
|
|
{pattern_eth_ipv4_gtpu_ipv4_udp, ICE_MAC_IPV4_GTPU_IPV4_UDP_PAY},
|
|
{pattern_eth_ipv4_gtpu_ipv4_tcp, ICE_MAC_IPV4_GTPU_IPV4_TCP},
|
|
{pattern_eth_ipv4_gtpu_ipv6, ICE_MAC_IPV4_GTPU_IPV6_PAY},
|
|
{pattern_eth_ipv4_gtpu_ipv6_udp, ICE_MAC_IPV4_GTPU_IPV6_UDP_PAY},
|
|
{pattern_eth_ipv4_gtpu_ipv6_tcp, ICE_MAC_IPV4_GTPU_IPV6_TCP},
|
|
{pattern_eth_ipv4_gtpu_eh_ipv4, ICE_MAC_IPV4_GTPU_IPV4_PAY},
|
|
{pattern_eth_ipv4_gtpu_eh_ipv4_udp, ICE_MAC_IPV4_GTPU_IPV4_UDP_PAY},
|
|
{pattern_eth_ipv4_gtpu_eh_ipv4_tcp, ICE_MAC_IPV4_GTPU_IPV4_TCP},
|
|
{pattern_eth_ipv4_gtpu_eh_ipv6, ICE_MAC_IPV4_GTPU_IPV6_PAY},
|
|
{pattern_eth_ipv4_gtpu_eh_ipv6_udp, ICE_MAC_IPV4_GTPU_IPV6_UDP_PAY},
|
|
{pattern_eth_ipv4_gtpu_eh_ipv6_tcp, ICE_MAC_IPV4_GTPU_IPV6_TCP},
|
|
{pattern_eth_ipv4_esp, ICE_MAC_IPV4_ESP},
|
|
{pattern_eth_ipv4_udp_esp, ICE_MAC_IPV4_NAT_T_ESP},
|
|
{pattern_eth_ipv4_ah, ICE_MAC_IPV4_AH},
|
|
{pattern_eth_ipv4_l2tp, ICE_MAC_IPV4_L2TPV3},
|
|
{pattern_eth_ipv4_pfcp, ICE_MAC_IPV4_PFCP_SESSION},
|
|
{pattern_eth_ipv6, ICE_PTYPE_IPV6_PAY},
|
|
{pattern_eth_ipv6_udp, ICE_PTYPE_IPV6_UDP_PAY},
|
|
{pattern_eth_ipv6_tcp, ICE_PTYPE_IPV6_TCP_PAY},
|
|
{pattern_eth_ipv6_sctp, ICE_PTYPE_IPV6_SCTP_PAY},
|
|
{pattern_eth_ipv6_frag_ext, ICE_PTYPE_IPV6FRAG_PAY},
|
|
{pattern_eth_ipv6_gtpu, ICE_MAC_IPV6_GTPU},
|
|
{pattern_eth_ipv6_gtpu_eh, ICE_MAC_IPV6_GTPU},
|
|
{pattern_eth_ipv6_gtpu_ipv4, ICE_MAC_IPV6_GTPU_IPV4_PAY},
|
|
{pattern_eth_ipv6_gtpu_ipv4_udp, ICE_MAC_IPV6_GTPU_IPV4_UDP_PAY},
|
|
{pattern_eth_ipv6_gtpu_ipv4_tcp, ICE_MAC_IPV6_GTPU_IPV4_TCP},
|
|
{pattern_eth_ipv6_gtpu_ipv6, ICE_MAC_IPV6_GTPU_IPV6_PAY},
|
|
{pattern_eth_ipv6_gtpu_ipv6_udp, ICE_MAC_IPV6_GTPU_IPV6_UDP_PAY},
|
|
{pattern_eth_ipv6_gtpu_ipv6_tcp, ICE_MAC_IPV6_GTPU_IPV6_TCP},
|
|
{pattern_eth_ipv6_gtpu_eh_ipv4, ICE_MAC_IPV6_GTPU_IPV4_PAY},
|
|
{pattern_eth_ipv6_gtpu_eh_ipv4_udp, ICE_MAC_IPV6_GTPU_IPV4_UDP_PAY},
|
|
{pattern_eth_ipv6_gtpu_eh_ipv4_tcp, ICE_MAC_IPV6_GTPU_IPV4_TCP},
|
|
{pattern_eth_ipv6_gtpu_eh_ipv6, ICE_MAC_IPV6_GTPU_IPV6_PAY},
|
|
{pattern_eth_ipv6_gtpu_eh_ipv6_udp, ICE_MAC_IPV6_GTPU_IPV6_UDP_PAY},
|
|
{pattern_eth_ipv6_gtpu_eh_ipv6_tcp, ICE_MAC_IPV6_GTPU_IPV6_TCP},
|
|
{pattern_eth_ipv6_esp, ICE_MAC_IPV6_ESP},
|
|
{pattern_eth_ipv6_udp_esp, ICE_MAC_IPV6_NAT_T_ESP},
|
|
{pattern_eth_ipv6_ah, ICE_MAC_IPV6_AH},
|
|
{pattern_eth_ipv6_l2tp, ICE_MAC_IPV6_L2TPV3},
|
|
{pattern_eth_ipv6_pfcp, ICE_MAC_IPV6_PFCP_SESSION},
|
|
{pattern_ethertype, ICE_PTYPE_MAC_PAY},
|
|
{pattern_ethertype_vlan, ICE_PTYPE_MAC_PAY},
|
|
{pattern_ethertype_qinq, ICE_PTYPE_MAC_PAY},
|
|
{pattern_eth_arp, ICE_PTYPE_MAC_PAY},
|
|
{pattern_eth_vlan_ipv4, ICE_PTYPE_IPV4_PAY},
|
|
{pattern_eth_qinq_ipv4, ICE_PTYPE_IPV4_PAY},
|
|
{pattern_eth_qinq_ipv4_udp, ICE_PTYPE_IPV4_UDP_PAY},
|
|
{pattern_eth_qinq_ipv4_tcp, ICE_PTYPE_IPV4_TCP_PAY},
|
|
{pattern_eth_vlan_ipv4_udp, ICE_PTYPE_IPV4_UDP_PAY},
|
|
{pattern_eth_vlan_ipv4_tcp, ICE_PTYPE_IPV4_TCP_PAY},
|
|
{pattern_eth_vlan_ipv4_sctp, ICE_PTYPE_IPV4_SCTP_PAY},
|
|
{pattern_eth_vlan_ipv6, ICE_PTYPE_IPV6_PAY},
|
|
{pattern_eth_qinq_ipv6, ICE_PTYPE_IPV6_PAY},
|
|
{pattern_eth_qinq_ipv6_udp, ICE_PTYPE_IPV6_UDP_PAY},
|
|
{pattern_eth_qinq_ipv6_tcp, ICE_PTYPE_IPV6_TCP_PAY},
|
|
{pattern_eth_vlan_ipv6_udp, ICE_PTYPE_IPV6_UDP_PAY},
|
|
{pattern_eth_vlan_ipv6_tcp, ICE_PTYPE_IPV6_TCP_PAY},
|
|
{pattern_eth_vlan_ipv6_sctp, ICE_PTYPE_IPV6_SCTP_PAY},
|
|
{pattern_eth_pppoes, ICE_MAC_PPPOE_PAY},
|
|
{pattern_eth_vlan_pppoes, ICE_MAC_PPPOE_PAY},
|
|
{pattern_eth_qinq_pppoes, ICE_MAC_PPPOE_PAY},
|
|
{pattern_eth_pppoes_proto, ICE_MAC_PPPOE_PAY},
|
|
{pattern_eth_vlan_pppoes_proto, ICE_MAC_PPPOE_PAY},
|
|
{pattern_eth_qinq_pppoes_proto, ICE_MAC_PPPOE_PAY},
|
|
{pattern_eth_pppoes_ipv4, ICE_MAC_PPPOE_IPV4_PAY},
|
|
{pattern_eth_pppoes_ipv4_udp, ICE_MAC_PPPOE_IPV4_UDP_PAY},
|
|
{pattern_eth_pppoes_ipv4_tcp, ICE_MAC_PPPOE_IPV4_TCP},
|
|
{pattern_eth_vlan_pppoes_ipv4, ICE_MAC_PPPOE_IPV4_PAY},
|
|
{pattern_eth_qinq_pppoes_ipv4, ICE_MAC_PPPOE_IPV4_PAY},
|
|
{pattern_eth_vlan_pppoes_ipv4_tcp, ICE_MAC_PPPOE_IPV4_TCP},
|
|
{pattern_eth_vlan_pppoes_ipv4_udp, ICE_MAC_PPPOE_IPV4_UDP_PAY},
|
|
{pattern_eth_pppoes_ipv6, ICE_MAC_PPPOE_IPV6_PAY},
|
|
{pattern_eth_pppoes_ipv6_udp, ICE_MAC_PPPOE_IPV6_UDP_PAY},
|
|
{pattern_eth_pppoes_ipv6_tcp, ICE_MAC_PPPOE_IPV6_TCP},
|
|
{pattern_eth_vlan_pppoes_ipv6, ICE_MAC_PPPOE_IPV6_PAY},
|
|
{pattern_eth_qinq_pppoes_ipv6, ICE_MAC_PPPOE_IPV6_PAY},
|
|
{pattern_eth_vlan_pppoes_ipv6_tcp, ICE_MAC_PPPOE_IPV6_TCP},
|
|
{pattern_eth_vlan_pppoes_ipv6_udp, ICE_MAC_PPPOE_IPV6_UDP_PAY},
|
|
{pattern_eth_ipv4_udp_vxlan_ipv4, ICE_MAC_IPV4_TUN_IPV4_PAY},
|
|
{pattern_eth_ipv4_udp_vxlan_ipv4_udp, ICE_MAC_IPV4_TUN_IPV4_UDP_PAY},
|
|
{pattern_eth_ipv4_udp_vxlan_ipv4_tcp, ICE_MAC_IPV4_TUN_IPV4_TCP},
|
|
{pattern_eth_ipv4_udp_vxlan_ipv4_sctp, ICE_MAC_IPV4_TUN_IPV4_SCTP},
|
|
{pattern_eth_ipv4_udp_vxlan_eth_ipv4, ICE_MAC_IPV4_TUN_IPV4_PAY},
|
|
{pattern_eth_ipv4_udp_vxlan_eth_ipv4_udp, ICE_MAC_IPV4_TUN_IPV4_UDP_PAY},
|
|
{pattern_eth_ipv4_udp_vxlan_eth_ipv4_tcp, ICE_MAC_IPV4_TUN_IPV4_TCP},
|
|
{pattern_eth_ipv4_udp_vxlan_eth_ipv4_sctp, ICE_MAC_IPV4_TUN_IPV4_SCTP},
|
|
{pattern_eth_ipv4_nvgre_eth_ipv4, ICE_MAC_IPV4_TUN_IPV4_PAY},
|
|
{pattern_eth_ipv4_nvgre_eth_ipv4_udp, ICE_MAC_IPV4_TUN_IPV4_UDP_PAY},
|
|
{pattern_eth_ipv4_nvgre_eth_ipv4_tcp, ICE_MAC_IPV4_TUN_IPV4_TCP},
|
|
{pattern_empty, 0},
|
|
};
|
|
|
|
static bool
|
|
ice_pattern_is_supported(__rte_unused struct ice_adapter *ad,
|
|
const struct rte_flow_item *pattern)
|
|
{
|
|
uint16_t i;
|
|
|
|
for (i = 0; i < RTE_DIM(ice_ptype_map); i++) {
|
|
if (ice_match_pattern(ice_ptype_map[i].pattern_list,
|
|
pattern)) {
|
|
return ice_hw_ptype_ena(&ad->hw,
|
|
ice_ptype_map[i].hw_ptype);
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
struct ice_pattern_match_item *
|
|
ice_search_pattern_match_item(struct ice_adapter *ad,
|
|
const struct rte_flow_item pattern[],
|
|
struct ice_pattern_match_item *array,
|
|
uint32_t array_len,
|
|
struct rte_flow_error *error)
|
|
{
|
|
struct ice_pattern_match_item *pattern_match_item;
|
|
/* need free by each filter */
|
|
struct rte_flow_item *items; /* used for pattern without VOID items */
|
|
uint32_t item_num = 0; /* non-void item number */
|
|
uint16_t i = 0;
|
|
|
|
/* Get the non-void item number of pattern */
|
|
while ((pattern + i)->type != RTE_FLOW_ITEM_TYPE_END) {
|
|
if ((pattern + i)->type != RTE_FLOW_ITEM_TYPE_VOID)
|
|
item_num++;
|
|
i++;
|
|
}
|
|
item_num++;
|
|
|
|
items = rte_zmalloc("ice_pattern",
|
|
item_num * sizeof(struct rte_flow_item), 0);
|
|
if (!items) {
|
|
rte_flow_error_set(error, ENOMEM, RTE_FLOW_ERROR_TYPE_ITEM_NUM,
|
|
NULL, "No memory for PMD internal items.");
|
|
return NULL;
|
|
}
|
|
pattern_match_item = rte_zmalloc("ice_pattern_match_item",
|
|
sizeof(struct ice_pattern_match_item), 0);
|
|
if (!pattern_match_item) {
|
|
rte_flow_error_set(error, ENOMEM, RTE_FLOW_ERROR_TYPE_HANDLE,
|
|
NULL, "Failed to allocate memory.");
|
|
rte_free(items);
|
|
return NULL;
|
|
}
|
|
|
|
ice_pattern_skip_void_item(items, pattern);
|
|
|
|
if (!ice_pattern_is_supported(ad, pattern))
|
|
goto unsupported;
|
|
|
|
for (i = 0; i < array_len; i++) {
|
|
if (ice_match_pattern(array[i].pattern_list,
|
|
items)) {
|
|
pattern_match_item->input_set_mask_o =
|
|
array[i].input_set_mask_o;
|
|
pattern_match_item->input_set_mask_i =
|
|
array[i].input_set_mask_i;
|
|
pattern_match_item->pattern_list =
|
|
array[i].pattern_list;
|
|
pattern_match_item->meta = array[i].meta;
|
|
rte_free(items);
|
|
return pattern_match_item;
|
|
}
|
|
}
|
|
|
|
unsupported:
|
|
rte_flow_error_set(error, EINVAL, RTE_FLOW_ERROR_TYPE_ITEM,
|
|
pattern, "Unsupported pattern");
|
|
rte_free(items);
|
|
rte_free(pattern_match_item);
|
|
return NULL;
|
|
}
|
|
|
|
static struct ice_flow_engine *
|
|
ice_parse_engine_create(struct ice_adapter *ad,
|
|
struct rte_flow *flow,
|
|
struct ice_parser_list *parser_list,
|
|
uint32_t priority,
|
|
const struct rte_flow_item pattern[],
|
|
const struct rte_flow_action actions[],
|
|
struct rte_flow_error *error)
|
|
{
|
|
struct ice_flow_engine *engine = NULL;
|
|
struct ice_flow_parser_node *parser_node;
|
|
void *meta = NULL;
|
|
void *temp;
|
|
|
|
RTE_TAILQ_FOREACH_SAFE(parser_node, parser_list, node, temp) {
|
|
int ret;
|
|
|
|
if (parser_node->parser->parse_pattern_action(ad,
|
|
parser_node->parser->array,
|
|
parser_node->parser->array_len,
|
|
pattern, actions, priority, &meta, error) < 0)
|
|
continue;
|
|
|
|
engine = parser_node->parser->engine;
|
|
RTE_ASSERT(engine->create != NULL);
|
|
ret = engine->create(ad, flow, meta, error);
|
|
if (ret == 0)
|
|
return engine;
|
|
else if (ret == -EEXIST)
|
|
return NULL;
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
static struct ice_flow_engine *
|
|
ice_parse_engine_validate(struct ice_adapter *ad,
|
|
struct rte_flow *flow __rte_unused,
|
|
struct ice_parser_list *parser_list,
|
|
uint32_t priority,
|
|
const struct rte_flow_item pattern[],
|
|
const struct rte_flow_action actions[],
|
|
struct rte_flow_error *error)
|
|
{
|
|
struct ice_flow_engine *engine = NULL;
|
|
struct ice_flow_parser_node *parser_node;
|
|
void *temp;
|
|
|
|
RTE_TAILQ_FOREACH_SAFE(parser_node, parser_list, node, temp) {
|
|
if (parser_node->parser->parse_pattern_action(ad,
|
|
parser_node->parser->array,
|
|
parser_node->parser->array_len,
|
|
pattern, actions, priority, NULL, error) < 0)
|
|
continue;
|
|
|
|
engine = parser_node->parser->engine;
|
|
break;
|
|
}
|
|
return engine;
|
|
}
|
|
|
|
static int
|
|
ice_flow_process_filter(struct rte_eth_dev *dev,
|
|
struct rte_flow *flow,
|
|
const struct rte_flow_attr *attr,
|
|
const struct rte_flow_item pattern[],
|
|
const struct rte_flow_action actions[],
|
|
struct ice_flow_engine **engine,
|
|
parse_engine_t ice_parse_engine,
|
|
struct rte_flow_error *error)
|
|
{
|
|
int ret = ICE_ERR_NOT_SUPPORTED;
|
|
struct ice_adapter *ad =
|
|
ICE_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private);
|
|
struct ice_pf *pf = ICE_DEV_PRIVATE_TO_PF(dev->data->dev_private);
|
|
int ice_pipeline_stage = 0;
|
|
|
|
if (!pattern) {
|
|
rte_flow_error_set(error, EINVAL, RTE_FLOW_ERROR_TYPE_ITEM_NUM,
|
|
NULL, "NULL pattern.");
|
|
return -rte_errno;
|
|
}
|
|
|
|
if (!actions || actions->type == RTE_FLOW_ACTION_TYPE_END) {
|
|
rte_flow_error_set(error, EINVAL,
|
|
RTE_FLOW_ERROR_TYPE_ACTION_NUM,
|
|
NULL, "NULL action.");
|
|
return -rte_errno;
|
|
}
|
|
|
|
if (!attr) {
|
|
rte_flow_error_set(error, EINVAL,
|
|
RTE_FLOW_ERROR_TYPE_ATTR,
|
|
NULL, "NULL attribute.");
|
|
return -rte_errno;
|
|
}
|
|
|
|
ret = ice_flow_valid_attr(ad, attr, &ice_pipeline_stage, error);
|
|
if (ret)
|
|
return ret;
|
|
|
|
*engine = ice_parse_engine(ad, flow, &pf->rss_parser_list,
|
|
attr->priority, pattern, actions, error);
|
|
if (*engine != NULL)
|
|
return 0;
|
|
|
|
switch (ice_pipeline_stage) {
|
|
case ICE_FLOW_CLASSIFY_STAGE_DISTRIBUTOR_ONLY:
|
|
case ICE_FLOW_CLASSIFY_STAGE_DISTRIBUTOR:
|
|
*engine = ice_parse_engine(ad, flow, &pf->dist_parser_list,
|
|
attr->priority, pattern, actions, error);
|
|
break;
|
|
case ICE_FLOW_CLASSIFY_STAGE_PERMISSION:
|
|
*engine = ice_parse_engine(ad, flow, &pf->perm_parser_list,
|
|
attr->priority, pattern, actions, error);
|
|
break;
|
|
default:
|
|
return -EINVAL;
|
|
}
|
|
|
|
if (*engine == NULL)
|
|
return -EINVAL;
|
|
|
|
return 0;
|
|
}
|
|
|
|
static int
|
|
ice_flow_validate(struct rte_eth_dev *dev,
|
|
const struct rte_flow_attr *attr,
|
|
const struct rte_flow_item pattern[],
|
|
const struct rte_flow_action actions[],
|
|
struct rte_flow_error *error)
|
|
{
|
|
struct ice_flow_engine *engine;
|
|
|
|
return ice_flow_process_filter(dev, NULL, attr, pattern, actions,
|
|
&engine, ice_parse_engine_validate, error);
|
|
}
|
|
|
|
static struct rte_flow *
|
|
ice_flow_create(struct rte_eth_dev *dev,
|
|
const struct rte_flow_attr *attr,
|
|
const struct rte_flow_item pattern[],
|
|
const struct rte_flow_action actions[],
|
|
struct rte_flow_error *error)
|
|
{
|
|
struct ice_pf *pf = ICE_DEV_PRIVATE_TO_PF(dev->data->dev_private);
|
|
struct rte_flow *flow = NULL;
|
|
int ret;
|
|
struct ice_flow_engine *engine = NULL;
|
|
|
|
flow = rte_zmalloc("ice_flow", sizeof(struct rte_flow), 0);
|
|
if (!flow) {
|
|
rte_flow_error_set(error, ENOMEM,
|
|
RTE_FLOW_ERROR_TYPE_HANDLE, NULL,
|
|
"Failed to allocate memory");
|
|
return flow;
|
|
}
|
|
|
|
rte_spinlock_lock(&pf->flow_ops_lock);
|
|
|
|
ret = ice_flow_process_filter(dev, flow, attr, pattern, actions,
|
|
&engine, ice_parse_engine_create, error);
|
|
if (ret < 0) {
|
|
PMD_DRV_LOG(ERR, "Failed to create flow");
|
|
rte_free(flow);
|
|
flow = NULL;
|
|
goto out;
|
|
}
|
|
|
|
flow->engine = engine;
|
|
TAILQ_INSERT_TAIL(&pf->flow_list, flow, node);
|
|
PMD_DRV_LOG(INFO, "Succeeded to create (%d) flow", engine->type);
|
|
|
|
out:
|
|
rte_spinlock_unlock(&pf->flow_ops_lock);
|
|
return flow;
|
|
}
|
|
|
|
static int
|
|
ice_flow_destroy(struct rte_eth_dev *dev,
|
|
struct rte_flow *flow,
|
|
struct rte_flow_error *error)
|
|
{
|
|
struct ice_pf *pf = ICE_DEV_PRIVATE_TO_PF(dev->data->dev_private);
|
|
struct ice_adapter *ad =
|
|
ICE_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private);
|
|
int ret = 0;
|
|
|
|
if (!flow || !flow->engine || !flow->engine->destroy) {
|
|
rte_flow_error_set(error, EINVAL,
|
|
RTE_FLOW_ERROR_TYPE_HANDLE,
|
|
NULL, "Invalid flow");
|
|
return -rte_errno;
|
|
}
|
|
|
|
rte_spinlock_lock(&pf->flow_ops_lock);
|
|
|
|
ret = flow->engine->destroy(ad, flow, error);
|
|
if (!ret) {
|
|
TAILQ_REMOVE(&pf->flow_list, flow, node);
|
|
rte_free(flow);
|
|
} else {
|
|
PMD_DRV_LOG(ERR, "Failed to destroy flow");
|
|
}
|
|
|
|
rte_spinlock_unlock(&pf->flow_ops_lock);
|
|
|
|
return ret;
|
|
}
|
|
|
|
static int
|
|
ice_flow_flush(struct rte_eth_dev *dev,
|
|
struct rte_flow_error *error)
|
|
{
|
|
struct ice_pf *pf = ICE_DEV_PRIVATE_TO_PF(dev->data->dev_private);
|
|
struct rte_flow *p_flow;
|
|
void *temp;
|
|
int ret = 0;
|
|
|
|
RTE_TAILQ_FOREACH_SAFE(p_flow, &pf->flow_list, node, temp) {
|
|
ret = ice_flow_destroy(dev, p_flow, error);
|
|
if (ret) {
|
|
PMD_DRV_LOG(ERR, "Failed to flush flows");
|
|
return -EINVAL;
|
|
}
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
static int
|
|
ice_flow_query(struct rte_eth_dev *dev,
|
|
struct rte_flow *flow,
|
|
const struct rte_flow_action *actions,
|
|
void *data,
|
|
struct rte_flow_error *error)
|
|
{
|
|
int ret = -EINVAL;
|
|
struct ice_adapter *ad =
|
|
ICE_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private);
|
|
struct rte_flow_query_count *count = data;
|
|
struct ice_pf *pf = &ad->pf;
|
|
|
|
if (!flow || !flow->engine || !flow->engine->query_count) {
|
|
rte_flow_error_set(error, EINVAL,
|
|
RTE_FLOW_ERROR_TYPE_HANDLE,
|
|
NULL, "Invalid flow");
|
|
return -rte_errno;
|
|
}
|
|
|
|
rte_spinlock_lock(&pf->flow_ops_lock);
|
|
|
|
for (; actions->type != RTE_FLOW_ACTION_TYPE_END; actions++) {
|
|
switch (actions->type) {
|
|
case RTE_FLOW_ACTION_TYPE_VOID:
|
|
break;
|
|
case RTE_FLOW_ACTION_TYPE_COUNT:
|
|
ret = flow->engine->query_count(ad, flow, count, error);
|
|
break;
|
|
default:
|
|
ret = rte_flow_error_set(error, ENOTSUP,
|
|
RTE_FLOW_ERROR_TYPE_ACTION,
|
|
actions,
|
|
"action not supported");
|
|
goto out;
|
|
}
|
|
}
|
|
|
|
out:
|
|
rte_spinlock_unlock(&pf->flow_ops_lock);
|
|
return ret;
|
|
}
|
|
|
|
int
|
|
ice_flow_redirect(struct ice_adapter *ad,
|
|
struct ice_flow_redirect *rd)
|
|
{
|
|
struct ice_pf *pf = &ad->pf;
|
|
struct rte_flow *p_flow;
|
|
void *temp;
|
|
int ret = 0;
|
|
|
|
rte_spinlock_lock(&pf->flow_ops_lock);
|
|
|
|
RTE_TAILQ_FOREACH_SAFE(p_flow, &pf->flow_list, node, temp) {
|
|
if (!p_flow->engine->redirect)
|
|
continue;
|
|
ret = p_flow->engine->redirect(ad, p_flow, rd);
|
|
if (ret) {
|
|
PMD_DRV_LOG(ERR, "Failed to redirect flows");
|
|
break;
|
|
}
|
|
}
|
|
|
|
rte_spinlock_unlock(&pf->flow_ops_lock);
|
|
|
|
return ret;
|
|
}
|