get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/85268/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 85268,
    "url": "https://patches.dpdk.org/api/patches/85268/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/20201217013715.25499-1-johndale@cisco.com/",
    "project": {
        "id": 1,
        "url": "https://patches.dpdk.org/api/projects/1/?format=api",
        "name": "DPDK",
        "link_name": "dpdk",
        "list_id": "dev.dpdk.org",
        "list_email": "dev@dpdk.org",
        "web_url": "http://core.dpdk.org",
        "scm_url": "git://dpdk.org/dpdk",
        "webscm_url": "http://git.dpdk.org/dpdk",
        "list_archive_url": "https://inbox.dpdk.org/dev",
        "list_archive_url_format": "https://inbox.dpdk.org/dev/{}",
        "commit_url_format": ""
    },
    "msgid": "<20201217013715.25499-1-johndale@cisco.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20201217013715.25499-1-johndale@cisco.com",
    "date": "2020-12-17T01:37:15",
    "name": "net/enic: remove deprecated FDIR code",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "97753bd77b48056ceed77352dcfb6e83635c44b4",
    "submitter": {
        "id": 359,
        "url": "https://patches.dpdk.org/api/people/359/?format=api",
        "name": "John Daley (johndale)",
        "email": "johndale@cisco.com"
    },
    "delegate": {
        "id": 319,
        "url": "https://patches.dpdk.org/api/users/319/?format=api",
        "username": "fyigit",
        "first_name": "Ferruh",
        "last_name": "Yigit",
        "email": "ferruh.yigit@amd.com"
    },
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/20201217013715.25499-1-johndale@cisco.com/mbox/",
    "series": [
        {
            "id": 14337,
            "url": "https://patches.dpdk.org/api/series/14337/?format=api",
            "web_url": "https://patches.dpdk.org/project/dpdk/list/?series=14337",
            "date": "2020-12-17T01:37:15",
            "name": "net/enic: remove deprecated FDIR code",
            "version": 1,
            "mbox": "https://patches.dpdk.org/series/14337/mbox/"
        }
    ],
    "comments": "https://patches.dpdk.org/api/patches/85268/comments/",
    "check": "warning",
    "checks": "https://patches.dpdk.org/api/patches/85268/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@inbox.dpdk.org",
        "Delivered-To": "patchwork@inbox.dpdk.org",
        "Received": [
            "from dpdk.org (dpdk.org [92.243.14.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id C5EA8A09F0;\n\tThu, 17 Dec 2020 02:37:28 +0100 (CET)",
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id 1CD68C9DC;\n\tThu, 17 Dec 2020 02:37:27 +0100 (CET)",
            "from rcdn-iport-5.cisco.com (rcdn-iport-5.cisco.com [173.37.86.76])\n by dpdk.org (Postfix) with ESMTP id 798BBC9D4\n for <dev@dpdk.org>; Thu, 17 Dec 2020 02:37:24 +0100 (CET)",
            "from rcdn-core-5.cisco.com ([173.37.93.156])\n by rcdn-iport-5.cisco.com with ESMTP/TLS/DHE-RSA-SEED-SHA;\n 17 Dec 2020 01:37:22 +0000",
            "from cisco.com (savbu-usnic-a.cisco.com [10.193.184.48])\n by rcdn-core-5.cisco.com (8.15.2/8.15.2) with ESMTP id 0BH1bMIh020404;\n Thu, 17 Dec 2020 01:37:22 GMT",
            "by cisco.com (Postfix, from userid 392789)\n id CD50420F2005; Wed, 16 Dec 2020 17:37:21 -0800 (PST)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple;\n d=cisco.com; i=@cisco.com; l=18894; q=dns/txt;\n s=iport; t=1608169044; x=1609378644;\n h=from:to:cc:subject:date:message-id:mime-version:\n content-transfer-encoding;\n bh=jueSwvdzVG7zjRp1sBvv3dIi2yicEqjzmEhqTakmquM=;\n b=OfqA/vpgi2Kq60RsAzfY7GVmWtHkxXUUU1MaxZi2XY4fGJVNQ5zEQzNA\n /gMFDNU6bkHa+dbnlEU8qCU+lXH3FdFjXWT/ElTQWXbIkrH+oPwHR8V+C\n WC8hKR3VSOV1ynIz/X+8KC5RzLGwmHRyMTnXpjrMgTMVrq4pBQO3stfBM c=;",
        "X-IronPort-AV": "E=Sophos;i=\"5.78,425,1599523200\"; d=\"scan'208\";a=\"571849119\"",
        "From": "John Daley <johndale@cisco.com>",
        "To": "ferruh.yigit@intel.com, arybchenko@solarflare.com",
        "Cc": "dev@dpdk.org, John Daley <johndale@cisco.com>,\n Hyong Youb Kim <hyonkim@cisco.com>",
        "Date": "Wed, 16 Dec 2020 17:37:15 -0800",
        "Message-Id": "<20201217013715.25499-1-johndale@cisco.com>",
        "X-Mailer": "git-send-email 2.26.2",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "X-Outbound-SMTP-Client": "10.193.184.48, savbu-usnic-a.cisco.com",
        "X-Outbound-Node": "rcdn-core-5.cisco.com",
        "Subject": "[dpdk-dev] [PATCH] net/enic: remove deprecated FDIR code",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n <mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n <mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "The Flow Director (FDIR) API was removed in release 20.11.\nThis patch removes the remainder of the FDIR code in the\nPMD.\n\nSigned-off-by: John Daley <johndale@cisco.com>\nReviewed-by: Hyong Youb Kim <hyonkim@cisco.com>\n---\n drivers/net/enic/enic.h               |  23 --\n drivers/net/enic/enic_clsf.c          | 334 --------------------------\n drivers/net/enic/enic_flow.c          |   5 +-\n drivers/net/enic/enic_fm_flow.c       |   4 +\n drivers/net/enic/enic_main.c          |   7 -\n drivers/net/enic/enic_rxtx_vec_avx2.c |   5 -\n drivers/net/enic/meson.build          |   1 -\n 7 files changed, 8 insertions(+), 371 deletions(-)\n delete mode 100644 drivers/net/enic/enic_clsf.c",
    "diff": "diff --git a/drivers/net/enic/enic.h b/drivers/net/enic/enic.h\nindex 079f194275..4ee75253cc 100644\n--- a/drivers/net/enic/enic.h\n+++ b/drivers/net/enic/enic.h\n@@ -51,8 +51,6 @@\n /* Special Filter id for non-specific packet flagging. Don't change value */\n #define ENIC_MAGIC_FILTER_ID 0xffff\n \n-#define ENICPMD_FDIR_MAX           64\n-\n /*\n  * Interrupt 0: LSC and errors\n  * Interrupt 1: rx queue 0\n@@ -62,23 +60,6 @@\n #define ENICPMD_LSC_INTR_OFFSET 0\n #define ENICPMD_RXQ_INTR_OFFSET 1\n \n-struct enic_fdir_node {\n-\tstruct rte_eth_fdir_filter filter;\n-\tuint16_t fltr_id;\n-\tuint16_t rq_index;\n-};\n-\n-struct enic_fdir {\n-\tstruct rte_eth_fdir_stats stats;\n-\tstruct rte_hash *hash;\n-\tstruct enic_fdir_node *nodes[ENICPMD_FDIR_MAX];\n-\tuint32_t modes;\n-\tuint32_t types_mask;\n-\tvoid (*copy_fltr_fn)(struct filter_v2 *filt,\n-\t\t\t     const struct rte_eth_fdir_input *input,\n-\t\t\t     const struct rte_eth_fdir_masks *masks);\n-};\n-\n struct enic_soft_stats {\n \trte_atomic64_t rx_nombuf;\n \trte_atomic64_t rx_packet_errors;\n@@ -120,7 +101,6 @@ struct enic {\n \tbool overlay_offload;\n \tstruct rte_eth_dev *rte_dev;\n \tstruct rte_eth_dev_data *dev_data;\n-\tstruct enic_fdir fdir;\n \tchar bdf_name[ENICPMD_BDF_LENGTH];\n \tint dev_fd;\n \tint iommu_group_fd;\n@@ -431,8 +411,6 @@ void enic_send_pkt(struct enic *enic, struct vnic_wq *wq,\n \n void enic_post_wq_index(struct vnic_wq *wq);\n int enic_probe(struct enic *enic);\n-int enic_clsf_init(struct enic *enic);\n-void enic_clsf_destroy(struct enic *enic);\n int enic_fm_init(struct enic *enic);\n void enic_fm_destroy(struct enic *enic);\n void *enic_alloc_consistent(void *priv, size_t size, dma_addr_t *dma_handle,\n@@ -457,7 +435,6 @@ int enic_link_update(struct rte_eth_dev *eth_dev);\n bool enic_use_vector_rx_handler(struct rte_eth_dev *eth_dev);\n void enic_pick_rx_handler(struct rte_eth_dev *eth_dev);\n void enic_pick_tx_handler(struct rte_eth_dev *eth_dev);\n-void enic_fdir_info(struct enic *enic);\n int enic_vf_representor_init(struct rte_eth_dev *eth_dev, void *init_params);\n int enic_vf_representor_uninit(struct rte_eth_dev *ethdev);\n int enic_fm_allocate_switch_domain(struct enic *pf);\ndiff --git a/drivers/net/enic/enic_clsf.c b/drivers/net/enic/enic_clsf.c\ndeleted file mode 100644\nindex 1c837a4d09..0000000000\n--- a/drivers/net/enic/enic_clsf.c\n+++ /dev/null\n@@ -1,334 +0,0 @@\n-/* SPDX-License-Identifier: BSD-3-Clause\n- * Copyright 2008-2017 Cisco Systems, Inc.  All rights reserved.\n- * Copyright 2007 Nuova Systems, Inc.  All rights reserved.\n- */\n-\n-#include <rte_ethdev_driver.h>\n-#include <rte_malloc.h>\n-#include <rte_hash.h>\n-#include <rte_byteorder.h>\n-#include <rte_ip.h>\n-#include <rte_tcp.h>\n-#include <rte_udp.h>\n-#include <rte_sctp.h>\n-\n-#include \"enic_compat.h\"\n-#include \"enic.h\"\n-#include \"wq_enet_desc.h\"\n-#include \"rq_enet_desc.h\"\n-#include \"cq_enet_desc.h\"\n-#include \"vnic_enet.h\"\n-#include \"vnic_dev.h\"\n-#include \"vnic_wq.h\"\n-#include \"vnic_rq.h\"\n-#include \"vnic_cq.h\"\n-#include \"vnic_intr.h\"\n-#include \"vnic_nic.h\"\n-\n-#ifdef RTE_ARCH_X86\n-#include <rte_hash_crc.h>\n-#define DEFAULT_HASH_FUNC       rte_hash_crc\n-#else\n-#include <rte_jhash.h>\n-#define DEFAULT_HASH_FUNC       rte_jhash\n-#endif\n-\n-#define ENICPMD_CLSF_HASH_ENTRIES       ENICPMD_FDIR_MAX\n-\n-static void copy_fltr_v1(struct filter_v2 *fltr,\n-\t\tconst struct rte_eth_fdir_input *input,\n-\t\tconst struct rte_eth_fdir_masks *masks);\n-static void copy_fltr_v2(struct filter_v2 *fltr,\n-\t\tconst struct rte_eth_fdir_input *input,\n-\t\tconst struct rte_eth_fdir_masks *masks);\n-\n-void enic_fdir_info(struct enic *enic)\n-{\n-\tenic->fdir.modes = (uint32_t)RTE_FDIR_MODE_PERFECT;\n-\tenic->fdir.types_mask  = 1 << RTE_ETH_FLOW_NONFRAG_IPV4_UDP |\n-\t\t\t\t 1 << RTE_ETH_FLOW_NONFRAG_IPV4_TCP;\n-\tif (enic->adv_filters) {\n-\t\tenic->fdir.types_mask |= 1 << RTE_ETH_FLOW_NONFRAG_IPV4_OTHER |\n-\t\t\t\t\t 1 << RTE_ETH_FLOW_NONFRAG_IPV4_SCTP |\n-\t\t\t\t\t 1 << RTE_ETH_FLOW_NONFRAG_IPV6_UDP |\n-\t\t\t\t\t 1 << RTE_ETH_FLOW_NONFRAG_IPV6_TCP |\n-\t\t\t\t\t 1 << RTE_ETH_FLOW_NONFRAG_IPV6_SCTP |\n-\t\t\t\t\t 1 << RTE_ETH_FLOW_NONFRAG_IPV6_OTHER;\n-\t\tenic->fdir.copy_fltr_fn = copy_fltr_v2;\n-\t} else {\n-\t\tenic->fdir.copy_fltr_fn = copy_fltr_v1;\n-\t}\n-}\n-\n-static void\n-enic_set_layer(struct filter_generic_1 *gp, unsigned int flag,\n-\t       enum filter_generic_1_layer layer, void *mask, void *val,\n-\t       unsigned int len)\n-{\n-\tgp->mask_flags |= flag;\n-\tgp->val_flags |= gp->mask_flags;\n-\tmemcpy(gp->layer[layer].mask, mask, len);\n-\tmemcpy(gp->layer[layer].val, val, len);\n-}\n-\n-/* Copy Flow Director filter to a VIC ipv4 filter (for Cisco VICs\n- * without advanced filter support.\n- */\n-static void\n-copy_fltr_v1(struct filter_v2 *fltr, const struct rte_eth_fdir_input *input,\n-\t     __rte_unused const struct rte_eth_fdir_masks *masks)\n-{\n-\tfltr->type = FILTER_IPV4_5TUPLE;\n-\tfltr->u.ipv4.src_addr = rte_be_to_cpu_32(\n-\t\tinput->flow.ip4_flow.src_ip);\n-\tfltr->u.ipv4.dst_addr = rte_be_to_cpu_32(\n-\t\tinput->flow.ip4_flow.dst_ip);\n-\tfltr->u.ipv4.src_port = rte_be_to_cpu_16(\n-\t\tinput->flow.udp4_flow.src_port);\n-\tfltr->u.ipv4.dst_port = rte_be_to_cpu_16(\n-\t\tinput->flow.udp4_flow.dst_port);\n-\n-\tif (input->flow_type == RTE_ETH_FLOW_NONFRAG_IPV4_TCP)\n-\t\tfltr->u.ipv4.protocol = PROTO_TCP;\n-\telse\n-\t\tfltr->u.ipv4.protocol = PROTO_UDP;\n-\n-\tfltr->u.ipv4.flags = FILTER_FIELDS_IPV4_5TUPLE;\n-}\n-\n-/* Copy Flow Director filter to a VIC generic filter (requires advanced\n- * filter support.\n- */\n-static void\n-copy_fltr_v2(struct filter_v2 *fltr, const struct rte_eth_fdir_input *input,\n-\t     const struct rte_eth_fdir_masks *masks)\n-{\n-\tstruct filter_generic_1 *gp = &fltr->u.generic_1;\n-\n-\tfltr->type = FILTER_DPDK_1;\n-\tmemset(gp, 0, sizeof(*gp));\n-\n-\tif (input->flow_type == RTE_ETH_FLOW_NONFRAG_IPV4_UDP) {\n-\t\tstruct rte_udp_hdr udp_mask, udp_val;\n-\t\tmemset(&udp_mask, 0, sizeof(udp_mask));\n-\t\tmemset(&udp_val, 0, sizeof(udp_val));\n-\n-\t\tif (input->flow.udp4_flow.src_port) {\n-\t\t\tudp_mask.src_port = masks->src_port_mask;\n-\t\t\tudp_val.src_port = input->flow.udp4_flow.src_port;\n-\t\t}\n-\t\tif (input->flow.udp4_flow.dst_port) {\n-\t\t\tudp_mask.dst_port = masks->dst_port_mask;\n-\t\t\tudp_val.dst_port = input->flow.udp4_flow.dst_port;\n-\t\t}\n-\n-\t\tenic_set_layer(gp, FILTER_GENERIC_1_UDP, FILTER_GENERIC_1_L4,\n-\t\t\t       &udp_mask, &udp_val, sizeof(struct rte_udp_hdr));\n-\t} else if (input->flow_type == RTE_ETH_FLOW_NONFRAG_IPV4_TCP) {\n-\t\tstruct rte_tcp_hdr tcp_mask, tcp_val;\n-\t\tmemset(&tcp_mask, 0, sizeof(tcp_mask));\n-\t\tmemset(&tcp_val, 0, sizeof(tcp_val));\n-\n-\t\tif (input->flow.tcp4_flow.src_port) {\n-\t\t\ttcp_mask.src_port = masks->src_port_mask;\n-\t\t\ttcp_val.src_port = input->flow.tcp4_flow.src_port;\n-\t\t}\n-\t\tif (input->flow.tcp4_flow.dst_port) {\n-\t\t\ttcp_mask.dst_port = masks->dst_port_mask;\n-\t\t\ttcp_val.dst_port = input->flow.tcp4_flow.dst_port;\n-\t\t}\n-\n-\t\tenic_set_layer(gp, FILTER_GENERIC_1_TCP, FILTER_GENERIC_1_L4,\n-\t\t\t       &tcp_mask, &tcp_val, sizeof(struct rte_tcp_hdr));\n-\t} else if (input->flow_type == RTE_ETH_FLOW_NONFRAG_IPV4_SCTP) {\n-\t\tstruct rte_sctp_hdr sctp_mask, sctp_val;\n-\t\tmemset(&sctp_mask, 0, sizeof(sctp_mask));\n-\t\tmemset(&sctp_val, 0, sizeof(sctp_val));\n-\n-\t\tif (input->flow.sctp4_flow.src_port) {\n-\t\t\tsctp_mask.src_port = masks->src_port_mask;\n-\t\t\tsctp_val.src_port = input->flow.sctp4_flow.src_port;\n-\t\t}\n-\t\tif (input->flow.sctp4_flow.dst_port) {\n-\t\t\tsctp_mask.dst_port = masks->dst_port_mask;\n-\t\t\tsctp_val.dst_port = input->flow.sctp4_flow.dst_port;\n-\t\t}\n-\t\tif (input->flow.sctp4_flow.verify_tag) {\n-\t\t\tsctp_mask.tag = 0xffffffff;\n-\t\t\tsctp_val.tag = input->flow.sctp4_flow.verify_tag;\n-\t\t}\n-\n-\t\t/*\n-\t\t * Unlike UDP/TCP (FILTER_GENERIC_1_{UDP,TCP}), the firmware\n-\t\t * has no \"packet is SCTP\" flag. Use flag=0 (generic L4) and\n-\t\t * manually set proto_id=sctp below.\n-\t\t */\n-\t\tenic_set_layer(gp, 0, FILTER_GENERIC_1_L4, &sctp_mask,\n-\t\t\t       &sctp_val, sizeof(struct rte_sctp_hdr));\n-\t}\n-\n-\tif (input->flow_type == RTE_ETH_FLOW_NONFRAG_IPV4_UDP ||\n-\t    input->flow_type == RTE_ETH_FLOW_NONFRAG_IPV4_TCP ||\n-\t    input->flow_type == RTE_ETH_FLOW_NONFRAG_IPV4_SCTP ||\n-\t    input->flow_type == RTE_ETH_FLOW_NONFRAG_IPV4_OTHER) {\n-\t\tstruct rte_ipv4_hdr ip4_mask, ip4_val;\n-\t\tmemset(&ip4_mask, 0, sizeof(struct rte_ipv4_hdr));\n-\t\tmemset(&ip4_val, 0, sizeof(struct rte_ipv4_hdr));\n-\n-\t\tif (input->flow.ip4_flow.tos) {\n-\t\t\tip4_mask.type_of_service = masks->ipv4_mask.tos;\n-\t\t\tip4_val.type_of_service = input->flow.ip4_flow.tos;\n-\t\t}\n-\t\tif (input->flow.ip4_flow.ttl) {\n-\t\t\tip4_mask.time_to_live = masks->ipv4_mask.ttl;\n-\t\t\tip4_val.time_to_live = input->flow.ip4_flow.ttl;\n-\t\t}\n-\t\tif (input->flow.ip4_flow.proto) {\n-\t\t\tip4_mask.next_proto_id = masks->ipv4_mask.proto;\n-\t\t\tip4_val.next_proto_id = input->flow.ip4_flow.proto;\n-\t\t} else if (input->flow_type == RTE_ETH_FLOW_NONFRAG_IPV4_SCTP) {\n-\t\t\t/* Explicitly match the SCTP protocol number */\n-\t\t\tip4_mask.next_proto_id = 0xff;\n-\t\t\tip4_val.next_proto_id = IPPROTO_SCTP;\n-\t\t}\n-\t\tif (input->flow.ip4_flow.src_ip) {\n-\t\t\tip4_mask.src_addr =  masks->ipv4_mask.src_ip;\n-\t\t\tip4_val.src_addr = input->flow.ip4_flow.src_ip;\n-\t\t}\n-\t\tif (input->flow.ip4_flow.dst_ip) {\n-\t\t\tip4_mask.dst_addr =  masks->ipv4_mask.dst_ip;\n-\t\t\tip4_val.dst_addr = input->flow.ip4_flow.dst_ip;\n-\t\t}\n-\n-\t\tenic_set_layer(gp, FILTER_GENERIC_1_IPV4, FILTER_GENERIC_1_L3,\n-\t\t\t&ip4_mask, &ip4_val, sizeof(struct rte_ipv4_hdr));\n-\t}\n-\n-\tif (input->flow_type == RTE_ETH_FLOW_NONFRAG_IPV6_UDP) {\n-\t\tstruct rte_udp_hdr udp_mask, udp_val;\n-\t\tmemset(&udp_mask, 0, sizeof(udp_mask));\n-\t\tmemset(&udp_val, 0, sizeof(udp_val));\n-\n-\t\tif (input->flow.udp6_flow.src_port) {\n-\t\t\tudp_mask.src_port = masks->src_port_mask;\n-\t\t\tudp_val.src_port = input->flow.udp6_flow.src_port;\n-\t\t}\n-\t\tif (input->flow.udp6_flow.dst_port) {\n-\t\t\tudp_mask.dst_port = masks->dst_port_mask;\n-\t\t\tudp_val.dst_port = input->flow.udp6_flow.dst_port;\n-\t\t}\n-\t\tenic_set_layer(gp, FILTER_GENERIC_1_UDP, FILTER_GENERIC_1_L4,\n-\t\t\t       &udp_mask, &udp_val, sizeof(struct rte_udp_hdr));\n-\t} else if (input->flow_type == RTE_ETH_FLOW_NONFRAG_IPV6_TCP) {\n-\t\tstruct rte_tcp_hdr tcp_mask, tcp_val;\n-\t\tmemset(&tcp_mask, 0, sizeof(tcp_mask));\n-\t\tmemset(&tcp_val, 0, sizeof(tcp_val));\n-\n-\t\tif (input->flow.tcp6_flow.src_port) {\n-\t\t\ttcp_mask.src_port = masks->src_port_mask;\n-\t\t\ttcp_val.src_port = input->flow.tcp6_flow.src_port;\n-\t\t}\n-\t\tif (input->flow.tcp6_flow.dst_port) {\n-\t\t\ttcp_mask.dst_port = masks->dst_port_mask;\n-\t\t\ttcp_val.dst_port = input->flow.tcp6_flow.dst_port;\n-\t\t}\n-\t\tenic_set_layer(gp, FILTER_GENERIC_1_TCP, FILTER_GENERIC_1_L4,\n-\t\t\t       &tcp_mask, &tcp_val, sizeof(struct rte_tcp_hdr));\n-\t} else if (input->flow_type == RTE_ETH_FLOW_NONFRAG_IPV6_SCTP) {\n-\t\tstruct rte_sctp_hdr sctp_mask, sctp_val;\n-\t\tmemset(&sctp_mask, 0, sizeof(sctp_mask));\n-\t\tmemset(&sctp_val, 0, sizeof(sctp_val));\n-\n-\t\tif (input->flow.sctp6_flow.src_port) {\n-\t\t\tsctp_mask.src_port = masks->src_port_mask;\n-\t\t\tsctp_val.src_port = input->flow.sctp6_flow.src_port;\n-\t\t}\n-\t\tif (input->flow.sctp6_flow.dst_port) {\n-\t\t\tsctp_mask.dst_port = masks->dst_port_mask;\n-\t\t\tsctp_val.dst_port = input->flow.sctp6_flow.dst_port;\n-\t\t}\n-\t\tif (input->flow.sctp6_flow.verify_tag) {\n-\t\t\tsctp_mask.tag = 0xffffffff;\n-\t\t\tsctp_val.tag = input->flow.sctp6_flow.verify_tag;\n-\t\t}\n-\n-\t\tenic_set_layer(gp, 0, FILTER_GENERIC_1_L4, &sctp_mask,\n-\t\t\t       &sctp_val, sizeof(struct rte_sctp_hdr));\n-\t}\n-\n-\tif (input->flow_type == RTE_ETH_FLOW_NONFRAG_IPV6_UDP ||\n-\t    input->flow_type == RTE_ETH_FLOW_NONFRAG_IPV6_TCP ||\n-\t    input->flow_type == RTE_ETH_FLOW_NONFRAG_IPV6_SCTP ||\n-\t    input->flow_type == RTE_ETH_FLOW_NONFRAG_IPV6_OTHER) {\n-\t\tstruct rte_ipv6_hdr ipv6_mask, ipv6_val;\n-\t\tmemset(&ipv6_mask, 0, sizeof(struct rte_ipv6_hdr));\n-\t\tmemset(&ipv6_val, 0, sizeof(struct rte_ipv6_hdr));\n-\n-\t\tif (input->flow.ipv6_flow.proto) {\n-\t\t\tipv6_mask.proto = masks->ipv6_mask.proto;\n-\t\t\tipv6_val.proto = input->flow.ipv6_flow.proto;\n-\t\t} else if (input->flow_type == RTE_ETH_FLOW_NONFRAG_IPV6_SCTP) {\n-\t\t\t/* See comments for IPv4 SCTP above. */\n-\t\t\tipv6_mask.proto = 0xff;\n-\t\t\tipv6_val.proto = IPPROTO_SCTP;\n-\t\t}\n-\t\tmemcpy(ipv6_mask.src_addr, masks->ipv6_mask.src_ip,\n-\t\t       sizeof(ipv6_mask.src_addr));\n-\t\tmemcpy(ipv6_val.src_addr, input->flow.ipv6_flow.src_ip,\n-\t\t       sizeof(ipv6_val.src_addr));\n-\t\tmemcpy(ipv6_mask.dst_addr, masks->ipv6_mask.dst_ip,\n-\t\t       sizeof(ipv6_mask.dst_addr));\n-\t\tmemcpy(ipv6_val.dst_addr, input->flow.ipv6_flow.dst_ip,\n-\t\t       sizeof(ipv6_val.dst_addr));\n-\t\tif (input->flow.ipv6_flow.tc) {\n-\t\t\tipv6_mask.vtc_flow = masks->ipv6_mask.tc << 12;\n-\t\t\tipv6_val.vtc_flow = input->flow.ipv6_flow.tc << 12;\n-\t\t}\n-\t\tif (input->flow.ipv6_flow.hop_limits) {\n-\t\t\tipv6_mask.hop_limits = masks->ipv6_mask.hop_limits;\n-\t\t\tipv6_val.hop_limits = input->flow.ipv6_flow.hop_limits;\n-\t\t}\n-\n-\t\tenic_set_layer(gp, FILTER_GENERIC_1_IPV6, FILTER_GENERIC_1_L3,\n-\t\t\t&ipv6_mask, &ipv6_val, sizeof(struct rte_ipv6_hdr));\n-\t}\n-}\n-\n-void enic_clsf_destroy(struct enic *enic)\n-{\n-\tuint32_t index;\n-\tstruct enic_fdir_node *key;\n-\t/* delete classifier entries */\n-\tfor (index = 0; index < ENICPMD_FDIR_MAX; index++) {\n-\t\tkey = enic->fdir.nodes[index];\n-\t\tif (key) {\n-\t\t\tvnic_dev_classifier(enic->vdev, CLSF_DEL,\n-\t\t\t\t&key->fltr_id, NULL, NULL);\n-\t\t\trte_free(key);\n-\t\t\tenic->fdir.nodes[index] = NULL;\n-\t\t}\n-\t}\n-\n-\tif (enic->fdir.hash) {\n-\t\trte_hash_free(enic->fdir.hash);\n-\t\tenic->fdir.hash = NULL;\n-\t}\n-}\n-\n-int enic_clsf_init(struct enic *enic)\n-{\n-\tchar clsf_name[RTE_HASH_NAMESIZE];\n-\tstruct rte_hash_parameters hash_params = {\n-\t\t.name = clsf_name,\n-\t\t.entries = ENICPMD_CLSF_HASH_ENTRIES,\n-\t\t.key_len = sizeof(struct rte_eth_fdir_filter),\n-\t\t.hash_func = DEFAULT_HASH_FUNC,\n-\t\t.hash_func_init_val = 0,\n-\t\t.socket_id = SOCKET_ID_ANY,\n-\t};\n-\tsnprintf(clsf_name, RTE_HASH_NAMESIZE, \"enic_clsf_%s\", enic->bdf_name);\n-\tenic->fdir.hash = rte_hash_create(&hash_params);\n-\tmemset(&enic->fdir.stats, 0, sizeof(enic->fdir.stats));\n-\tenic->fdir.stats.free = ENICPMD_FDIR_MAX;\n-\treturn NULL == enic->fdir.hash;\n-}\ndiff --git a/drivers/net/enic/enic_flow.c b/drivers/net/enic/enic_flow.c\nindex cebca7d55a..1eec96abca 100644\n--- a/drivers/net/enic/enic_flow.c\n+++ b/drivers/net/enic/enic_flow.c\n@@ -1208,7 +1208,8 @@ enic_copy_action_v2(struct enic *enic,\n \t\t\tconst struct rte_flow_action_mark *mark =\n \t\t\t\t(const struct rte_flow_action_mark *)\n \t\t\t\tactions->conf;\n-\n+\t\t\tif (enic->use_noscatter_vec_rx_handler)\n+\t\t\t\treturn ENOTSUP;\n \t\t\tif (overlap & MARK)\n \t\t\t\treturn ENOTSUP;\n \t\t\toverlap |= MARK;\n@@ -1228,6 +1229,8 @@ enic_copy_action_v2(struct enic *enic,\n \t\t\tbreak;\n \t\t}\n \t\tcase RTE_FLOW_ACTION_TYPE_FLAG: {\n+\t\t\tif (enic->use_noscatter_vec_rx_handler)\n+\t\t\t\treturn ENOTSUP;\n \t\t\tif (overlap & MARK)\n \t\t\t\treturn ENOTSUP;\n \t\t\toverlap |= MARK;\ndiff --git a/drivers/net/enic/enic_fm_flow.c b/drivers/net/enic/enic_fm_flow.c\nindex 86b91ed8b1..ad1e89a581 100644\n--- a/drivers/net/enic/enic_fm_flow.c\n+++ b/drivers/net/enic/enic_fm_flow.c\n@@ -1314,6 +1314,8 @@ enic_fm_copy_action(struct enic_flowman *fm,\n \t\t\tconst struct rte_flow_action_mark *mark =\n \t\t\t\tactions->conf;\n \n+\t\t\tif (enic->use_noscatter_vec_rx_handler)\n+\t\t\t\tgoto unsupported;\n \t\t\tif (mark->id >= ENIC_MAGIC_FILTER_ID - 1)\n \t\t\t\treturn rte_flow_error_set(error, EINVAL,\n \t\t\t\t\tRTE_FLOW_ERROR_TYPE_ACTION,\n@@ -1327,6 +1329,8 @@ enic_fm_copy_action(struct enic_flowman *fm,\n \t\t\tbreak;\n \t\t}\n \t\tcase RTE_FLOW_ACTION_TYPE_FLAG: {\n+\t\t\tif (enic->use_noscatter_vec_rx_handler)\n+\t\t\t\tgoto unsupported;\n \t\t\t/* ENIC_MAGIC_FILTER_ID is reserved for flagging */\n \t\t\tmemset(&fm_op, 0, sizeof(fm_op));\n \t\t\tfm_op.fa_op = FMOP_MARK;\ndiff --git a/drivers/net/enic/enic_main.c b/drivers/net/enic/enic_main.c\nindex d0d41035fd..755c0bf164 100644\n--- a/drivers/net/enic/enic_main.c\n+++ b/drivers/net/enic/enic_main.c\n@@ -603,9 +603,6 @@ int enic_enable(struct enic *enic)\n \terr = enic_rxq_intr_init(enic);\n \tif (err)\n \t\treturn err;\n-\tif (enic_clsf_init(enic))\n-\t\tdev_warning(enic, \"Init of hash table for clsf failed.\"\\\n-\t\t\t\"Flow director feature will not work\\n\");\n \n \t/* Initialize flowman if not already initialized during probe */\n \tif (enic->fm == NULL && enic_fm_init(enic))\n@@ -1102,7 +1099,6 @@ int enic_disable(struct enic *enic)\n \n \tvnic_dev_disable(enic->vdev);\n \n-\tenic_clsf_destroy(enic);\n \tenic_fm_destroy(enic);\n \n \tif (!enic_is_sriov_vf(enic))\n@@ -1753,9 +1749,6 @@ static int enic_dev_init(struct enic *enic)\n \t\treturn -1;\n \t}\n \n-\t/* Get the supported filters */\n-\tenic_fdir_info(enic);\n-\n \teth_dev->data->mac_addrs = rte_zmalloc(\"enic_mac_addr\",\n \t\t\t\t\tsizeof(struct rte_ether_addr) *\n \t\t\t\t\tENIC_UNICAST_PERFECT_FILTERS, 0);\ndiff --git a/drivers/net/enic/enic_rxtx_vec_avx2.c b/drivers/net/enic/enic_rxtx_vec_avx2.c\nindex d39021f30c..f0bea33423 100644\n--- a/drivers/net/enic/enic_rxtx_vec_avx2.c\n+++ b/drivers/net/enic/enic_rxtx_vec_avx2.c\n@@ -810,7 +810,6 @@ bool\n enic_use_vector_rx_handler(struct rte_eth_dev *eth_dev)\n {\n \tstruct enic *enic = pmd_priv(eth_dev);\n-\tstruct rte_fdir_conf *fconf;\n \n \t/* User needs to request for the avx2 handler */\n \tif (!enic->enable_avx2_rx)\n@@ -818,10 +817,6 @@ enic_use_vector_rx_handler(struct rte_eth_dev *eth_dev)\n \t/* Do not support scatter Rx */\n \tif (!(enic->rq_count > 0 && enic->rq[0].data_queue_enable == 0))\n \t\treturn false;\n-\t/* Do not support fdir/flow */\n-\tfconf = &eth_dev->data->dev_conf.fdir_conf;\n-\tif (fconf->mode != RTE_FDIR_MODE_NONE)\n-\t\treturn false;\n \tif (rte_cpu_get_flag_enabled(RTE_CPUFLAG_AVX2) &&\n \t\t\trte_vect_get_max_simd_bitwidth() >= RTE_VECT_SIMD_256) {\n \t\tENICPMD_LOG(DEBUG, \" use the non-scatter avx2 Rx handler\");\ndiff --git a/drivers/net/enic/meson.build b/drivers/net/enic/meson.build\nindex 86ef2a8a28..32c3312e80 100644\n--- a/drivers/net/enic/meson.build\n+++ b/drivers/net/enic/meson.build\n@@ -7,7 +7,6 @@ sources = files(\n \t'base/vnic_intr.c',\n \t'base/vnic_rq.c',\n \t'base/vnic_wq.c',\n-\t'enic_clsf.c',\n \t'enic_ethdev.c',\n \t'enic_flow.c',\n \t'enic_fm_flow.c',\n",
    "prefixes": []
}