get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 129795,
    "url": "http://patchwork.dpdk.org/api/patches/129795/?format=api",
    "web_url": "http://patchwork.dpdk.org/project/dpdk/patch/20230801160500.67480-2-stephen@networkplumber.org/",
    "project": {
        "id": 1,
        "url": "http://patchwork.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": "<20230801160500.67480-2-stephen@networkplumber.org>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20230801160500.67480-2-stephen@networkplumber.org",
    "date": "2023-08-01T16:04:59",
    "name": "[v2,1/2] flow_classify: remove library",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "fa9fad841ee6905d249b055c8b3d7c2ddd484438",
    "submitter": {
        "id": 27,
        "url": "http://patchwork.dpdk.org/api/people/27/?format=api",
        "name": "Stephen Hemminger",
        "email": "stephen@networkplumber.org"
    },
    "delegate": {
        "id": 24651,
        "url": "http://patchwork.dpdk.org/api/users/24651/?format=api",
        "username": "dmarchand",
        "first_name": "David",
        "last_name": "Marchand",
        "email": "david.marchand@redhat.com"
    },
    "mbox": "http://patchwork.dpdk.org/project/dpdk/patch/20230801160500.67480-2-stephen@networkplumber.org/mbox/",
    "series": [
        {
            "id": 29081,
            "url": "http://patchwork.dpdk.org/api/series/29081/?format=api",
            "web_url": "http://patchwork.dpdk.org/project/dpdk/list/?series=29081",
            "date": "2023-08-01T16:04:58",
            "name": "Remove disabled functionality",
            "version": 2,
            "mbox": "http://patchwork.dpdk.org/series/29081/mbox/"
        }
    ],
    "comments": "http://patchwork.dpdk.org/api/patches/129795/comments/",
    "check": "success",
    "checks": "http://patchwork.dpdk.org/api/patches/129795/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 mails.dpdk.org (mails.dpdk.org [217.70.189.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id E73B942F9B;\n\tTue,  1 Aug 2023 18:05:18 +0200 (CEST)",
            "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id A746843253;\n\tTue,  1 Aug 2023 18:05:16 +0200 (CEST)",
            "from mail-pl1-f176.google.com (mail-pl1-f176.google.com\n [209.85.214.176])\n by mails.dpdk.org (Postfix) with ESMTP id 2201343067\n for <dev@dpdk.org>; Tue,  1 Aug 2023 18:05:15 +0200 (CEST)",
            "by mail-pl1-f176.google.com with SMTP id\n d9443c01a7336-1bba04b9df3so46342745ad.0\n for <dev@dpdk.org>; Tue, 01 Aug 2023 09:05:14 -0700 (PDT)",
            "from hermes.local (204-195-127-207.wavecable.com. [204.195.127.207])\n by smtp.gmail.com with ESMTPSA id\n li11-20020a170903294b00b001b89f6550d1sm10655939plb.16.2023.08.01.09.05.11\n (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n Tue, 01 Aug 2023 09:05:11 -0700 (PDT)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=networkplumber-org.20221208.gappssmtp.com; s=20221208; t=1690905914;\n x=1691510714;\n h=content-transfer-encoding:mime-version:references:in-reply-to\n :message-id:date:subject:cc:to:from:from:to:cc:subject:date\n :message-id:reply-to;\n bh=OvjZ3I+6n8/cFyiZLKuDKsl/QkFFmTzjjjFsoREh740=;\n b=QxaQNOBn7c7kjZ//j3+kBXTD2myXsnyRflRxK+vSAF62YsPXCGeLEntcuKT2DRg2Od\n naESgpDJo2XDMzL13ApkHbNMlF8P4s76KovOU3/h1KZVH89GQ+O3QpNSAg6/eBegTOi8\n n4TiSxPOxa4aWnq2Fea15i4eLcJssBjkiUjGbMNWNwvRcNV1/LnxKGbZZbnQLkqSyF1S\n n25azxlecaSrpp3O+5n/39rdTPBj/WnuSVdUy6bTssC9R1nSve4NfjvNmqprDyvWkU/a\n 8yV+kA9JvFcVhjDVp0r0PHQIDzTWO07N/VkggD9Gjiemi3Bk9qlIgtRRcKlJhFN5hKsD\n lZzA==",
        "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20221208; t=1690905914; x=1691510714;\n h=content-transfer-encoding:mime-version:references:in-reply-to\n :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc\n :subject:date:message-id:reply-to;\n bh=OvjZ3I+6n8/cFyiZLKuDKsl/QkFFmTzjjjFsoREh740=;\n b=BOUIVlTEY3TuAjCEA2tL3Mcp/VCt9snDBPm98njzPzSHhVPJc+i7/aG5gUH9xtqN5K\n 274YstuRNUPCtwv+48VLT6iXNhec650AD2LBDwi9QhaRyvsy1axVrl6incd+Ign/XBV1\n 0sBv2z8W9ism5WLpNh4gQKBBG7MZxGMsWCEOEjMNbgpEUITcy7xZ4r4OdxTMfIneSCGH\n E9IIW3PIpfVT7jGeIzudmCr0YRI1WhTMNf/C7o2Fk9JkxmnCrgx9Z2lvwIGaig55yv7B\n SutdBgvLJGoqb2JdciF+wcJ/HE6kaWMu6vNjzFTRAR8sgnd8LQovXJnwKtn1n3UJ5dRL\n AFyw==",
        "X-Gm-Message-State": "ABy/qLZ7pXwJptVI7r+ZcJuQUxDJsCEmyTGqVVJeEe3Z1oHQKu5vqAdY\n nA2fXHpcBLV5z0qU1fRg4doSwCxJOMVcq9yxbyPOTA==",
        "X-Google-Smtp-Source": "\n APBJJlHQtFBWLDILb+xU3z4J7GnJdUv+t9c5sGL6JsDvoHPblFKLwiTOaOBlP/k9DibSnzJabp3zHw==",
        "X-Received": "by 2002:a17:902:d2d1:b0:1b2:fa8:d9c9 with SMTP id\n n17-20020a170902d2d100b001b20fa8d9c9mr15762378plc.49.1690905912293;\n Tue, 01 Aug 2023 09:05:12 -0700 (PDT)",
        "From": "Stephen Hemminger <stephen@networkplumber.org>",
        "To": "dev@dpdk.org",
        "Cc": "Stephen Hemminger <stephen@networkplumber.org>,\n Thomas Monjalon <thomas@monjalon.net>,\n Bruce Richardson <bruce.richardson@intel.com>",
        "Subject": "[PATCH v2 1/2] flow_classify: remove library",
        "Date": "Tue,  1 Aug 2023 09:04:59 -0700",
        "Message-Id": "<20230801160500.67480-2-stephen@networkplumber.org>",
        "X-Mailer": "git-send-email 2.39.2",
        "In-Reply-To": "<20230801160500.67480-1-stephen@networkplumber.org>",
        "References": "<20230801160500.67480-1-stephen@networkplumber.org>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.29",
        "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"
    },
    "content": "The flow_classify library was marked for removal last year\nbecause there was no maintainer and the functionality is\nlimited.\n\nSigned-off-by: Stephen Hemminger <stephen@networkplumber.org>\n---\n MAINTAINERS                                   |   7 -\n app/test/meson.build                          |   4 -\n app/test/test_flow_classify.c                 | 895 ------------------\n app/test/test_flow_classify.h                 |  26 -\n doc/api/doxy-api-index.md                     |   1 -\n doc/api/doxy-api.conf.in                      |   1 -\n doc/guides/freebsd_gsg/build_sample_apps.rst  |   2 +-\n doc/guides/freebsd_gsg/install_from_ports.rst |   2 +-\n doc/guides/prog_guide/flow_classify_lib.rst   | 424 ---------\n doc/guides/prog_guide/index.rst               |   1 -\n doc/guides/rel_notes/deprecation.rst          |   8 +-\n doc/guides/rel_notes/release_23_11.rst        |   2 +\n doc/guides/sample_app_ug/flow_classify.rst    | 242 -----\n doc/guides/sample_app_ug/index.rst            |   1 -\n examples/flow_classify/Makefile               |  51 -\n examples/flow_classify/flow_classify.c        | 878 -----------------\n examples/flow_classify/ipv4_rules_file.txt    |  14 -\n examples/flow_classify/meson.build            |  13 -\n examples/meson.build                          |   1 -\n lib/flow_classify/meson.build                 |  12 -\n lib/flow_classify/rte_flow_classify.c         | 670 -------------\n lib/flow_classify/rte_flow_classify.h         | 284 ------\n lib/flow_classify/rte_flow_classify_parse.c   | 532 -----------\n lib/flow_classify/rte_flow_classify_parse.h   |  58 --\n lib/flow_classify/version.map                 |  13 -\n lib/meson.build                               |   3 -\n meson_options.txt                             |   2 +-\n 27 files changed, 6 insertions(+), 4141 deletions(-)\n delete mode 100644 app/test/test_flow_classify.c\n delete mode 100644 app/test/test_flow_classify.h\n delete mode 100644 doc/guides/prog_guide/flow_classify_lib.rst\n delete mode 100644 doc/guides/sample_app_ug/flow_classify.rst\n delete mode 100644 examples/flow_classify/Makefile\n delete mode 100644 examples/flow_classify/flow_classify.c\n delete mode 100644 examples/flow_classify/ipv4_rules_file.txt\n delete mode 100644 examples/flow_classify/meson.build\n delete mode 100644 lib/flow_classify/meson.build\n delete mode 100644 lib/flow_classify/rte_flow_classify.c\n delete mode 100644 lib/flow_classify/rte_flow_classify.h\n delete mode 100644 lib/flow_classify/rte_flow_classify_parse.c\n delete mode 100644 lib/flow_classify/rte_flow_classify_parse.h\n delete mode 100644 lib/flow_classify/version.map",
    "diff": "diff --git a/MAINTAINERS b/MAINTAINERS\nindex 18bc05fccd0d..dbb25211c367 100644\n--- a/MAINTAINERS\n+++ b/MAINTAINERS\n@@ -1511,13 +1511,6 @@ F: lib/pdcp/\n F: doc/guides/prog_guide/pdcp_lib.rst\n F: app/test/test_pdcp*\n \n-Flow Classify - EXPERIMENTAL - UNMAINTAINED\n-F: lib/flow_classify/\n-F: app/test/test_flow_classify*\n-F: doc/guides/prog_guide/flow_classify_lib.rst\n-F: examples/flow_classify/\n-F: doc/guides/sample_app_ug/flow_classify.rst\n-\n Distributor\n M: David Hunt <david.hunt@intel.com>\n F: lib/distributor/\ndiff --git a/app/test/meson.build b/app/test/meson.build\nindex b89cf0368fb5..90a2e350c7ae 100644\n--- a/app/test/meson.build\n+++ b/app/test/meson.build\n@@ -359,10 +359,6 @@ if dpdk_conf.has('RTE_EVENT_SKELETON')\n     test_deps += 'event_skeleton'\n endif\n \n-if dpdk_conf.has('RTE_LIB_FLOW_CLASSIFY')\n-    test_sources += 'test_flow_classify.c'\n-    fast_tests += [['flow_classify_autotest', false, true]]\n-endif\n if dpdk_conf.has('RTE_LIB_GRAPH')\n     test_sources += 'test_graph.c'\n     fast_tests += [['graph_autotest', true, true]]\ndiff --git a/app/test/test_flow_classify.c b/app/test/test_flow_classify.c\ndeleted file mode 100644\nindex 6e274d88e645..000000000000\n--- a/app/test/test_flow_classify.c\n+++ /dev/null\n@@ -1,895 +0,0 @@\n-/* SPDX-License-Identifier: BSD-3-Clause\n- * Copyright(c) 2017 Intel Corporation\n- */\n-\n-#include <string.h>\n-#include <errno.h>\n-\n-#include \"test.h\"\n-\n-#include <rte_string_fns.h>\n-#include <rte_mbuf.h>\n-#include <rte_byteorder.h>\n-#include <rte_ip.h>\n-\n-#ifdef RTE_EXEC_ENV_WINDOWS\n-static int\n-test_flow_classify(void)\n-{\n-\tprintf(\"flow_classify not supported on Windows, skipping test\\n\");\n-\treturn TEST_SKIPPED;\n-}\n-\n-#else\n-\n-#include <rte_acl.h>\n-#include <rte_common.h>\n-#include <rte_table_acl.h>\n-#include <rte_flow.h>\n-#include <rte_flow_classify.h>\n-\n-#include \"packet_burst_generator.h\"\n-#include \"test_flow_classify.h\"\n-\n-\n-#define FLOW_CLASSIFY_MAX_RULE_NUM 100\n-#define MAX_PKT_BURST              32\n-#define NB_SOCKETS                 4\n-#define MEMPOOL_CACHE_SIZE         256\n-#define MBUF_SIZE                  512\n-#define NB_MBUF                    512\n-\n-/* test UDP, TCP and SCTP packets */\n-static struct rte_mempool *mbufpool[NB_SOCKETS];\n-static struct rte_mbuf *bufs[MAX_PKT_BURST];\n-\n-static struct rte_acl_field_def ipv4_defs[NUM_FIELDS_IPV4] = {\n-\t/* first input field - always one byte long. */\n-\t{\n-\t\t.type = RTE_ACL_FIELD_TYPE_BITMASK,\n-\t\t.size = sizeof(uint8_t),\n-\t\t.field_index = PROTO_FIELD_IPV4,\n-\t\t.input_index = PROTO_INPUT_IPV4,\n-\t\t.offset = sizeof(struct rte_ether_hdr) +\n-\t\t\toffsetof(struct rte_ipv4_hdr, next_proto_id),\n-\t},\n-\t/* next input field (IPv4 source address) - 4 consecutive bytes. */\n-\t{\n-\t\t/* rte_flow uses a bit mask for IPv4 addresses */\n-\t\t.type = RTE_ACL_FIELD_TYPE_BITMASK,\n-\t\t.size = sizeof(uint32_t),\n-\t\t.field_index = SRC_FIELD_IPV4,\n-\t\t.input_index = SRC_INPUT_IPV4,\n-\t\t.offset = sizeof(struct rte_ether_hdr) +\n-\t\t\toffsetof(struct rte_ipv4_hdr, src_addr),\n-\t},\n-\t/* next input field (IPv4 destination address) - 4 consecutive bytes. */\n-\t{\n-\t\t/* rte_flow uses a bit mask for IPv4 addresses */\n-\t\t.type = RTE_ACL_FIELD_TYPE_BITMASK,\n-\t\t.size = sizeof(uint32_t),\n-\t\t.field_index = DST_FIELD_IPV4,\n-\t\t.input_index = DST_INPUT_IPV4,\n-\t\t.offset = sizeof(struct rte_ether_hdr) +\n-\t\t\toffsetof(struct rte_ipv4_hdr, dst_addr),\n-\t},\n-\t/*\n-\t * Next 2 fields (src & dst ports) form 4 consecutive bytes.\n-\t * They share the same input index.\n-\t */\n-\t{\n-\t\t/* rte_flow uses a bit mask for protocol ports */\n-\t\t.type = RTE_ACL_FIELD_TYPE_BITMASK,\n-\t\t.size = sizeof(uint16_t),\n-\t\t.field_index = SRCP_FIELD_IPV4,\n-\t\t.input_index = SRCP_DESTP_INPUT_IPV4,\n-\t\t.offset = sizeof(struct rte_ether_hdr) +\n-\t\t\tsizeof(struct rte_ipv4_hdr) +\n-\t\t\toffsetof(struct rte_tcp_hdr, src_port),\n-\t},\n-\t{\n-\t\t/* rte_flow uses a bit mask for protocol ports */\n-\t\t.type = RTE_ACL_FIELD_TYPE_BITMASK,\n-\t\t.size = sizeof(uint16_t),\n-\t\t.field_index = DSTP_FIELD_IPV4,\n-\t\t.input_index = SRCP_DESTP_INPUT_IPV4,\n-\t\t.offset = sizeof(struct rte_ether_hdr) +\n-\t\t\tsizeof(struct rte_ipv4_hdr) +\n-\t\t\toffsetof(struct rte_tcp_hdr, dst_port),\n-\t},\n-};\n-\n-/* parameters for rte_flow_classify_validate and rte_flow_classify_create */\n-\n-/* test UDP pattern:\n- * \"eth / ipv4 src spec 2.2.2.3 src mask 255.255.255.00 dst spec 2.2.2.7\n- *  dst mask 255.255.255.00 / udp src is 32 dst is 33 / end\"\n- */\n-static struct rte_flow_item_ipv4 ipv4_udp_spec_1 = {\n-\t{ { .version_ihl = 0}, 0, 0, 0, 0, 0, IPPROTO_UDP, 0,\n-\t  RTE_IPV4(2, 2, 2, 3), RTE_IPV4(2, 2, 2, 7)}\n-};\n-static const struct rte_flow_item_ipv4 ipv4_mask_24 = {\n-\t.hdr = {\n-\t\t.next_proto_id = 0xff,\n-\t\t.src_addr = 0xffffff00,\n-\t\t.dst_addr = 0xffffff00,\n-\t},\n-};\n-static struct rte_flow_item_udp udp_spec_1 = {\n-\t{ 32, 33, 0, 0 }\n-};\n-\n-static struct rte_flow_item  eth_item = { RTE_FLOW_ITEM_TYPE_ETH,\n-\t0, 0, 0 };\n-static struct rte_flow_item  eth_item_bad = { -1, 0, 0, 0 };\n-\n-static struct rte_flow_item  ipv4_udp_item_1 = { RTE_FLOW_ITEM_TYPE_IPV4,\n-\t&ipv4_udp_spec_1, 0, &ipv4_mask_24};\n-static struct rte_flow_item  ipv4_udp_item_bad = { RTE_FLOW_ITEM_TYPE_IPV4,\n-\tNULL, 0, NULL};\n-\n-static struct rte_flow_item  udp_item_1 = { RTE_FLOW_ITEM_TYPE_UDP,\n-\t&udp_spec_1, 0, &rte_flow_item_udp_mask};\n-static struct rte_flow_item  udp_item_bad = { RTE_FLOW_ITEM_TYPE_UDP,\n-\tNULL, 0, NULL};\n-\n-static struct rte_flow_item  end_item = { RTE_FLOW_ITEM_TYPE_END,\n-\t0, 0, 0 };\n-\n-/* test TCP pattern:\n- * \"eth / ipv4 src spec 1.2.3.4 src mask 255.255.255.00 dst spec 5.6.7.8\n- *  dst mask 255.255.255.00 / tcp src is 16 dst is 17 / end\"\n- */\n-static struct rte_flow_item_ipv4 ipv4_tcp_spec_1 = {\n-\t{ { .version_ihl = 0}, 0, 0, 0, 0, 0, IPPROTO_TCP, 0,\n-\t  RTE_IPV4(1, 2, 3, 4), RTE_IPV4(5, 6, 7, 8)}\n-};\n-\n-static struct rte_flow_item_tcp tcp_spec_1 = {\n-\t{ 16, 17, 0, 0, 0, 0, 0, 0, 0}\n-};\n-\n-static struct rte_flow_item  ipv4_tcp_item_1 = { RTE_FLOW_ITEM_TYPE_IPV4,\n-\t&ipv4_tcp_spec_1, 0, &ipv4_mask_24};\n-\n-static struct rte_flow_item  tcp_item_1 = { RTE_FLOW_ITEM_TYPE_TCP,\n-\t&tcp_spec_1, 0, &rte_flow_item_tcp_mask};\n-\n-/* test SCTP pattern:\n- * \"eth / ipv4 src spec 1.2.3.4 src mask 255.255.255.00 dst spec 5.6.7.8\n- *  dst mask 255.255.255.00 / sctp src is 16 dst is 17/ end\"\n- */\n-static struct rte_flow_item_ipv4 ipv4_sctp_spec_1 = {\n-\t{ { .version_ihl = 0}, 0, 0, 0, 0, 0, IPPROTO_SCTP, 0,\n-\tRTE_IPV4(11, 12, 13, 14), RTE_IPV4(15, 16, 17, 18)}\n-};\n-\n-static struct rte_flow_item_sctp sctp_spec_1 = {\n-\t{ 10, 11, 0, 0}\n-};\n-\n-static struct rte_flow_item  ipv4_sctp_item_1 = { RTE_FLOW_ITEM_TYPE_IPV4,\n-\t&ipv4_sctp_spec_1, 0, &ipv4_mask_24};\n-\n-static struct rte_flow_item  sctp_item_1 = { RTE_FLOW_ITEM_TYPE_SCTP,\n-\t&sctp_spec_1, 0, &rte_flow_item_sctp_mask};\n-\n-\n-/* test actions:\n- * \"actions count / end\"\n- */\n-static struct rte_flow_query_count count = {\n-\t.reset = 1,\n-\t.hits_set = 1,\n-\t.bytes_set = 1,\n-\t.hits = 0,\n-\t.bytes = 0,\n-};\n-static struct rte_flow_action count_action = { RTE_FLOW_ACTION_TYPE_COUNT,\n-\t&count};\n-static struct rte_flow_action count_action_bad = { -1, 0};\n-\n-static struct rte_flow_action end_action = { RTE_FLOW_ACTION_TYPE_END, 0};\n-\n-static struct rte_flow_action actions[2];\n-\n-/* test attributes */\n-static struct rte_flow_attr attr;\n-\n-/* test error */\n-static struct rte_flow_error error;\n-\n-/* test pattern */\n-static struct rte_flow_item  pattern[4];\n-\n-/* flow classify data for UDP burst */\n-static struct rte_flow_classify_ipv4_5tuple_stats udp_ntuple_stats;\n-static struct rte_flow_classify_stats udp_classify_stats = {\n-\t\t.stats = (void *)&udp_ntuple_stats\n-};\n-\n-/* flow classify data for TCP burst */\n-static struct rte_flow_classify_ipv4_5tuple_stats tcp_ntuple_stats;\n-static struct rte_flow_classify_stats tcp_classify_stats = {\n-\t\t.stats = (void *)&tcp_ntuple_stats\n-};\n-\n-/* flow classify data for SCTP burst */\n-static struct rte_flow_classify_ipv4_5tuple_stats sctp_ntuple_stats;\n-static struct rte_flow_classify_stats sctp_classify_stats = {\n-\t\t.stats = (void *)&sctp_ntuple_stats\n-};\n-\n-struct flow_classifier_acl *cls;\n-\n-struct flow_classifier_acl {\n-\tstruct rte_flow_classifier *cls;\n-} __rte_cache_aligned;\n-\n-/*\n- * test functions by passing invalid or\n- * non-workable parameters.\n- */\n-static int\n-test_invalid_parameters(void)\n-{\n-\tstruct rte_flow_classify_rule *rule;\n-\tint ret;\n-\n-\tret = rte_flow_classify_validate(NULL, NULL, NULL, NULL, NULL);\n-\tif (!ret) {\n-\t\tprintf(\"Line %i: rte_flow_classify_validate\",\n-\t\t\t__LINE__);\n-\t\tprintf(\" with NULL param should have failed!\\n\");\n-\t\treturn -1;\n-\t}\n-\n-\trule = rte_flow_classify_table_entry_add(NULL, NULL, NULL, NULL,\n-\t\t\tNULL, NULL);\n-\tif (rule) {\n-\t\tprintf(\"Line %i: flow_classifier_table_entry_add\", __LINE__);\n-\t\tprintf(\" with NULL param should have failed!\\n\");\n-\t\treturn -1;\n-\t}\n-\n-\tret = rte_flow_classify_table_entry_delete(NULL, NULL);\n-\tif (!ret) {\n-\t\tprintf(\"Line %i: rte_flow_classify_table_entry_delete\",\n-\t\t\t__LINE__);\n-\t\tprintf(\" with NULL param should have failed!\\n\");\n-\t\treturn -1;\n-\t}\n-\n-\tret = rte_flow_classifier_query(NULL, NULL, 0, NULL, NULL);\n-\tif (!ret) {\n-\t\tprintf(\"Line %i: flow_classifier_query\", __LINE__);\n-\t\tprintf(\" with NULL param should have failed!\\n\");\n-\t\treturn -1;\n-\t}\n-\n-\trule = rte_flow_classify_table_entry_add(NULL, NULL, NULL, NULL,\n-\t\tNULL, &error);\n-\tif (rule) {\n-\t\tprintf(\"Line %i: flow_classify_table_entry_add \", __LINE__);\n-\t\tprintf(\"with NULL param should have failed!\\n\");\n-\t\treturn -1;\n-\t}\n-\n-\tret = rte_flow_classify_table_entry_delete(NULL, NULL);\n-\tif (!ret) {\n-\t\tprintf(\"Line %i: rte_flow_classify_table_entry_delete\",\n-\t\t\t__LINE__);\n-\t\tprintf(\"with NULL param should have failed!\\n\");\n-\t\treturn -1;\n-\t}\n-\n-\tret = rte_flow_classifier_query(NULL, NULL, 0, NULL, NULL);\n-\tif (!ret) {\n-\t\tprintf(\"Line %i: flow_classifier_query\", __LINE__);\n-\t\tprintf(\" with NULL param should have failed!\\n\");\n-\t\treturn -1;\n-\t}\n-\treturn 0;\n-}\n-\n-static int\n-test_valid_parameters(void)\n-{\n-\tstruct rte_flow_classify_rule *rule;\n-\tint ret;\n-\tint key_found;\n-\n-\t/*\n-\t * set up parameters for rte_flow_classify_validate,\n-\t * rte_flow_classify_table_entry_add and\n-\t * rte_flow_classify_table_entry_delete\n-\t */\n-\n-\tattr.ingress = 1;\n-\tattr.priority = 1;\n-\tpattern[0] = eth_item;\n-\tpattern[1] = ipv4_udp_item_1;\n-\tpattern[2] = udp_item_1;\n-\tpattern[3] = end_item;\n-\tactions[0] = count_action;\n-\tactions[1] = end_action;\n-\n-\tret = rte_flow_classify_validate(cls->cls, &attr, pattern,\n-\t\t\tactions, &error);\n-\tif (ret) {\n-\t\tprintf(\"Line %i: rte_flow_classify_validate\",\n-\t\t\t__LINE__);\n-\t\tprintf(\" should not have failed!\\n\");\n-\t\treturn -1;\n-\t}\n-\trule = rte_flow_classify_table_entry_add(cls->cls, &attr, pattern,\n-\t\t\tactions, &key_found, &error);\n-\n-\tif (!rule) {\n-\t\tprintf(\"Line %i: flow_classify_table_entry_add\", __LINE__);\n-\t\tprintf(\" should not have failed!\\n\");\n-\t\treturn -1;\n-\t}\n-\n-\tret = rte_flow_classify_table_entry_delete(cls->cls, rule);\n-\tif (ret) {\n-\t\tprintf(\"Line %i: rte_flow_classify_table_entry_delete\",\n-\t\t\t__LINE__);\n-\t\tprintf(\" should not have failed!\\n\");\n-\t\treturn -1;\n-\t}\n-\treturn 0;\n-}\n-\n-static int\n-test_invalid_patterns(void)\n-{\n-\tstruct rte_flow_classify_rule *rule;\n-\tint ret;\n-\tint key_found;\n-\n-\t/*\n-\t * set up parameters for rte_flow_classify_validate,\n-\t * rte_flow_classify_table_entry_add and\n-\t * rte_flow_classify_table_entry_delete\n-\t */\n-\n-\tattr.ingress = 1;\n-\tattr.priority = 1;\n-\tpattern[0] = eth_item_bad;\n-\tpattern[1] = ipv4_udp_item_1;\n-\tpattern[2] = udp_item_1;\n-\tpattern[3] = end_item;\n-\tactions[0] = count_action;\n-\tactions[1] = end_action;\n-\n-\tpattern[0] = eth_item;\n-\tpattern[1] = ipv4_udp_item_bad;\n-\n-\tret = rte_flow_classify_validate(cls->cls, &attr, pattern,\n-\t\t\tactions, &error);\n-\tif (!ret) {\n-\t\tprintf(\"Line %i: rte_flow_classify_validate\", __LINE__);\n-\t\tprintf(\" should have failed!\\n\");\n-\t\treturn -1;\n-\t}\n-\n-\trule = rte_flow_classify_table_entry_add(cls->cls, &attr, pattern,\n-\t\t\tactions, &key_found, &error);\n-\tif (rule) {\n-\t\tprintf(\"Line %i: flow_classify_table_entry_add\", __LINE__);\n-\t\tprintf(\" should have failed!\\n\");\n-\t\treturn -1;\n-\t}\n-\n-\tret = rte_flow_classify_table_entry_delete(cls->cls, rule);\n-\tif (!ret) {\n-\t\tprintf(\"Line %i: rte_flow_classify_table_entry_delete\",\n-\t\t\t__LINE__);\n-\t\tprintf(\" should have failed!\\n\");\n-\t\treturn -1;\n-\t}\n-\n-\tpattern[1] = ipv4_udp_item_1;\n-\tpattern[2] = udp_item_bad;\n-\tpattern[3] = end_item;\n-\n-\tret = rte_flow_classify_validate(cls->cls, &attr, pattern,\n-\t\t\tactions, &error);\n-\tif (!ret) {\n-\t\tprintf(\"Line %i: rte_flow_classify_validate\", __LINE__);\n-\t\tprintf(\" should have failed!\\n\");\n-\t\treturn -1;\n-\t}\n-\n-\trule = rte_flow_classify_table_entry_add(cls->cls, &attr, pattern,\n-\t\t\tactions, &key_found, &error);\n-\tif (rule) {\n-\t\tprintf(\"Line %i: flow_classify_table_entry_add\", __LINE__);\n-\t\tprintf(\" should have failed!\\n\");\n-\t\treturn -1;\n-\t}\n-\n-\tret = rte_flow_classify_table_entry_delete(cls->cls, rule);\n-\tif (!ret) {\n-\t\tprintf(\"Line %i: rte_flow_classify_table_entry_delete\",\n-\t\t\t__LINE__);\n-\t\tprintf(\" should have failed!\\n\");\n-\t\treturn -1;\n-\t}\n-\treturn 0;\n-}\n-\n-static int\n-test_invalid_actions(void)\n-{\n-\tstruct rte_flow_classify_rule *rule;\n-\tint ret;\n-\tint key_found;\n-\n-\t/*\n-\t * set up parameters for rte_flow_classify_validate,\n-\t * rte_flow_classify_table_entry_add and\n-\t * rte_flow_classify_table_entry_delete\n-\t */\n-\n-\tattr.ingress = 1;\n-\tattr.priority = 1;\n-\tpattern[0] = eth_item;\n-\tpattern[1] = ipv4_udp_item_1;\n-\tpattern[2] = udp_item_1;\n-\tpattern[3] = end_item;\n-\tactions[0] = count_action_bad;\n-\tactions[1] = end_action;\n-\n-\tret = rte_flow_classify_validate(cls->cls, &attr, pattern,\n-\t\t\tactions, &error);\n-\tif (!ret) {\n-\t\tprintf(\"Line %i: rte_flow_classify_validate\", __LINE__);\n-\t\tprintf(\" should have failed!\\n\");\n-\t\treturn -1;\n-\t}\n-\n-\trule = rte_flow_classify_table_entry_add(cls->cls, &attr, pattern,\n-\t\t\tactions, &key_found, &error);\n-\tif (rule) {\n-\t\tprintf(\"Line %i: flow_classify_table_entry_add\", __LINE__);\n-\t\tprintf(\" should have failed!\\n\");\n-\t\treturn -1;\n-\t}\n-\n-\tret = rte_flow_classify_table_entry_delete(cls->cls, rule);\n-\tif (!ret) {\n-\t\tprintf(\"Line %i: rte_flow_classify_table_entry_delete\",\n-\t\t\t__LINE__);\n-\t\tprintf(\" should have failed!\\n\");\n-\t\treturn -1;\n-\t}\n-\n-\treturn 0;\n-}\n-\n-static int\n-init_ipv4_udp_traffic(struct rte_mempool *mp,\n-\t     struct rte_mbuf **pkts_burst, uint32_t burst_size)\n-{\n-\tstruct rte_ether_hdr pkt_eth_hdr;\n-\tstruct rte_ipv4_hdr pkt_ipv4_hdr;\n-\tstruct rte_udp_hdr pkt_udp_hdr;\n-\tuint32_t src_addr = IPV4_ADDR(2, 2, 2, 3);\n-\tuint32_t dst_addr = IPV4_ADDR(2, 2, 2, 7);\n-\tuint16_t src_port = 32;\n-\tuint16_t dst_port = 33;\n-\tuint16_t pktlen;\n-\n-\tstatic uint8_t src_mac[] = { 0x00, 0xFF, 0xAA, 0xFF, 0xAA, 0xFF };\n-\tstatic uint8_t dst_mac[] = { 0x00, 0xAA, 0xFF, 0xAA, 0xFF, 0xAA };\n-\n-\tprintf(\"Set up IPv4 UDP traffic\\n\");\n-\tinitialize_eth_header(&pkt_eth_hdr,\n-\t\t(struct rte_ether_addr *)src_mac,\n-\t\t(struct rte_ether_addr *)dst_mac, RTE_ETHER_TYPE_IPV4, 0, 0);\n-\tpktlen = (uint16_t)(sizeof(struct rte_ether_hdr));\n-\tprintf(\"ETH  pktlen %u\\n\", pktlen);\n-\n-\tpktlen = initialize_ipv4_header(&pkt_ipv4_hdr, src_addr, dst_addr,\n-\t\t\t\t\tpktlen);\n-\tprintf(\"ETH + IPv4 pktlen %u\\n\", pktlen);\n-\n-\tpktlen = initialize_udp_header(&pkt_udp_hdr, src_port, dst_port,\n-\t\t\t\t\tpktlen);\n-\tprintf(\"ETH + IPv4 + UDP pktlen %u\\n\\n\", pktlen);\n-\n-\treturn generate_packet_burst(mp, pkts_burst, &pkt_eth_hdr,\n-\t\t\t\t     0, &pkt_ipv4_hdr, 1,\n-\t\t\t\t     &pkt_udp_hdr, burst_size,\n-\t\t\t\t     PACKET_BURST_GEN_PKT_LEN, 1);\n-}\n-\n-static int\n-init_ipv4_tcp_traffic(struct rte_mempool *mp,\n-\t     struct rte_mbuf **pkts_burst, uint32_t burst_size)\n-{\n-\tstruct rte_ether_hdr pkt_eth_hdr;\n-\tstruct rte_ipv4_hdr pkt_ipv4_hdr;\n-\tstruct rte_tcp_hdr pkt_tcp_hdr;\n-\tuint32_t src_addr = IPV4_ADDR(1, 2, 3, 4);\n-\tuint32_t dst_addr = IPV4_ADDR(5, 6, 7, 8);\n-\tuint16_t src_port = 16;\n-\tuint16_t dst_port = 17;\n-\tuint16_t pktlen;\n-\n-\tstatic uint8_t src_mac[] = { 0x00, 0xFF, 0xAA, 0xFF, 0xAA, 0xFF };\n-\tstatic uint8_t dst_mac[] = { 0x00, 0xAA, 0xFF, 0xAA, 0xFF, 0xAA };\n-\n-\tprintf(\"Set up IPv4 TCP traffic\\n\");\n-\tinitialize_eth_header(&pkt_eth_hdr,\n-\t\t(struct rte_ether_addr *)src_mac,\n-\t\t(struct rte_ether_addr *)dst_mac, RTE_ETHER_TYPE_IPV4, 0, 0);\n-\tpktlen = (uint16_t)(sizeof(struct rte_ether_hdr));\n-\tprintf(\"ETH  pktlen %u\\n\", pktlen);\n-\n-\tpktlen = initialize_ipv4_header_proto(&pkt_ipv4_hdr, src_addr,\n-\t\t\t\t\tdst_addr, pktlen, IPPROTO_TCP);\n-\tprintf(\"ETH + IPv4 pktlen %u\\n\", pktlen);\n-\n-\tpktlen = initialize_tcp_header(&pkt_tcp_hdr, src_port, dst_port,\n-\t\t\t\t\tpktlen);\n-\tprintf(\"ETH + IPv4 + TCP pktlen %u\\n\\n\", pktlen);\n-\n-\treturn generate_packet_burst_proto(mp, pkts_burst, &pkt_eth_hdr,\n-\t\t\t\t\t0, &pkt_ipv4_hdr, 1, IPPROTO_TCP,\n-\t\t\t\t\t&pkt_tcp_hdr, burst_size,\n-\t\t\t\t\tPACKET_BURST_GEN_PKT_LEN, 1);\n-}\n-\n-static int\n-init_ipv4_sctp_traffic(struct rte_mempool *mp,\n-\t     struct rte_mbuf **pkts_burst, uint32_t burst_size)\n-{\n-\tstruct rte_ether_hdr pkt_eth_hdr;\n-\tstruct rte_ipv4_hdr pkt_ipv4_hdr;\n-\tstruct rte_sctp_hdr pkt_sctp_hdr;\n-\tuint32_t src_addr = IPV4_ADDR(11, 12, 13, 14);\n-\tuint32_t dst_addr = IPV4_ADDR(15, 16, 17, 18);\n-\tuint16_t src_port = 10;\n-\tuint16_t dst_port = 11;\n-\tuint16_t pktlen;\n-\n-\tstatic uint8_t src_mac[] = { 0x00, 0xFF, 0xAA, 0xFF, 0xAA, 0xFF };\n-\tstatic uint8_t dst_mac[] = { 0x00, 0xAA, 0xFF, 0xAA, 0xFF, 0xAA };\n-\n-\tprintf(\"Set up IPv4 SCTP traffic\\n\");\n-\tinitialize_eth_header(&pkt_eth_hdr,\n-\t\t(struct rte_ether_addr *)src_mac,\n-\t\t(struct rte_ether_addr *)dst_mac, RTE_ETHER_TYPE_IPV4, 0, 0);\n-\tpktlen = (uint16_t)(sizeof(struct rte_ether_hdr));\n-\tprintf(\"ETH  pktlen %u\\n\", pktlen);\n-\n-\tpktlen = initialize_ipv4_header_proto(&pkt_ipv4_hdr, src_addr,\n-\t\t\t\t\tdst_addr, pktlen, IPPROTO_SCTP);\n-\tprintf(\"ETH + IPv4 pktlen %u\\n\", pktlen);\n-\n-\tpktlen = initialize_sctp_header(&pkt_sctp_hdr, src_port, dst_port,\n-\t\t\t\t\tpktlen);\n-\tprintf(\"ETH + IPv4 + SCTP pktlen %u\\n\\n\", pktlen);\n-\n-\treturn generate_packet_burst_proto(mp, pkts_burst, &pkt_eth_hdr,\n-\t\t\t\t\t0, &pkt_ipv4_hdr, 1, IPPROTO_SCTP,\n-\t\t\t\t\t&pkt_sctp_hdr, burst_size,\n-\t\t\t\t\tPACKET_BURST_GEN_PKT_LEN, 1);\n-}\n-\n-static int\n-init_mbufpool(void)\n-{\n-\tint socketid;\n-\tint ret = 0;\n-\tunsigned int lcore_id;\n-\tchar s[64];\n-\n-\tfor (lcore_id = 0; lcore_id < RTE_MAX_LCORE; lcore_id++) {\n-\t\tif (rte_lcore_is_enabled(lcore_id) == 0)\n-\t\t\tcontinue;\n-\n-\t\tsocketid = rte_lcore_to_socket_id(lcore_id);\n-\t\tif (socketid >= NB_SOCKETS) {\n-\t\t\tprintf(\n-\t\t\t\t\"Socket %d of lcore %u is out of range %d\\n\",\n-\t\t\t\tsocketid, lcore_id, NB_SOCKETS);\n-\t\t\tret = -1;\n-\t\t\tbreak;\n-\t\t}\n-\t\tif (mbufpool[socketid] == NULL) {\n-\t\t\tsnprintf(s, sizeof(s), \"mbuf_pool_%d\", socketid);\n-\t\t\tmbufpool[socketid] =\n-\t\t\t\trte_pktmbuf_pool_create(s, NB_MBUF,\n-\t\t\t\t\tMEMPOOL_CACHE_SIZE, 0, MBUF_SIZE,\n-\t\t\t\t\tsocketid);\n-\t\t\tif (mbufpool[socketid]) {\n-\t\t\t\tprintf(\"Allocated mbuf pool on socket %d\\n\",\n-\t\t\t\t\tsocketid);\n-\t\t\t} else {\n-\t\t\t\tprintf(\"Cannot init mbuf pool on socket %d\\n\",\n-\t\t\t\t\tsocketid);\n-\t\t\t\tret = -ENOMEM;\n-\t\t\t\tbreak;\n-\t\t\t}\n-\t\t}\n-\t}\n-\treturn ret;\n-}\n-\n-static int\n-test_query_udp(void)\n-{\n-\tstruct rte_flow_error error;\n-\tstruct rte_flow_classify_rule *rule;\n-\tint ret;\n-\tint i;\n-\tint key_found;\n-\n-\tret = init_ipv4_udp_traffic(mbufpool[0], bufs, MAX_PKT_BURST);\n-\tif (ret != MAX_PKT_BURST) {\n-\t\tprintf(\"Line %i: init_udp_ipv4_traffic has failed!\\n\",\n-\t\t\t\t__LINE__);\n-\t\treturn -1;\n-\t}\n-\n-\tfor (i = 0; i < MAX_PKT_BURST; i++)\n-\t\tbufs[i]->packet_type = RTE_PTYPE_L3_IPV4;\n-\n-\t/*\n-\t * set up parameters for rte_flow_classify_validate,\n-\t * rte_flow_classify_table_entry_add and\n-\t * rte_flow_classify_table_entry_delete\n-\t */\n-\n-\tattr.ingress = 1;\n-\tattr.priority = 1;\n-\tpattern[0] = eth_item;\n-\tpattern[1] = ipv4_udp_item_1;\n-\tpattern[2] = udp_item_1;\n-\tpattern[3] = end_item;\n-\tactions[0] = count_action;\n-\tactions[1] = end_action;\n-\n-\tret = rte_flow_classify_validate(cls->cls, &attr, pattern,\n-\t\t\tactions, &error);\n-\tif (ret) {\n-\t\tprintf(\"Line %i: rte_flow_classify_validate\", __LINE__);\n-\t\tprintf(\" should not have failed!\\n\");\n-\t\treturn -1;\n-\t}\n-\n-\trule = rte_flow_classify_table_entry_add(cls->cls, &attr, pattern,\n-\t\t\tactions, &key_found, &error);\n-\tif (!rule) {\n-\t\tprintf(\"Line %i: flow_classify_table_entry_add\", __LINE__);\n-\t\tprintf(\" should not have failed!\\n\");\n-\t\treturn -1;\n-\t}\n-\n-\tret = rte_flow_classifier_query(cls->cls, bufs, MAX_PKT_BURST,\n-\t\t\trule, &udp_classify_stats);\n-\tif (ret) {\n-\t\tprintf(\"Line %i: flow_classifier_query\", __LINE__);\n-\t\tprintf(\" should not have failed!\\n\");\n-\t\treturn -1;\n-\t}\n-\n-\tret = rte_flow_classify_table_entry_delete(cls->cls, rule);\n-\tif (ret) {\n-\t\tprintf(\"Line %i: rte_flow_classify_table_entry_delete\",\n-\t\t\t__LINE__);\n-\t\tprintf(\" should not have failed!\\n\");\n-\t\treturn -1;\n-\t}\n-\treturn 0;\n-}\n-\n-static int\n-test_query_tcp(void)\n-{\n-\tstruct rte_flow_classify_rule *rule;\n-\tint ret;\n-\tint i;\n-\tint key_found;\n-\n-\tret = init_ipv4_tcp_traffic(mbufpool[0], bufs, MAX_PKT_BURST);\n-\tif (ret != MAX_PKT_BURST) {\n-\t\tprintf(\"Line %i: init_ipv4_tcp_traffic has failed!\\n\",\n-\t\t\t\t__LINE__);\n-\t\treturn -1;\n-\t}\n-\n-\tfor (i = 0; i < MAX_PKT_BURST; i++)\n-\t\tbufs[i]->packet_type = RTE_PTYPE_L3_IPV4;\n-\n-\t/*\n-\t * set up parameters for rte_flow_classify_validate,\n-\t * rte_flow_classify_table_entry_add and\n-\t * rte_flow_classify_table_entry_delete\n-\t */\n-\n-\tattr.ingress = 1;\n-\tattr.priority = 1;\n-\tpattern[0] = eth_item;\n-\tpattern[1] = ipv4_tcp_item_1;\n-\tpattern[2] = tcp_item_1;\n-\tpattern[3] = end_item;\n-\tactions[0] = count_action;\n-\tactions[1] = end_action;\n-\n-\tret = rte_flow_classify_validate(cls->cls, &attr, pattern,\n-\t\t\tactions, &error);\n-\tif (ret) {\n-\t\tprintf(\"Line %i: flow_classifier_query\", __LINE__);\n-\t\tprintf(\" should not have failed!\\n\");\n-\t\treturn -1;\n-\t}\n-\n-\trule = rte_flow_classify_table_entry_add(cls->cls, &attr, pattern,\n-\t\t\tactions, &key_found, &error);\n-\tif (!rule) {\n-\t\tprintf(\"Line %i: flow_classify_table_entry_add\", __LINE__);\n-\t\tprintf(\" should not have failed!\\n\");\n-\t\treturn -1;\n-\t}\n-\n-\tret = rte_flow_classifier_query(cls->cls, bufs, MAX_PKT_BURST,\n-\t\t\trule, &tcp_classify_stats);\n-\tif (ret) {\n-\t\tprintf(\"Line %i: flow_classifier_query\", __LINE__);\n-\t\tprintf(\" should not have failed!\\n\");\n-\t\treturn -1;\n-\t}\n-\n-\tret = rte_flow_classify_table_entry_delete(cls->cls, rule);\n-\tif (ret) {\n-\t\tprintf(\"Line %i: rte_flow_classify_table_entry_delete\",\n-\t\t\t__LINE__);\n-\t\tprintf(\" should not have failed!\\n\");\n-\t\treturn -1;\n-\t}\n-\treturn 0;\n-}\n-\n-static int\n-test_query_sctp(void)\n-{\n-\tstruct rte_flow_classify_rule *rule;\n-\tint ret;\n-\tint i;\n-\tint key_found;\n-\n-\tret = init_ipv4_sctp_traffic(mbufpool[0], bufs, MAX_PKT_BURST);\n-\tif (ret != MAX_PKT_BURST) {\n-\t\tprintf(\"Line %i: init_ipv4_tcp_traffic has failed!\\n\",\n-\t\t\t__LINE__);\n-\t\treturn -1;\n-\t}\n-\n-\tfor (i = 0; i < MAX_PKT_BURST; i++)\n-\t\tbufs[i]->packet_type = RTE_PTYPE_L3_IPV4;\n-\n-\t/*\n-\t * set up parameters rte_flow_classify_validate,\n-\t * rte_flow_classify_table_entry_add and\n-\t * rte_flow_classify_table_entry_delete\n-\t */\n-\n-\tattr.ingress = 1;\n-\tattr.priority = 1;\n-\tpattern[0] = eth_item;\n-\tpattern[1] = ipv4_sctp_item_1;\n-\tpattern[2] = sctp_item_1;\n-\tpattern[3] = end_item;\n-\tactions[0] = count_action;\n-\tactions[1] = end_action;\n-\n-\tret = rte_flow_classify_validate(cls->cls, &attr, pattern,\n-\t\t\tactions, &error);\n-\tif (ret) {\n-\t\tprintf(\"Line %i: flow_classifier_query\", __LINE__);\n-\t\tprintf(\" should not have failed!\\n\");\n-\t\treturn -1;\n-\t}\n-\n-\trule = rte_flow_classify_table_entry_add(cls->cls, &attr, pattern,\n-\t\t\tactions, &key_found, &error);\n-\tif (!rule) {\n-\t\tprintf(\"Line %i: flow_classify_table_entry_add\", __LINE__);\n-\t\tprintf(\" should not have failed!\\n\");\n-\t\treturn -1;\n-\t}\n-\n-\tret = rte_flow_classifier_query(cls->cls, bufs, MAX_PKT_BURST,\n-\t\t\trule, &sctp_classify_stats);\n-\tif (ret) {\n-\t\tprintf(\"Line %i: flow_classifier_query\", __LINE__);\n-\t\tprintf(\" should not have failed!\\n\");\n-\t\treturn -1;\n-\t}\n-\n-\tret = rte_flow_classify_table_entry_delete(cls->cls, rule);\n-\tif (ret) {\n-\t\tprintf(\"Line %i: rte_flow_classify_table_entry_delete\",\n-\t\t\t__LINE__);\n-\t\tprintf(\" should not have failed!\\n\");\n-\t\treturn -1;\n-\t}\n-\treturn 0;\n-}\n-\n-static int\n-test_flow_classify(void)\n-{\n-\tstruct rte_table_acl_params table_acl_params;\n-\tstruct rte_flow_classify_table_params cls_table_params;\n-\tstruct rte_flow_classifier_params cls_params;\n-\tint ret;\n-\tuint32_t size;\n-\n-\t/* Memory allocation */\n-\tsize = RTE_CACHE_LINE_ROUNDUP(sizeof(struct flow_classifier_acl));\n-\tcls = rte_zmalloc(NULL, size, RTE_CACHE_LINE_SIZE);\n-\n-\tcls_params.name = \"flow_classifier\";\n-\tcls_params.socket_id = 0;\n-\tcls->cls = rte_flow_classifier_create(&cls_params);\n-\tif (cls->cls == NULL) {\n-\t\tprintf(\"Line %i: flow classifier create has failed!\\n\",\n-\t\t       __LINE__);\n-\t\trte_free(cls);\n-\t\treturn TEST_FAILED;\n-\t}\n-\n-\t/* initialise ACL table params */\n-\ttable_acl_params.n_rule_fields = RTE_DIM(ipv4_defs);\n-\ttable_acl_params.name = \"table_acl_ipv4_5tuple\";\n-\ttable_acl_params.n_rules = FLOW_CLASSIFY_MAX_RULE_NUM;\n-\tmemcpy(table_acl_params.field_format, ipv4_defs, sizeof(ipv4_defs));\n-\n-\t/* initialise table create params */\n-\tcls_table_params.ops = &rte_table_acl_ops;\n-\tcls_table_params.arg_create = &table_acl_params;\n-\tcls_table_params.type = RTE_FLOW_CLASSIFY_TABLE_ACL_IP4_5TUPLE;\n-\n-\tret = rte_flow_classify_table_create(cls->cls, &cls_table_params);\n-\tif (ret) {\n-\t\tprintf(\"Line %i: f_create has failed!\\n\", __LINE__);\n-\t\trte_flow_classifier_free(cls->cls);\n-\t\trte_free(cls);\n-\t\treturn TEST_FAILED;\n-\t}\n-\tprintf(\"Created table_acl for for IPv4 five tuple packets\\n\");\n-\n-\tret = init_mbufpool();\n-\tif (ret) {\n-\t\tprintf(\"Line %i: init_mbufpool has failed!\\n\", __LINE__);\n-\t\treturn TEST_FAILED;\n-\t}\n-\n-\tif (test_invalid_parameters() < 0)\n-\t\treturn TEST_FAILED;\n-\tif (test_valid_parameters() < 0)\n-\t\treturn TEST_FAILED;\n-\tif (test_invalid_patterns() < 0)\n-\t\treturn TEST_FAILED;\n-\tif (test_invalid_actions() < 0)\n-\t\treturn TEST_FAILED;\n-\tif (test_query_udp() < 0)\n-\t\treturn TEST_FAILED;\n-\tif (test_query_tcp() < 0)\n-\t\treturn TEST_FAILED;\n-\tif (test_query_sctp() < 0)\n-\t\treturn TEST_FAILED;\n-\n-\treturn TEST_SUCCESS;\n-}\n-\n-#endif /* !RTE_EXEC_ENV_WINDOWS */\n-\n-REGISTER_TEST_COMMAND(flow_classify_autotest, test_flow_classify);\ndiff --git a/app/test/test_flow_classify.h b/app/test/test_flow_classify.h\ndeleted file mode 100644\nindex 6bd10ec972e5..000000000000\n--- a/app/test/test_flow_classify.h\n+++ /dev/null\n@@ -1,26 +0,0 @@\n-/* SPDX-License-Identifier: BSD-3-Clause\n- * Copyright(c) 2017 Intel Corporation\n- */\n-\n-#ifndef TEST_FLOW_CLASSIFY_H_\n-#define TEST_FLOW_CLASSIFY_H_\n-\n-/* ACL field definitions for IPv4 5 tuple rule */\n-\n-enum {\n-\tPROTO_FIELD_IPV4,\n-\tSRC_FIELD_IPV4,\n-\tDST_FIELD_IPV4,\n-\tSRCP_FIELD_IPV4,\n-\tDSTP_FIELD_IPV4,\n-\tNUM_FIELDS_IPV4\n-};\n-\n-enum {\n-\tPROTO_INPUT_IPV4,\n-\tSRC_INPUT_IPV4,\n-\tDST_INPUT_IPV4,\n-\tSRCP_DESTP_INPUT_IPV4\n-};\n-\n-#endif /* TEST_FLOW_CLASSIFY_H_ */\ndiff --git a/doc/api/doxy-api-index.md b/doc/api/doxy-api-index.md\nindex 3bc8778981f6..5cd8c9de8105 100644\n--- a/doc/api/doxy-api-index.md\n+++ b/doc/api/doxy-api-index.md\n@@ -160,7 +160,6 @@ The public API headers are grouped by topics:\n   [EFD](@ref rte_efd.h),\n   [ACL](@ref rte_acl.h),\n   [member](@ref rte_member.h),\n-  [flow classify](@ref rte_flow_classify.h),\n   [BPF](@ref rte_bpf.h)\n \n - **containers**:\ndiff --git a/doc/api/doxy-api.conf.in b/doc/api/doxy-api.conf.in\nindex 1a4210b948a8..9a9c52e5569c 100644\n--- a/doc/api/doxy-api.conf.in\n+++ b/doc/api/doxy-api.conf.in\n@@ -40,7 +40,6 @@ INPUT                   = @TOPDIR@/doc/api/doxy-api-index.md \\\n                           @TOPDIR@/lib/ethdev \\\n                           @TOPDIR@/lib/eventdev \\\n                           @TOPDIR@/lib/fib \\\n-                          @TOPDIR@/lib/flow_classify \\\n                           @TOPDIR@/lib/gpudev \\\n                           @TOPDIR@/lib/graph \\\n                           @TOPDIR@/lib/gro \\\ndiff --git a/doc/guides/freebsd_gsg/build_sample_apps.rst b/doc/guides/freebsd_gsg/build_sample_apps.rst\nindex b1ab7545b1ce..7bdd88e56d32 100644\n--- a/doc/guides/freebsd_gsg/build_sample_apps.rst\n+++ b/doc/guides/freebsd_gsg/build_sample_apps.rst\n@@ -31,7 +31,7 @@ the installation of DPDK using `meson install` as described previously::\n         $ gmake\n         cc -O3 -I/usr/local/include -include rte_config.h -march=native\n         -D__BSD_VISIBLE  main.c -o build/helloworld-shared\n-        -L/usr/local/lib -lrte_telemetry -lrte_bpf -lrte_flow_classify\n+        -L/usr/local/lib -lrte_telemetry -lrte_bpf\n         -lrte_pipeline -lrte_table -lrte_port -lrte_fib -lrte_ipsec\n         -lrte_stack -lrte_security -lrte_sched -lrte_reorder -lrte_rib\n         -lrte_rcu -lrte_rawdev -lrte_pdump -lrte_member -lrte_lpm\ndiff --git a/doc/guides/freebsd_gsg/install_from_ports.rst b/doc/guides/freebsd_gsg/install_from_ports.rst\nindex d946f3f3b2eb..3c98c46b298f 100644\n--- a/doc/guides/freebsd_gsg/install_from_ports.rst\n+++ b/doc/guides/freebsd_gsg/install_from_ports.rst\n@@ -84,7 +84,7 @@ via the contigmem module, and 4 NIC ports bound to the nic_uio module::\n     cd helloworld/\n \n     gmake\n-    cc -O3 -I/usr/local/include -include rte_config.h -march=corei7 -D__BSD_VISIBLE  main.c -o build/helloworld-shared  -L/usr/local/lib -lrte_bpf -lrte_flow_classify -lrte_pipeline -lrte_table -lrte_port -lrte_fib -lrte_ipsec -lrte_stack -lrte_security -lrte_sched -lrte_reorder -lrte_rib -lrte_rcu -lrte_rawdev -lrte_pdump -lrte_member -lrte_lpm -lrte_latencystats -lrte_jobstats -lrte_ip_frag -lrte_gso -lrte_gro -lrte_eventdev -lrte_efd -lrte_distributor -lrte_cryptodev -lrte_compressdev -lrte_cfgfile -lrte_bitratestats -lrte_bbdev -lrte_acl -lrte_timer -lrte_hash -lrte_metrics -lrte_cmdline -lrte_pci -lrte_ethdev -lrte_meter -lrte_net -lrte_mbuf -lrte_mempool -lrte_ring -lrte_eal -lrte_kvargs\n+    cc -O3 -I/usr/local/include -include rte_config.h -march=corei7 -D__BSD_VISIBLE  main.c -o build/helloworld-shared  -L/usr/local/lib -lrte_bpf -lrte_pipeline -lrte_table -lrte_port -lrte_fib -lrte_ipsec -lrte_stack -lrte_security -lrte_sched -lrte_reorder -lrte_rib -lrte_rcu -lrte_rawdev -lrte_pdump -lrte_member -lrte_lpm -lrte_latencystats -lrte_jobstats -lrte_ip_frag -lrte_gso -lrte_gro -lrte_eventdev -lrte_efd -lrte_distributor -lrte_cryptodev -lrte_compressdev -lrte_cfgfile -lrte_bitratestats -lrte_bbdev -lrte_acl -lrte_timer -lrte_hash -lrte_metrics -lrte_cmdline -lrte_pci -lrte_ethdev -lrte_meter -lrte_net -lrte_mbuf -lrte_mempool -lrte_ring -lrte_eal -lrte_kvargs\n     ln -sf helloworld-shared build/helloworld\n \n     sudo ./build/helloworld -l 0-3\ndiff --git a/doc/guides/prog_guide/flow_classify_lib.rst b/doc/guides/prog_guide/flow_classify_lib.rst\ndeleted file mode 100644\nindex ad2e10ec2681..000000000000\n--- a/doc/guides/prog_guide/flow_classify_lib.rst\n+++ /dev/null\n@@ -1,424 +0,0 @@\n-..  SPDX-License-Identifier: BSD-3-Clause\n-    Copyright(c) 2017 Intel Corporation.\n-\n-Flow Classification Library\n-===========================\n-\n-.. note::\n-\n-   The Flow Classification library is deprecated and will be removed in future.\n-   See :doc:`../rel_notes/deprecation`.\n-\n-   It is disabled by default in the DPDK build.\n-   To re-enable the library, remove 'flow_classify' from the \"disable_libs\"\n-   meson option when configuring a build.\n-\n-DPDK provides a Flow Classification library that provides the ability\n-to classify an input packet by matching it against a set of Flow rules.\n-\n-The initial implementation supports counting of IPv4 5-tuple packets which match\n-a particular Flow rule only.\n-\n-Please refer to the\n-:doc:`./rte_flow`\n-for more information.\n-\n-The Flow Classification library uses the ``librte_table`` API for managing Flow\n-rules and matching packets against the Flow rules.\n-The library is table agnostic and can use the following tables:\n-``Access Control List``, ``Hash`` and ``Longest Prefix Match(LPM)``.\n-The ``Access Control List`` table is used in the initial implementation.\n-\n-Please refer to the\n-:doc:`./packet_framework`\n-for more information.on ``librte_table``.\n-\n-DPDK provides an Access Control List library that provides the ability to\n-classify an input packet based on a set of classification rules.\n-\n-Please refer to the\n-:doc:`./packet_classif_access_ctrl`\n-library for more information on ``librte_acl``.\n-\n-There is also a Flow Classify sample application which demonstrates the use of\n-the Flow Classification Library API's.\n-\n-Please refer to the\n-:doc:`../sample_app_ug/flow_classify`\n-for more information on the ``flow_classify`` sample application.\n-\n-Overview\n---------\n-\n-The library has the following API's\n-\n-.. code-block:: c\n-\n-    /**\n-     * Flow classifier create\n-     *\n-     * @param params\n-     *   Parameters for flow classifier creation\n-     * @return\n-     *   Handle to flow classifier instance on success or NULL otherwise\n-     */\n-    struct rte_flow_classifier *\n-    rte_flow_classifier_create(struct rte_flow_classifier_params *params);\n-\n-    /**\n-     * Flow classifier free\n-     *\n-     * @param cls\n-     *   Handle to flow classifier instance\n-     * @return\n-     *   0 on success, error code otherwise\n-     */\n-    int\n-    rte_flow_classifier_free(struct rte_flow_classifier *cls);\n-\n-    /**\n-     * Flow classify table create\n-     *\n-     * @param cls\n-     *   Handle to flow classifier instance\n-     * @param params\n-     *   Parameters for flow_classify table creation\n-     * @return\n-     *   0 on success, error code otherwise\n-     */\n-    int\n-    rte_flow_classify_table_create(struct rte_flow_classifier *cls,\n-           struct rte_flow_classify_table_params *params);\n-\n-    /**\n-     * Validate the flow classify rule\n-     *\n-     * @param[in] cls\n-     *   Handle to flow classifier instance\n-     * @param[in] attr\n-     *   Flow rule attributes\n-     * @param[in] pattern\n-     *   Pattern specification (list terminated by the END pattern item).\n-     * @param[in] actions\n-     *   Associated actions (list terminated by the END pattern item).\n-     * @param[out] error\n-     *   Perform verbose error reporting if not NULL. Structure\n-     *   initialised in case of error only.\n-     * @return\n-     *   0 on success, error code otherwise\n-     */\n-    int\n-    rte_flow_classify_validate(struct rte_flow_classifier *cls,\n-            const struct rte_flow_attr *attr,\n-            const struct rte_flow_item pattern[],\n-            const struct rte_flow_action actions[],\n-            struct rte_flow_error *error);\n-\n-    /**\n-     * Add a flow classify rule to the flow_classifier table.\n-     *\n-     * @param[in] cls\n-     *   Flow classifier handle\n-     * @param[in] attr\n-     *   Flow rule attributes\n-     * @param[in] pattern\n-     *   Pattern specification (list terminated by the END pattern item).\n-     * @param[in] actions\n-     *   Associated actions (list terminated by the END pattern item).\n-     * @param[out] key_found\n-     *   returns 1 if rule present already, 0 otherwise.\n-     * @param[out] error\n-     *   Perform verbose error reporting if not NULL. Structure\n-     *   initialised in case of error only.\n-     * @return\n-     *   A valid handle in case of success, NULL otherwise.\n-     */\n-    struct rte_flow_classify_rule *\n-    rte_flow_classify_table_entry_add(struct rte_flow_classifier *cls,\n-            const struct rte_flow_attr *attr,\n-            const struct rte_flow_item pattern[],\n-            const struct rte_flow_action actions[],\n-            int *key_found;\n-            struct rte_flow_error *error);\n-\n-    /**\n-     * Delete a flow classify rule from the flow_classifier table.\n-     *\n-     * @param[in] cls\n-     *   Flow classifier handle\n-     * @param[in] rule\n-     *   Flow classify rule\n-     * @return\n-     *   0 on success, error code otherwise.\n-     */\n-    int\n-    rte_flow_classify_table_entry_delete(struct rte_flow_classifier *cls,\n-            struct rte_flow_classify_rule *rule);\n-\n-    /**\n-     * Query flow classifier for given rule.\n-     *\n-     * @param[in] cls\n-     *   Flow classifier handle\n-     * @param[in] pkts\n-     *   Pointer to packets to process\n-     * @param[in] nb_pkts\n-     *   Number of packets to process\n-     * @param[in] rule\n-     *   Flow classify rule\n-     * @param[in] stats\n-     *   Flow classify stats\n-     *\n-     * @return\n-     *   0 on success, error code otherwise.\n-     */\n-    int\n-    rte_flow_classifier_query(struct rte_flow_classifier *cls,\n-            struct rte_mbuf **pkts,\n-            const uint16_t nb_pkts,\n-            struct rte_flow_classify_rule *rule,\n-            struct rte_flow_classify_stats *stats);\n-\n-Classifier creation\n-~~~~~~~~~~~~~~~~~~~\n-\n-The application creates the ``Classifier`` using the\n-``rte_flow_classifier_create`` API.\n-The ``rte_flow_classify_params`` structure must be initialised by the\n-application before calling the API.\n-\n-.. code-block:: c\n-\n-    struct rte_flow_classifier_params {\n-        /** flow classifier name */\n-        const char *name;\n-\n-        /** CPU socket ID where memory for the flow classifier and its */\n-        /** elements (tables) should be allocated */\n-        int socket_id;\n-    };\n-\n-The ``Classifier`` has the following internal structures:\n-\n-.. code-block:: c\n-\n-    struct rte_cls_table {\n-        /* Input parameters */\n-        struct rte_table_ops ops;\n-        uint32_t entry_size;\n-        enum rte_flow_classify_table_type type;\n-\n-        /* Handle to the low-level table object */\n-        void *h_table;\n-    };\n-\n-    #define RTE_FLOW_CLASSIFIER_MAX_NAME_SZ 256\n-\n-    struct rte_flow_classifier {\n-        /* Input parameters */\n-        char name[RTE_FLOW_CLASSIFIER_MAX_NAME_SZ];\n-        int socket_id;\n-\n-        /* Internal */\n-        /* ntuple_filter */\n-        struct rte_eth_ntuple_filter ntuple_filter;\n-\n-        /* classifier tables */\n-        struct rte_cls_table tables[RTE_FLOW_CLASSIFY_TABLE_MAX];\n-        uint32_t table_mask;\n-        uint32_t num_tables;\n-\n-        uint16_t nb_pkts;\n-        struct rte_flow_classify_table_entry\n-            *entries[RTE_PORT_IN_BURST_SIZE_MAX];\n-    } __rte_cache_aligned;\n-\n-Adding a table to the Classifier\n-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n-\n-The application adds a table to the ``Classifier`` using the\n-``rte_flow_classify_table_create`` API.\n-The ``rte_flow_classify_table_params`` structure must be initialised by the\n-application before calling the API.\n-\n-.. code-block:: c\n-\n-    struct rte_flow_classify_table_params {\n-        /** Table operations (specific to each table type) */\n-        struct rte_table_ops *ops;\n-\n-        /** Opaque param to be passed to the table create operation */\n-        void *arg_create;\n-\n-        /** Classifier table type */\n-        enum rte_flow_classify_table_type type;\n-     };\n-\n-To create an ACL table the ``rte_table_acl_params`` structure must be\n-initialised and assigned to ``arg_create`` in the\n-``rte_flow_classify_table_params`` structure.\n-\n-.. code-block:: c\n-\n-    struct rte_table_acl_params {\n-        /** Name */\n-        const char *name;\n-\n-        /** Maximum number of ACL rules in the table */\n-        uint32_t n_rules;\n-\n-        /** Number of fields in the ACL rule specification */\n-        uint32_t n_rule_fields;\n-\n-        /** Format specification of the fields of the ACL rule */\n-        struct rte_acl_field_def field_format[RTE_ACL_MAX_FIELDS];\n-    };\n-\n-The fields for the ACL rule must also be initialised by the application.\n-\n-An ACL table can be added to the ``Classifier`` for each ACL rule, for example\n-another table could be added for the IPv6 5-tuple rule.\n-\n-Flow Parsing\n-~~~~~~~~~~~~\n-\n-The library currently supports three IPv4 5-tuple flow patterns, for UDP, TCP\n-and SCTP.\n-\n-.. code-block:: c\n-\n-    /* Pattern for IPv4 5-tuple UDP filter */\n-    static enum rte_flow_item_type pattern_ntuple_1[] = {\n-        RTE_FLOW_ITEM_TYPE_ETH,\n-        RTE_FLOW_ITEM_TYPE_IPV4,\n-        RTE_FLOW_ITEM_TYPE_UDP,\n-        RTE_FLOW_ITEM_TYPE_END,\n-    };\n-\n-    /* Pattern for IPv4 5-tuple TCP filter */\n-    static enum rte_flow_item_type pattern_ntuple_2[] = {\n-        RTE_FLOW_ITEM_TYPE_ETH,\n-        RTE_FLOW_ITEM_TYPE_IPV4,\n-        RTE_FLOW_ITEM_TYPE_TCP,\n-        RTE_FLOW_ITEM_TYPE_END,\n-    };\n-\n-    /* Pattern for IPv4 5-tuple SCTP filter */\n-    static enum rte_flow_item_type pattern_ntuple_3[] = {\n-        RTE_FLOW_ITEM_TYPE_ETH,\n-        RTE_FLOW_ITEM_TYPE_IPV4,\n-        RTE_FLOW_ITEM_TYPE_SCTP,\n-        RTE_FLOW_ITEM_TYPE_END,\n-    };\n-\n-The API function ``rte_flow_classify_validate`` parses the\n-IPv4 5-tuple pattern, attributes and actions and returns the 5-tuple data in the\n-``rte_eth_ntuple_filter`` structure.\n-\n-.. code-block:: c\n-\n-    static int\n-    rte_flow_classify_validate(struct rte_flow_classifier *cls,\n-                   const struct rte_flow_attr *attr,\n-                   const struct rte_flow_item pattern[],\n-                   const struct rte_flow_action actions[],\n-                   struct rte_flow_error *error)\n-\n-Adding Flow Rules\n-~~~~~~~~~~~~~~~~~\n-\n-The ``rte_flow_classify_table_entry_add`` API creates an\n-``rte_flow_classify`` object which contains the flow_classify id and type, the\n-action, a union of add and delete keys and a union of rules.\n-It uses the ``rte_flow_classify_validate`` API function for parsing the\n-flow parameters.\n-The 5-tuple ACL key data is obtained from the ``rte_eth_ntuple_filter``\n-structure populated by the ``classify_parse_ntuple_filter`` function which\n-parses the Flow rule.\n-\n-.. code-block:: c\n-\n-    struct acl_keys {\n-        struct rte_table_acl_rule_add_params key_add; /* add key */\n-        struct rte_table_acl_rule_delete_params key_del; /* delete key */\n-    };\n-\n-    struct classify_rules {\n-        enum rte_flow_classify_rule_type type;\n-        union {\n-            struct rte_flow_classify_ipv4_5tuple ipv4_5tuple;\n-        } u;\n-    };\n-\n-    struct rte_flow_classify {\n-        uint32_t id;  /* unique ID of classify object */\n-        enum rte_flow_classify_table_type tbl_type; /* rule table */\n-        struct classify_rules rules; /* union of rules */\n-        union {\n-            struct acl_keys key;\n-        } u;\n-        int key_found; /* rule key found in table */\n-        struct rte_flow_classify_table_entry entry;  /* rule meta data */\n-        void *entry_ptr; /* handle to the table entry for rule meta data */\n-    };\n-\n-It then calls the ``table.ops.f_add`` API to add the rule to the ACL\n-table.\n-\n-Deleting Flow Rules\n-~~~~~~~~~~~~~~~~~~~\n-\n-The ``rte_flow_classify_table_entry_delete`` API calls the\n-``table.ops.f_delete`` API to delete a rule from the ACL table.\n-\n-Packet Matching\n-~~~~~~~~~~~~~~~\n-\n-The ``rte_flow_classifier_query`` API is used to find packets which match a\n-given flow rule in the table.\n-This API calls the flow_classify_run internal function which calls the\n-``table.ops.f_lookup`` API to see if any packets in a burst match any\n-of the Flow rules in the table.\n-The meta data for the highest priority rule matched for each packet is returned\n-in the entries array in the ``rte_flow_classify`` object.\n-The internal function ``action_apply`` implements the ``Count`` action which is\n-used to return data which matches a particular Flow rule.\n-\n-The rte_flow_classifier_query API uses the following structures to return data\n-to the application.\n-\n-.. code-block:: c\n-\n-    /** IPv4 5-tuple data */\n-    struct rte_flow_classify_ipv4_5tuple {\n-        uint32_t dst_ip;         /**< Destination IP address in big endian. */\n-        uint32_t dst_ip_mask;    /**< Mask of destination IP address. */\n-        uint32_t src_ip;         /**< Source IP address in big endian. */\n-        uint32_t src_ip_mask;    /**< Mask of destination IP address. */\n-        uint16_t dst_port;       /**< Destination port in big endian. */\n-        uint16_t dst_port_mask;  /**< Mask of destination port. */\n-        uint16_t src_port;       /**< Source Port in big endian. */\n-        uint16_t src_port_mask;  /**< Mask of source port. */\n-        uint8_t proto;           /**< L4 protocol. */\n-        uint8_t proto_mask;      /**< Mask of L4 protocol. */\n-    };\n-\n-    /**\n-     * Flow stats\n-     *\n-     * For the count action, stats can be returned by the query API.\n-     *\n-     * Storage for stats is provided by the application.\n-     *\n-     *\n-     */\n-    struct rte_flow_classify_stats {\n-        void *stats;\n-    };\n-\n-    struct rte_flow_classify_5tuple_stats {\n-        /** count of packets that match IPv4 5tuple pattern */\n-        uint64_t counter1;\n-        /** IPv4 5tuple data */\n-        struct rte_flow_classify_ipv4_5tuple ipv4_5tuple;\n-    };\ndiff --git a/doc/guides/prog_guide/index.rst b/doc/guides/prog_guide/index.rst\nindex d89cd3edb63c..c04847bfa148 100644\n--- a/doc/guides/prog_guide/index.rst\n+++ b/doc/guides/prog_guide/index.rst\n@@ -43,7 +43,6 @@ Programmer's Guide\n     lpm6_lib\n     fib_lib\n     rib_lib\n-    flow_classify_lib\n     packet_distrib_lib\n     reorder_lib\n     ip_fragment_reassembly_lib\ndiff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst\nindex 494b401cda4b..ce5a8f0361cb 100644\n--- a/doc/guides/rel_notes/deprecation.rst\n+++ b/doc/guides/rel_notes/deprecation.rst\n@@ -35,7 +35,7 @@ Deprecation Notices\n     which also added support for standard atomics\n     (Ref: https://releases.llvm.org/3.6.0/tools/clang/docs/ReleaseNotes.html)\n \n-* build: Enabling deprecated libraries (``flow_classify``, ``kni``)\n+* build: Enabling deprecated libraries (``kni``)\n   won't be possible anymore through the use of the ``disable_libs`` build option.\n   A new build option for deprecated libraries will be introduced instead.\n \n@@ -200,12 +200,6 @@ Deprecation Notices\n   Since these functions are not called directly by the application,\n   the API remains unaffected.\n \n-* flow_classify: The flow_classify library and example have no maintainer.\n-  The library is experimental and, as such, it could be removed from DPDK.\n-  Its removal has been postponed to let potential users report interest\n-  in maintaining it.\n-  In the absence of such interest, this library will be removed in DPDK 23.11.\n-\n * pipeline: The pipeline library legacy API (functions rte_pipeline_*)\n   will be deprecated and subsequently removed in DPDK 24.11 release.\n   Before this, the new pipeline library API (functions rte_swx_pipeline_*)\ndiff --git a/doc/guides/rel_notes/release_23_11.rst b/doc/guides/rel_notes/release_23_11.rst\nindex 6b4dd21fd0e1..9d96dbdcd302 100644\n--- a/doc/guides/rel_notes/release_23_11.rst\n+++ b/doc/guides/rel_notes/release_23_11.rst\n@@ -68,6 +68,8 @@ Removed Items\n    Also, make sure to start the actual text at the margin.\n    =======================================================\n \n+* flow_classify: Removed flow classification library and examples.\n+\n \n API Changes\n -----------\ndiff --git a/doc/guides/sample_app_ug/flow_classify.rst b/doc/guides/sample_app_ug/flow_classify.rst\ndeleted file mode 100644\nindex 6c4c04e935e4..000000000000\n--- a/doc/guides/sample_app_ug/flow_classify.rst\n+++ /dev/null\n@@ -1,242 +0,0 @@\n-..  SPDX-License-Identifier: BSD-3-Clause\n-    Copyright(c) 2017 Intel Corporation.\n-\n-Flow Classify Sample Application\n-================================\n-\n-The Flow Classify sample application is based on the simple *skeleton* example\n-of a forwarding application.\n-\n-It is intended as a demonstration of the basic components of a DPDK forwarding\n-application which uses the Flow Classify library API's.\n-\n-Please refer to the\n-:doc:`../prog_guide/flow_classify_lib`\n-for more information.\n-\n-Compiling the Application\n--------------------------\n-\n-To compile the sample application see :doc:`compiling`.\n-\n-The application is located in the ``flow_classify`` sub-directory.\n-\n-Running the Application\n------------------------\n-\n-To run the example in a ``linux`` environment:\n-\n-.. code-block:: console\n-\n-    ./<build_dir>/examples/dpdk-flow_classify -c 4 -n 4 -- /\n-    --rule_ipv4=\"../ipv4_rules_file.txt\"\n-\n-Please refer to the *DPDK Getting Started Guide*, section\n-:doc:`../linux_gsg/build_sample_apps`\n-for general information on running applications and the Environment Abstraction\n-Layer (EAL) options.\n-\n-\n-Sample ipv4_rules_file.txt\n---------------------------\n-\n-.. code-block:: console\n-\n-    #file format:\n-    #src_ip/masklen dst_ip/masklen src_port : mask dst_port : mask proto/mask priority\n-    #\n-    2.2.2.3/24 2.2.2.7/24 32 : 0xffff 33 : 0xffff 17/0xff 0\n-    9.9.9.3/24 9.9.9.7/24 32 : 0xffff 33 : 0xffff 17/0xff 1\n-    9.9.9.3/24 9.9.9.7/24 32 : 0xffff 33 : 0xffff 6/0xff 2\n-    9.9.8.3/24 9.9.8.7/24 32 : 0xffff 33 : 0xffff 6/0xff 3\n-    6.7.8.9/24 2.3.4.5/24 32 : 0x0000 33 : 0x0000 132/0xff 4\n-\n-Explanation\n------------\n-\n-The following sections provide an explanation of the main components of the\n-code.\n-\n-All DPDK library functions used in the sample code are prefixed with ``rte_``\n-and are explained in detail in the *DPDK API Documentation*.\n-\n-ACL field definitions for the IPv4 5 tuple rule\n-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n-\n-The following field definitions are used when creating the ACL table during\n-initialisation of the ``Flow Classify`` application\n-\n-.. literalinclude:: ../../../examples/flow_classify/flow_classify.c\n-    :language: c\n-    :start-after: Creation of ACL table during initialization of application. 8<\n-    :end-before: >8 End of creation of ACL table.\n-\n-The Main Function\n-~~~~~~~~~~~~~~~~~\n-\n-The ``main()`` function performs the initialization and calls the execution\n-threads for each lcore.\n-\n-The first task is to initialize the Environment Abstraction Layer (EAL).\n-The ``argc`` and ``argv`` arguments are provided to the ``rte_eal_init()``\n-function. The value returned is the number of parsed arguments:\n-\n-.. literalinclude:: ../../../examples/flow_classify/flow_classify.c\n-    :language: c\n-    :start-after: Initialize the Environment Abstraction Layer (EAL). 8<\n-    :end-before: >8 End of initialization of EAL.\n-    :dedent: 1\n-\n-It then parses the flow_classify application arguments\n-\n-.. literalinclude:: ../../../examples/flow_classify/flow_classify.c\n-    :language: c\n-    :start-after: Parse application arguments (after the EAL ones). 8<\n-    :end-before: >8 End of parse application arguments.\n-    :dedent: 1\n-\n-The ``main()`` function also allocates a mempool to hold the mbufs\n-(Message Buffers) used by the application:\n-\n-.. literalinclude:: ../../../examples/flow_classify/flow_classify.c\n-    :language: c\n-    :start-after: Creates a new mempool in memory to hold the mbufs. 8<\n-    :end-before: >8 End of creation of new mempool in memory.\n-    :dedent: 1\n-\n-mbufs are the packet buffer structure used by DPDK. They are explained in\n-detail in the \"Mbuf Library\" section of the *DPDK Programmer's Guide*.\n-\n-The ``main()`` function also initializes all the ports using the user defined\n-``port_init()`` function which is explained in the next section:\n-\n-.. literalinclude:: ../../../examples/flow_classify/flow_classify.c\n-    :language: c\n-    :start-after: Initialize all ports. 8<\n-    :end-before: >8 End of initialization of all ports.\n-    :dedent: 1\n-\n-The ``main()`` function creates the ``flow classifier object`` and adds an ``ACL\n-table`` to the flow classifier.\n-\n-.. literalinclude:: ../../../examples/flow_classify/flow_classify.c\n-    :language: c\n-    :start-after: Creation of flow classifier object. 8<\n-    :end-before: >8 End of creation of flow classifier object.\n-\n-.. literalinclude:: ../../../examples/flow_classify/flow_classify.c\n-    :language: c\n-    :start-after: Memory allocation. 8<\n-    :end-before: >8 End of initialization of table create params.\n-    :dedent: 1\n-\n-It then reads the ipv4_rules_file.txt file and initialises the parameters for\n-the ``rte_flow_classify_table_entry_add`` API.\n-This API adds a rule to the ACL table.\n-\n-.. literalinclude:: ../../../examples/flow_classify/flow_classify.c\n-    :language: c\n-    :start-after: Read file of IPv4 tuple rules. 8<\n-    :end-before: >8 End of reading file of IPv4 5 tuple rules.\n-    :dedent: 1\n-\n-Once the initialization is complete, the application is ready to launch a\n-function on an lcore. In this example ``lcore_main()`` is called on a single\n-lcore.\n-\n-.. code-block:: c\n-\n-    lcore_main(cls_app);\n-\n-The ``lcore_main()`` function is explained below.\n-\n-The Port Initialization  Function\n-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n-\n-The main functional part of the port initialization used in the Basic\n-Forwarding application is shown below:\n-\n-.. literalinclude:: ../../../examples/flow_classify/flow_classify.c\n-    :language: c\n-    :start-after: Initializing port using global settings. 8<\n-    :end-before: >8 End of initializing a given port.\n-\n-The Ethernet ports are configured with default settings using the\n-``rte_eth_dev_configure()`` function.\n-\n-For this example the ports are set up with 1 RX and 1 TX queue using the\n-``rte_eth_rx_queue_setup()`` and ``rte_eth_tx_queue_setup()`` functions.\n-\n-The Ethernet port is then started:\n-\n-.. literalinclude:: ../../../examples/flow_classify/flow_classify.c\n-    :language: c\n-    :start-after: Start the Ethernet port. 8<\n-    :end-before: >8 End of starting the Ethernet port.\n-    :dedent: 1\n-\n-\n-Finally the RX port is set in promiscuous mode:\n-\n-.. code-block:: c\n-\n-    retval = rte_eth_promiscuous_enable(port);\n-\n-The Add Rules function\n-~~~~~~~~~~~~~~~~~~~~~~\n-\n-The ``add_rules`` function reads the ``ipv4_rules_file.txt`` file and calls the\n-``add_classify_rule`` function which calls the\n-``rte_flow_classify_table_entry_add`` API.\n-\n-.. literalinclude:: ../../../examples/flow_classify/flow_classify.c\n-    :language: c\n-    :start-after: Reads file and calls the add_classify_rule function. 8<\n-    :end-before: >8 End of add_rules.\n-\n-\n-The Lcore Main function\n-~~~~~~~~~~~~~~~~~~~~~~~\n-\n-As we saw above the ``main()`` function calls an application function on the\n-available lcores.\n-The ``lcore_main`` function calls the ``rte_flow_classifier_query`` API.\n-For the Basic Forwarding application the ``lcore_main`` function looks like the\n-following:\n-\n-.. literalinclude:: ../../../examples/flow_classify/flow_classify.c\n-    :language: c\n-    :start-after: Flow classify data. 8<\n-    :end-before: >8 End of flow classify data.\n-\n-.. literalinclude:: ../../../examples/flow_classify/flow_classify.c\n-    :language: c\n-    :start-after: Classifying the packets. 8<\n-    :end-before: >8 End of lcore main.\n-\n-The main work of the application is done within the loop:\n-\n-.. literalinclude:: ../../../examples/flow_classify/flow_classify.c\n-    :language: c\n-    :start-after: Run until the application is quit or killed. 8<\n-    :end-before: >8 End of main loop.\n-    :dedent: 1\n-\n-Packets are received in bursts on the RX ports and transmitted in bursts on\n-the TX ports. The ports are grouped in pairs with a simple mapping scheme\n-using the an XOR on the port number::\n-\n-    0 -> 1\n-    1 -> 0\n-\n-    2 -> 3\n-    3 -> 2\n-\n-    etc.\n-\n-The ``rte_eth_tx_burst()`` function frees the memory buffers of packets that\n-are transmitted. If packets fail to transmit, ``(nb_tx < nb_rx)``, then they\n-must be freed explicitly using ``rte_pktmbuf_free()``.\n-\n-The forwarding loop can be interrupted and the application closed using\n-``Ctrl-C``.\ndiff --git a/doc/guides/sample_app_ug/index.rst b/doc/guides/sample_app_ug/index.rst\nindex 6e1e83d7d7c8..19485556c765 100644\n--- a/doc/guides/sample_app_ug/index.rst\n+++ b/doc/guides/sample_app_ug/index.rst\n@@ -15,7 +15,6 @@ Sample Applications User Guides\n     hello_world\n     skeleton\n     rxtx_callbacks\n-    flow_classify\n     flow_filtering\n     ip_frag\n     ipv4_multicast\ndiff --git a/examples/flow_classify/Makefile b/examples/flow_classify/Makefile\ndeleted file mode 100644\nindex 539bf9682b06..000000000000\n--- a/examples/flow_classify/Makefile\n+++ /dev/null\n@@ -1,51 +0,0 @@\n-# SPDX-License-Identifier: BSD-3-Clause\n-# Copyright(c) 2017 Intel Corporation\n-\n-# binary name\n-APP = flow_classify\n-\n-# all source are stored in SRCS-y\n-SRCS-y := flow_classify.c\n-\n-PKGCONF ?= pkg-config\n-\n-# Build using pkg-config variables if possible\n-ifneq ($(shell $(PKGCONF) --exists libdpdk && echo 0),0)\n-$(error \"no installation of DPDK found\")\n-endif\n-\n-all: shared\n-.PHONY: shared static\n-shared: build/$(APP)-shared\n-\tln -sf $(APP)-shared build/$(APP)\n-static: build/$(APP)-static\n-\tln -sf $(APP)-static build/$(APP)\n-\n-PC_FILE := $(shell $(PKGCONF) --path libdpdk 2>/dev/null)\n-CFLAGS += -O3 $(shell $(PKGCONF) --cflags libdpdk)\n-LDFLAGS_SHARED = $(shell $(PKGCONF) --libs libdpdk)\n-LDFLAGS_STATIC = $(shell $(PKGCONF) --static --libs libdpdk)\n-\n-ifeq ($(MAKECMDGOALS),static)\n-# check for broken pkg-config\n-ifeq ($(shell echo $(LDFLAGS_STATIC) | grep 'whole-archive.*l:lib.*no-whole-archive'),)\n-$(warning \"pkg-config output list does not contain drivers between 'whole-archive'/'no-whole-archive' flags.\")\n-$(error \"Cannot generate statically-linked binaries with this version of pkg-config\")\n-endif\n-endif\n-\n-CFLAGS += -DALLOW_EXPERIMENTAL_API\n-\n-build/$(APP)-shared: $(SRCS-y) Makefile $(PC_FILE) | build\n-\t$(CC) $(CFLAGS) $(SRCS-y) -o $@ $(LDFLAGS) $(LDFLAGS_SHARED)\n-\n-build/$(APP)-static: $(SRCS-y) Makefile $(PC_FILE) | build\n-\t$(CC) $(CFLAGS) $(SRCS-y) -o $@ $(LDFLAGS) $(LDFLAGS_STATIC)\n-\n-build:\n-\t@mkdir -p $@\n-\n-.PHONY: clean\n-clean:\n-\trm -f build/$(APP) build/$(APP)-static build/$(APP)-shared\n-\ttest -d build && rmdir -p build || true\ndiff --git a/examples/flow_classify/flow_classify.c b/examples/flow_classify/flow_classify.c\ndeleted file mode 100644\nindex cdd51b247628..000000000000\n--- a/examples/flow_classify/flow_classify.c\n+++ /dev/null\n@@ -1,878 +0,0 @@\n-/* SPDX-License-Identifier: BSD-3-Clause\n- * Copyright(c) 2017 Intel Corporation\n- */\n-\n-#include <stdint.h>\n-#include <inttypes.h>\n-#include <getopt.h>\n-\n-#include <rte_eal.h>\n-#include <rte_ethdev.h>\n-#include <rte_cycles.h>\n-#include <rte_lcore.h>\n-#include <rte_mbuf.h>\n-#include <rte_flow.h>\n-#include <rte_flow_classify.h>\n-#include <rte_table_acl.h>\n-\n-#define RX_RING_SIZE 1024\n-#define TX_RING_SIZE 1024\n-\n-#define NUM_MBUFS 8191\n-#define MBUF_CACHE_SIZE 250\n-#define BURST_SIZE 32\n-\n-#define MAX_NUM_CLASSIFY 30\n-#define FLOW_CLASSIFY_MAX_RULE_NUM 91\n-#define FLOW_CLASSIFY_MAX_PRIORITY 8\n-#define FLOW_CLASSIFIER_NAME_SIZE 64\n-\n-#define COMMENT_LEAD_CHAR\t('#')\n-#define OPTION_RULE_IPV4\t\"rule_ipv4\"\n-#define RTE_LOGTYPE_FLOW_CLASSIFY\tRTE_LOGTYPE_USER3\n-#define flow_classify_log(format, ...) \\\n-\t\tRTE_LOG(ERR, FLOW_CLASSIFY, format, ##__VA_ARGS__)\n-\n-#define uint32_t_to_char(ip, a, b, c, d) do {\\\n-\t\t*a = (unsigned char)(ip >> 24 & 0xff);\\\n-\t\t*b = (unsigned char)(ip >> 16 & 0xff);\\\n-\t\t*c = (unsigned char)(ip >> 8 & 0xff);\\\n-\t\t*d = (unsigned char)(ip & 0xff);\\\n-\t} while (0)\n-\n-enum {\n-\tCB_FLD_SRC_ADDR,\n-\tCB_FLD_DST_ADDR,\n-\tCB_FLD_SRC_PORT,\n-\tCB_FLD_SRC_PORT_DLM,\n-\tCB_FLD_SRC_PORT_MASK,\n-\tCB_FLD_DST_PORT,\n-\tCB_FLD_DST_PORT_DLM,\n-\tCB_FLD_DST_PORT_MASK,\n-\tCB_FLD_PROTO,\n-\tCB_FLD_PRIORITY,\n-\tCB_FLD_NUM,\n-};\n-\n-static struct{\n-\tconst char *rule_ipv4_name;\n-} parm_config;\n-const char cb_port_delim[] = \":\";\n-\n-/* Creation of flow classifier object. 8< */\n-struct flow_classifier {\n-\tstruct rte_flow_classifier *cls;\n-};\n-\n-struct flow_classifier_acl {\n-\tstruct flow_classifier cls;\n-} __rte_cache_aligned;\n-/* >8 End of creation of flow classifier object. */\n-\n-/*  Creation of ACL table during initialization of application. 8< */\n-\n-/* ACL field definitions for IPv4 5 tuple rule */\n-enum {\n-\tPROTO_FIELD_IPV4,\n-\tSRC_FIELD_IPV4,\n-\tDST_FIELD_IPV4,\n-\tSRCP_FIELD_IPV4,\n-\tDSTP_FIELD_IPV4,\n-\tNUM_FIELDS_IPV4\n-};\n-\n-enum {\n-\tPROTO_INPUT_IPV4,\n-\tSRC_INPUT_IPV4,\n-\tDST_INPUT_IPV4,\n-\tSRCP_DESTP_INPUT_IPV4\n-};\n-\n-static struct rte_acl_field_def ipv4_defs[NUM_FIELDS_IPV4] = {\n-\t/* first input field - always one byte long. */\n-\t{\n-\t\t.type = RTE_ACL_FIELD_TYPE_BITMASK,\n-\t\t.size = sizeof(uint8_t),\n-\t\t.field_index = PROTO_FIELD_IPV4,\n-\t\t.input_index = PROTO_INPUT_IPV4,\n-\t\t.offset = sizeof(struct rte_ether_hdr) +\n-\t\t\toffsetof(struct rte_ipv4_hdr, next_proto_id),\n-\t},\n-\t/* next input field (IPv4 source address) - 4 consecutive bytes. */\n-\t{\n-\t\t/* rte_flow uses a bit mask for IPv4 addresses */\n-\t\t.type = RTE_ACL_FIELD_TYPE_BITMASK,\n-\t\t.size = sizeof(uint32_t),\n-\t\t.field_index = SRC_FIELD_IPV4,\n-\t\t.input_index = SRC_INPUT_IPV4,\n-\t\t.offset = sizeof(struct rte_ether_hdr) +\n-\t\t\toffsetof(struct rte_ipv4_hdr, src_addr),\n-\t},\n-\t/* next input field (IPv4 destination address) - 4 consecutive bytes. */\n-\t{\n-\t\t/* rte_flow uses a bit mask for IPv4 addresses */\n-\t\t.type = RTE_ACL_FIELD_TYPE_BITMASK,\n-\t\t.size = sizeof(uint32_t),\n-\t\t.field_index = DST_FIELD_IPV4,\n-\t\t.input_index = DST_INPUT_IPV4,\n-\t\t.offset = sizeof(struct rte_ether_hdr) +\n-\t\t\toffsetof(struct rte_ipv4_hdr, dst_addr),\n-\t},\n-\t/*\n-\t * Next 2 fields (src & dst ports) form 4 consecutive bytes.\n-\t * They share the same input index.\n-\t */\n-\t{\n-\t\t/* rte_flow uses a bit mask for protocol ports */\n-\t\t.type = RTE_ACL_FIELD_TYPE_BITMASK,\n-\t\t.size = sizeof(uint16_t),\n-\t\t.field_index = SRCP_FIELD_IPV4,\n-\t\t.input_index = SRCP_DESTP_INPUT_IPV4,\n-\t\t.offset = sizeof(struct rte_ether_hdr) +\n-\t\t\tsizeof(struct rte_ipv4_hdr) +\n-\t\t\toffsetof(struct rte_tcp_hdr, src_port),\n-\t},\n-\t{\n-\t\t/* rte_flow uses a bit mask for protocol ports */\n-\t\t.type = RTE_ACL_FIELD_TYPE_BITMASK,\n-\t\t.size = sizeof(uint16_t),\n-\t\t.field_index = DSTP_FIELD_IPV4,\n-\t\t.input_index = SRCP_DESTP_INPUT_IPV4,\n-\t\t.offset = sizeof(struct rte_ether_hdr) +\n-\t\t\tsizeof(struct rte_ipv4_hdr) +\n-\t\t\toffsetof(struct rte_tcp_hdr, dst_port),\n-\t},\n-};\n-/* >8 End of creation of ACL table. */\n-\n-/* Flow classify data. 8< */\n-static int num_classify_rules;\n-static struct rte_flow_classify_rule *rules[MAX_NUM_CLASSIFY];\n-static struct rte_flow_classify_ipv4_5tuple_stats ntuple_stats;\n-static struct rte_flow_classify_stats classify_stats = {\n-\t\t.stats = (void **)&ntuple_stats\n-};\n-/* >8 End of flow classify data. */\n-\n-/* parameters for rte_flow_classify_validate and\n- * rte_flow_classify_table_entry_add functions\n- */\n-\n-static struct rte_flow_item  eth_item = { RTE_FLOW_ITEM_TYPE_ETH,\n-\t0, 0, 0 };\n-static struct rte_flow_item  end_item = { RTE_FLOW_ITEM_TYPE_END,\n-\t0, 0, 0 };\n-\n-/* sample actions:\n- * \"actions count / end\"\n- */\n-struct rte_flow_query_count count = {\n-\t.reset = 1,\n-\t.hits_set = 1,\n-\t.bytes_set = 1,\n-\t.hits = 0,\n-\t.bytes = 0,\n-};\n-static struct rte_flow_action count_action = { RTE_FLOW_ACTION_TYPE_COUNT,\n-\t&count};\n-static struct rte_flow_action end_action = { RTE_FLOW_ACTION_TYPE_END, 0};\n-static struct rte_flow_action actions[2];\n-\n-/* sample attributes */\n-static struct rte_flow_attr attr;\n-\n-/* flow_classify.c: * Based on DPDK skeleton forwarding example. */\n-\n-/*\n- * Initializes a given port using global settings and with the RX buffers\n- * coming from the mbuf_pool passed as a parameter.\n- */\n-\n-/* Initializing port using global settings. 8< */\n-static inline int\n-port_init(uint8_t port, struct rte_mempool *mbuf_pool)\n-{\n-\tstruct rte_eth_conf port_conf;\n-\tstruct rte_ether_addr addr;\n-\tconst uint16_t rx_rings = 1, tx_rings = 1;\n-\tint retval;\n-\tuint16_t q;\n-\tstruct rte_eth_dev_info dev_info;\n-\tstruct rte_eth_txconf txconf;\n-\n-\tif (!rte_eth_dev_is_valid_port(port))\n-\t\treturn -1;\n-\n-\tmemset(&port_conf, 0, sizeof(struct rte_eth_conf));\n-\n-\tretval = rte_eth_dev_info_get(port, &dev_info);\n-\tif (retval != 0) {\n-\t\tprintf(\"Error during getting device (port %u) info: %s\\n\",\n-\t\t\t\tport, strerror(-retval));\n-\t\treturn retval;\n-\t}\n-\n-\tif (dev_info.tx_offload_capa & RTE_ETH_TX_OFFLOAD_MBUF_FAST_FREE)\n-\t\tport_conf.txmode.offloads |=\n-\t\t\tRTE_ETH_TX_OFFLOAD_MBUF_FAST_FREE;\n-\n-\t/* Configure the Ethernet device. */\n-\tretval = rte_eth_dev_configure(port, rx_rings, tx_rings, &port_conf);\n-\tif (retval != 0)\n-\t\treturn retval;\n-\n-\t/* Allocate and set up 1 RX queue per Ethernet port. */\n-\tfor (q = 0; q < rx_rings; q++) {\n-\t\tretval = rte_eth_rx_queue_setup(port, q, RX_RING_SIZE,\n-\t\t\t\trte_eth_dev_socket_id(port), NULL, mbuf_pool);\n-\t\tif (retval < 0)\n-\t\t\treturn retval;\n-\t}\n-\n-\ttxconf = dev_info.default_txconf;\n-\ttxconf.offloads = port_conf.txmode.offloads;\n-\t/* Allocate and set up 1 TX queue per Ethernet port. */\n-\tfor (q = 0; q < tx_rings; q++) {\n-\t\tretval = rte_eth_tx_queue_setup(port, q, TX_RING_SIZE,\n-\t\t\t\trte_eth_dev_socket_id(port), &txconf);\n-\t\tif (retval < 0)\n-\t\t\treturn retval;\n-\t}\n-\n-\t/* Start the Ethernet port. 8< */\n-\tretval = rte_eth_dev_start(port);\n-\t/* >8 End of starting the Ethernet port. */\n-\tif (retval < 0)\n-\t\treturn retval;\n-\n-\t/* Display the port MAC address. */\n-\tretval = rte_eth_macaddr_get(port, &addr);\n-\tif (retval != 0)\n-\t\treturn retval;\n-\n-\tprintf(\"Port %u MAC: %02\" PRIx8 \" %02\" PRIx8 \" %02\" PRIx8\n-\t\t\t   \" %02\" PRIx8 \" %02\" PRIx8 \" %02\" PRIx8 \"\\n\",\n-\t\t\tport, RTE_ETHER_ADDR_BYTES(&addr));\n-\n-\t/* Enable RX in promiscuous mode for the Ethernet device. */\n-\tretval = rte_eth_promiscuous_enable(port);\n-\tif (retval != 0)\n-\t\treturn retval;\n-\n-\treturn 0;\n-}\n-/* >8 End of initializing a given port. */\n-\n-/*\n- * The lcore main. This is the main thread that does the work, reading from\n- * an input port classifying the packets and writing to an output port.\n- */\n-\n-/* Classifying the packets. 8< */\n-static __rte_noreturn void\n-lcore_main(struct flow_classifier *cls_app)\n-{\n-\tuint16_t port;\n-\tint ret;\n-\tint i = 0;\n-\n-\tret = rte_flow_classify_table_entry_delete(cls_app->cls,\n-\t\t\trules[7]);\n-\tif (ret)\n-\t\tprintf(\"table_entry_delete failed [7] %d\\n\\n\", ret);\n-\telse\n-\t\tprintf(\"table_entry_delete succeeded [7]\\n\\n\");\n-\n-\t/*\n-\t * Check that the port is on the same NUMA node as the polling thread\n-\t * for best performance.\n-\t */\n-\tRTE_ETH_FOREACH_DEV(port)\n-\t\tif (rte_eth_dev_socket_id(port) >= 0 &&\n-\t\t\trte_eth_dev_socket_id(port) != (int)rte_socket_id()) {\n-\t\t\tprintf(\"\\n\\n\");\n-\t\t\tprintf(\"WARNING: port %u is on remote NUMA node\\n\",\n-\t\t\t       port);\n-\t\t\tprintf(\"to polling thread.\\n\");\n-\t\t\tprintf(\"Performance will not be optimal.\\n\");\n-\t\t}\n-\tprintf(\"\\nCore %u forwarding packets. \", rte_lcore_id());\n-\tprintf(\"[Ctrl+C to quit]\\n\");\n-\n-\t/* Run until the application is quit or killed. 8< */\n-\tfor (;;) {\n-\t\t/*\n-\t\t * Receive packets on a port, classify them and forward them\n-\t\t * on the paired port.\n-\t\t * The mapping is 0 -> 1, 1 -> 0, 2 -> 3, 3 -> 2, etc.\n-\t\t */\n-\t\tRTE_ETH_FOREACH_DEV(port) {\n-\t\t\t/* Get burst of RX packets, from first port of pair. */\n-\t\t\tstruct rte_mbuf *bufs[BURST_SIZE];\n-\t\t\tconst uint16_t nb_rx = rte_eth_rx_burst(port, 0,\n-\t\t\t\t\tbufs, BURST_SIZE);\n-\n-\t\t\tif (unlikely(nb_rx == 0))\n-\t\t\t\tcontinue;\n-\n-\t\t\tfor (i = 0; i < MAX_NUM_CLASSIFY; i++) {\n-\t\t\t\tif (rules[i]) {\n-\t\t\t\t\tret = rte_flow_classifier_query(\n-\t\t\t\t\t\tcls_app->cls,\n-\t\t\t\t\t\tbufs, nb_rx, rules[i],\n-\t\t\t\t\t\t&classify_stats);\n-\t\t\t\t\tif (ret)\n-\t\t\t\t\t\tprintf(\n-\t\t\t\t\t\t\t\"rule [%d] query failed ret [%d]\\n\\n\",\n-\t\t\t\t\t\t\ti, ret);\n-\t\t\t\t\telse {\n-\t\t\t\t\t\tprintf(\n-\t\t\t\t\t\t\"rule[%d] count=%\"PRIu64\"\\n\",\n-\t\t\t\t\t\ti, ntuple_stats.counter1);\n-\n-\t\t\t\t\t\tprintf(\"proto = %d\\n\",\n-\t\t\t\t\t\tntuple_stats.ipv4_5tuple.proto);\n-\t\t\t\t\t}\n-\t\t\t\t}\n-\t\t\t}\n-\n-\t\t\t/* Send burst of TX packets, to second port of pair. */\n-\t\t\tconst uint16_t nb_tx = rte_eth_tx_burst(port ^ 1, 0,\n-\t\t\t\t\tbufs, nb_rx);\n-\n-\t\t\t/* Free any unsent packets. */\n-\t\t\tif (unlikely(nb_tx < nb_rx)) {\n-\t\t\t\tuint16_t buf;\n-\n-\t\t\t\tfor (buf = nb_tx; buf < nb_rx; buf++)\n-\t\t\t\t\trte_pktmbuf_free(bufs[buf]);\n-\t\t\t}\n-\t\t}\n-\t}\n-\t/* >8 End of main loop. */\n-}\n-/* >8 End of lcore main. */\n-\n-/*\n- * Parse IPv4 5 tuple rules file, ipv4_rules_file.txt.\n- * Expected format:\n- * <src_ipv4_addr>'/'<masklen> <space> \\\n- * <dst_ipv4_addr>'/'<masklen> <space> \\\n- * <src_port> <space> \":\" <src_port_mask> <space> \\\n- * <dst_port> <space> \":\" <dst_port_mask> <space> \\\n- * <proto>'/'<proto_mask> <space> \\\n- * <priority>\n- */\n-\n-static int\n-get_cb_field(char **in, uint32_t *fd, int base, unsigned long lim,\n-\t\tchar dlm)\n-{\n-\tunsigned long val;\n-\tchar *end;\n-\n-\terrno = 0;\n-\tval = strtoul(*in, &end, base);\n-\tif (errno != 0 || end[0] != dlm || val > lim)\n-\t\treturn -EINVAL;\n-\t*fd = (uint32_t)val;\n-\t*in = end + 1;\n-\treturn 0;\n-}\n-\n-static int\n-parse_ipv4_net(char *in, uint32_t *addr, uint32_t *mask_len)\n-{\n-\tuint32_t a, b, c, d, m;\n-\n-\tif (get_cb_field(&in, &a, 0, UINT8_MAX, '.'))\n-\t\treturn -EINVAL;\n-\tif (get_cb_field(&in, &b, 0, UINT8_MAX, '.'))\n-\t\treturn -EINVAL;\n-\tif (get_cb_field(&in, &c, 0, UINT8_MAX, '.'))\n-\t\treturn -EINVAL;\n-\tif (get_cb_field(&in, &d, 0, UINT8_MAX, '/'))\n-\t\treturn -EINVAL;\n-\tif (get_cb_field(&in, &m, 0, sizeof(uint32_t) * CHAR_BIT, 0))\n-\t\treturn -EINVAL;\n-\n-\taddr[0] = RTE_IPV4(a, b, c, d);\n-\tmask_len[0] = m;\n-\treturn 0;\n-}\n-\n-static int\n-parse_ipv4_5tuple_rule(char *str, struct rte_eth_ntuple_filter *ntuple_filter)\n-{\n-\tint i, ret;\n-\tchar *s, *sp, *in[CB_FLD_NUM];\n-\tstatic const char *dlm = \" \\t\\n\";\n-\tint dim = CB_FLD_NUM;\n-\tuint32_t temp;\n-\n-\ts = str;\n-\tfor (i = 0; i != dim; i++, s = NULL) {\n-\t\tin[i] = strtok_r(s, dlm, &sp);\n-\t\tif (in[i] == NULL)\n-\t\t\treturn -EINVAL;\n-\t}\n-\n-\tret = parse_ipv4_net(in[CB_FLD_SRC_ADDR],\n-\t\t\t&ntuple_filter->src_ip,\n-\t\t\t&ntuple_filter->src_ip_mask);\n-\tif (ret != 0) {\n-\t\tflow_classify_log(\"failed to read source address/mask: %s\\n\",\n-\t\t\tin[CB_FLD_SRC_ADDR]);\n-\t\treturn ret;\n-\t}\n-\n-\tret = parse_ipv4_net(in[CB_FLD_DST_ADDR],\n-\t\t\t&ntuple_filter->dst_ip,\n-\t\t\t&ntuple_filter->dst_ip_mask);\n-\tif (ret != 0) {\n-\t\tflow_classify_log(\"failed to read destination address/mask: %s\\n\",\n-\t\t\tin[CB_FLD_DST_ADDR]);\n-\t\treturn ret;\n-\t}\n-\n-\tif (get_cb_field(&in[CB_FLD_SRC_PORT], &temp, 0, UINT16_MAX, 0))\n-\t\treturn -EINVAL;\n-\tntuple_filter->src_port = (uint16_t)temp;\n-\n-\tif (strncmp(in[CB_FLD_SRC_PORT_DLM], cb_port_delim,\n-\t\t\tsizeof(cb_port_delim)) != 0)\n-\t\treturn -EINVAL;\n-\n-\tif (get_cb_field(&in[CB_FLD_SRC_PORT_MASK], &temp, 0, UINT16_MAX, 0))\n-\t\treturn -EINVAL;\n-\tntuple_filter->src_port_mask = (uint16_t)temp;\n-\n-\tif (get_cb_field(&in[CB_FLD_DST_PORT], &temp, 0, UINT16_MAX, 0))\n-\t\treturn -EINVAL;\n-\tntuple_filter->dst_port = (uint16_t)temp;\n-\n-\tif (strncmp(in[CB_FLD_DST_PORT_DLM], cb_port_delim,\n-\t\t\tsizeof(cb_port_delim)) != 0)\n-\t\treturn -EINVAL;\n-\n-\tif (get_cb_field(&in[CB_FLD_DST_PORT_MASK], &temp, 0, UINT16_MAX, 0))\n-\t\treturn -EINVAL;\n-\tntuple_filter->dst_port_mask = (uint16_t)temp;\n-\n-\tif (get_cb_field(&in[CB_FLD_PROTO], &temp, 0, UINT8_MAX, '/'))\n-\t\treturn -EINVAL;\n-\tntuple_filter->proto = (uint8_t)temp;\n-\n-\tif (get_cb_field(&in[CB_FLD_PROTO], &temp, 0, UINT8_MAX, 0))\n-\t\treturn -EINVAL;\n-\tntuple_filter->proto_mask = (uint8_t)temp;\n-\n-\tif (get_cb_field(&in[CB_FLD_PRIORITY], &temp, 0, UINT16_MAX, 0))\n-\t\treturn -EINVAL;\n-\tntuple_filter->priority = (uint16_t)temp;\n-\tif (ntuple_filter->priority > FLOW_CLASSIFY_MAX_PRIORITY)\n-\t\tret = -EINVAL;\n-\n-\treturn ret;\n-}\n-\n-/* Bypass comment and empty lines */\n-static inline int\n-is_bypass_line(char *buff)\n-{\n-\tint i = 0;\n-\n-\t/* comment line */\n-\tif (buff[0] == COMMENT_LEAD_CHAR)\n-\t\treturn 1;\n-\t/* empty line */\n-\twhile (buff[i] != '\\0') {\n-\t\tif (!isspace(buff[i]))\n-\t\t\treturn 0;\n-\t\ti++;\n-\t}\n-\treturn 1;\n-}\n-\n-static uint32_t\n-convert_depth_to_bitmask(uint32_t depth_val)\n-{\n-\tuint32_t bitmask = 0;\n-\tint i, j;\n-\n-\tfor (i = depth_val, j = 0; i > 0; i--, j++)\n-\t\tbitmask |= (1 << (31 - j));\n-\treturn bitmask;\n-}\n-\n-static int\n-add_classify_rule(struct rte_eth_ntuple_filter *ntuple_filter,\n-\t\tstruct flow_classifier *cls_app)\n-{\n-\tint ret = -1;\n-\tint key_found;\n-\tstruct rte_flow_error error;\n-\tstruct rte_flow_item_ipv4 ipv4_spec;\n-\tstruct rte_flow_item_ipv4 ipv4_mask;\n-\tstruct rte_flow_item ipv4_udp_item;\n-\tstruct rte_flow_item ipv4_tcp_item;\n-\tstruct rte_flow_item ipv4_sctp_item;\n-\tstruct rte_flow_item_udp udp_spec;\n-\tstruct rte_flow_item_udp udp_mask;\n-\tstruct rte_flow_item udp_item;\n-\tstruct rte_flow_item_tcp tcp_spec;\n-\tstruct rte_flow_item_tcp tcp_mask;\n-\tstruct rte_flow_item tcp_item;\n-\tstruct rte_flow_item_sctp sctp_spec;\n-\tstruct rte_flow_item_sctp sctp_mask;\n-\tstruct rte_flow_item sctp_item;\n-\tstruct rte_flow_item pattern_ipv4_5tuple[4];\n-\tstruct rte_flow_classify_rule *rule;\n-\tuint8_t ipv4_proto;\n-\n-\tif (num_classify_rules >= MAX_NUM_CLASSIFY) {\n-\t\tprintf(\n-\t\t\t\"\\nINFO:  classify rule capacity %d reached\\n\",\n-\t\t\tnum_classify_rules);\n-\t\treturn ret;\n-\t}\n-\n-\t/* set up parameters for validate and add */\n-\tmemset(&ipv4_spec, 0, sizeof(ipv4_spec));\n-\tipv4_spec.hdr.next_proto_id = ntuple_filter->proto;\n-\tipv4_spec.hdr.src_addr = ntuple_filter->src_ip;\n-\tipv4_spec.hdr.dst_addr = ntuple_filter->dst_ip;\n-\tipv4_proto = ipv4_spec.hdr.next_proto_id;\n-\n-\tmemset(&ipv4_mask, 0, sizeof(ipv4_mask));\n-\tipv4_mask.hdr.next_proto_id = ntuple_filter->proto_mask;\n-\tipv4_mask.hdr.src_addr = ntuple_filter->src_ip_mask;\n-\tipv4_mask.hdr.src_addr =\n-\t\tconvert_depth_to_bitmask(ipv4_mask.hdr.src_addr);\n-\tipv4_mask.hdr.dst_addr = ntuple_filter->dst_ip_mask;\n-\tipv4_mask.hdr.dst_addr =\n-\t\tconvert_depth_to_bitmask(ipv4_mask.hdr.dst_addr);\n-\n-\tswitch (ipv4_proto) {\n-\tcase IPPROTO_UDP:\n-\t\tipv4_udp_item.type = RTE_FLOW_ITEM_TYPE_IPV4;\n-\t\tipv4_udp_item.spec = &ipv4_spec;\n-\t\tipv4_udp_item.mask = &ipv4_mask;\n-\t\tipv4_udp_item.last = NULL;\n-\n-\t\tudp_spec.hdr.src_port = ntuple_filter->src_port;\n-\t\tudp_spec.hdr.dst_port = ntuple_filter->dst_port;\n-\t\tudp_spec.hdr.dgram_len = 0;\n-\t\tudp_spec.hdr.dgram_cksum = 0;\n-\n-\t\tudp_mask.hdr.src_port = ntuple_filter->src_port_mask;\n-\t\tudp_mask.hdr.dst_port = ntuple_filter->dst_port_mask;\n-\t\tudp_mask.hdr.dgram_len = 0;\n-\t\tudp_mask.hdr.dgram_cksum = 0;\n-\n-\t\tudp_item.type = RTE_FLOW_ITEM_TYPE_UDP;\n-\t\tudp_item.spec = &udp_spec;\n-\t\tudp_item.mask = &udp_mask;\n-\t\tudp_item.last = NULL;\n-\n-\t\tattr.priority = ntuple_filter->priority;\n-\t\tpattern_ipv4_5tuple[1] = ipv4_udp_item;\n-\t\tpattern_ipv4_5tuple[2] = udp_item;\n-\t\tbreak;\n-\tcase IPPROTO_TCP:\n-\t\tipv4_tcp_item.type = RTE_FLOW_ITEM_TYPE_IPV4;\n-\t\tipv4_tcp_item.spec = &ipv4_spec;\n-\t\tipv4_tcp_item.mask = &ipv4_mask;\n-\t\tipv4_tcp_item.last = NULL;\n-\n-\t\tmemset(&tcp_spec, 0, sizeof(tcp_spec));\n-\t\ttcp_spec.hdr.src_port = ntuple_filter->src_port;\n-\t\ttcp_spec.hdr.dst_port = ntuple_filter->dst_port;\n-\n-\t\tmemset(&tcp_mask, 0, sizeof(tcp_mask));\n-\t\ttcp_mask.hdr.src_port = ntuple_filter->src_port_mask;\n-\t\ttcp_mask.hdr.dst_port = ntuple_filter->dst_port_mask;\n-\n-\t\ttcp_item.type = RTE_FLOW_ITEM_TYPE_TCP;\n-\t\ttcp_item.spec = &tcp_spec;\n-\t\ttcp_item.mask = &tcp_mask;\n-\t\ttcp_item.last = NULL;\n-\n-\t\tattr.priority = ntuple_filter->priority;\n-\t\tpattern_ipv4_5tuple[1] = ipv4_tcp_item;\n-\t\tpattern_ipv4_5tuple[2] = tcp_item;\n-\t\tbreak;\n-\tcase IPPROTO_SCTP:\n-\t\tipv4_sctp_item.type = RTE_FLOW_ITEM_TYPE_IPV4;\n-\t\tipv4_sctp_item.spec = &ipv4_spec;\n-\t\tipv4_sctp_item.mask = &ipv4_mask;\n-\t\tipv4_sctp_item.last = NULL;\n-\n-\t\tsctp_spec.hdr.src_port = ntuple_filter->src_port;\n-\t\tsctp_spec.hdr.dst_port = ntuple_filter->dst_port;\n-\t\tsctp_spec.hdr.cksum = 0;\n-\t\tsctp_spec.hdr.tag = 0;\n-\n-\t\tsctp_mask.hdr.src_port = ntuple_filter->src_port_mask;\n-\t\tsctp_mask.hdr.dst_port = ntuple_filter->dst_port_mask;\n-\t\tsctp_mask.hdr.cksum = 0;\n-\t\tsctp_mask.hdr.tag = 0;\n-\n-\t\tsctp_item.type = RTE_FLOW_ITEM_TYPE_SCTP;\n-\t\tsctp_item.spec = &sctp_spec;\n-\t\tsctp_item.mask = &sctp_mask;\n-\t\tsctp_item.last = NULL;\n-\n-\t\tattr.priority = ntuple_filter->priority;\n-\t\tpattern_ipv4_5tuple[1] = ipv4_sctp_item;\n-\t\tpattern_ipv4_5tuple[2] = sctp_item;\n-\t\tbreak;\n-\tdefault:\n-\t\treturn ret;\n-\t}\n-\n-\tattr.ingress = 1;\n-\tpattern_ipv4_5tuple[0] = eth_item;\n-\tpattern_ipv4_5tuple[3] = end_item;\n-\tactions[0] = count_action;\n-\tactions[1] = end_action;\n-\n-\t/* Validate and add rule */\n-\tret = rte_flow_classify_validate(cls_app->cls, &attr,\n-\t\t\tpattern_ipv4_5tuple, actions, &error);\n-\tif (ret) {\n-\t\tprintf(\"table entry validate failed ipv4_proto = %u\\n\",\n-\t\t\tipv4_proto);\n-\t\treturn ret;\n-\t}\n-\n-\trule = rte_flow_classify_table_entry_add(\n-\t\t\tcls_app->cls, &attr, pattern_ipv4_5tuple,\n-\t\t\tactions, &key_found, &error);\n-\tif (rule == NULL) {\n-\t\tprintf(\"table entry add failed ipv4_proto = %u\\n\",\n-\t\t\tipv4_proto);\n-\t\tret = -1;\n-\t\treturn ret;\n-\t}\n-\n-\trules[num_classify_rules] = rule;\n-\tnum_classify_rules++;\n-\treturn 0;\n-}\n-\n-/* Reads file and calls the add_classify_rule function. 8< */\n-static int\n-add_rules(const char *rule_path, struct flow_classifier *cls_app)\n-{\n-\tFILE *fh;\n-\tchar buff[LINE_MAX];\n-\tunsigned int i = 0;\n-\tunsigned int total_num = 0;\n-\tstruct rte_eth_ntuple_filter ntuple_filter;\n-\tint ret;\n-\n-\tfh = fopen(rule_path, \"rb\");\n-\tif (fh == NULL)\n-\t\trte_exit(EXIT_FAILURE, \"%s: fopen %s failed\\n\", __func__,\n-\t\t\trule_path);\n-\n-\tret = fseek(fh, 0, SEEK_SET);\n-\tif (ret)\n-\t\trte_exit(EXIT_FAILURE, \"%s: fseek %d failed\\n\", __func__,\n-\t\t\tret);\n-\n-\ti = 0;\n-\twhile (fgets(buff, LINE_MAX, fh) != NULL) {\n-\t\ti++;\n-\n-\t\tif (is_bypass_line(buff))\n-\t\t\tcontinue;\n-\n-\t\tif (total_num >= FLOW_CLASSIFY_MAX_RULE_NUM - 1) {\n-\t\t\tprintf(\"\\nINFO: classify rule capacity %d reached\\n\",\n-\t\t\t\ttotal_num);\n-\t\t\tbreak;\n-\t\t}\n-\n-\t\tif (parse_ipv4_5tuple_rule(buff, &ntuple_filter) != 0)\n-\t\t\trte_exit(EXIT_FAILURE,\n-\t\t\t\t\"%s Line %u: parse rules error\\n\",\n-\t\t\t\trule_path, i);\n-\n-\t\tif (add_classify_rule(&ntuple_filter, cls_app) != 0)\n-\t\t\trte_exit(EXIT_FAILURE, \"add rule error\\n\");\n-\n-\t\ttotal_num++;\n-\t}\n-\n-\tfclose(fh);\n-\treturn 0;\n-}\n-/* >8 End of add_rules. */\n-\n-/* display usage */\n-static void\n-print_usage(const char *prgname)\n-{\n-\tprintf(\"%s usage:\\n\", prgname);\n-\tprintf(\"[EAL options] --  --\"OPTION_RULE_IPV4\"=FILE: \");\n-\tprintf(\"specify the ipv4 rules file.\\n\");\n-\tprintf(\"Each rule occupies one line in the file.\\n\");\n-}\n-\n-/* Parse the argument given in the command line of the application */\n-static int\n-parse_args(int argc, char **argv)\n-{\n-\tint opt, ret;\n-\tchar **argvopt;\n-\tint option_index;\n-\tchar *prgname = argv[0];\n-\tstatic struct option lgopts[] = {\n-\t\t{OPTION_RULE_IPV4, 1, 0, 0},\n-\t\t{NULL, 0, 0, 0}\n-\t};\n-\n-\targvopt = argv;\n-\n-\twhile ((opt = getopt_long(argc, argvopt, \"\",\n-\t\t\t\tlgopts, &option_index)) != EOF) {\n-\n-\t\tswitch (opt) {\n-\t\t/* long options */\n-\t\tcase 0:\n-\t\t\tif (!strncmp(lgopts[option_index].name,\n-\t\t\t\t\tOPTION_RULE_IPV4,\n-\t\t\t\t\tsizeof(OPTION_RULE_IPV4)))\n-\t\t\t\tparm_config.rule_ipv4_name = optarg;\n-\t\t\tbreak;\n-\t\tdefault:\n-\t\t\tprint_usage(prgname);\n-\t\t\treturn -1;\n-\t\t}\n-\t}\n-\n-\tif (optind >= 0)\n-\t\targv[optind-1] = prgname;\n-\n-\tret = optind-1;\n-\toptind = 1; /* reset getopt lib */\n-\treturn ret;\n-}\n-\n-/*\n- * The main function, which does initialization and calls the lcore_main\n- * function.\n- */\n-int\n-main(int argc, char *argv[])\n-{\n-\tstruct rte_mempool *mbuf_pool;\n-\tuint16_t nb_ports;\n-\tuint16_t portid;\n-\tint ret;\n-\tint socket_id;\n-\tstruct rte_table_acl_params table_acl_params;\n-\tstruct rte_flow_classify_table_params cls_table_params;\n-\tstruct flow_classifier *cls_app;\n-\tstruct rte_flow_classifier_params cls_params;\n-\tuint32_t size;\n-\n-\t/* Initialize the Environment Abstraction Layer (EAL). 8< */\n-\tret = rte_eal_init(argc, argv);\n-\tif (ret < 0)\n-\t\trte_exit(EXIT_FAILURE, \"Error with EAL initialization\\n\");\n-\t/* >8 End of initialization of EAL. */\n-\n-\targc -= ret;\n-\targv += ret;\n-\n-\t/* Parse application arguments (after the EAL ones). 8< */\n-\tret = parse_args(argc, argv);\n-\tif (ret < 0)\n-\t\trte_exit(EXIT_FAILURE, \"Invalid flow_classify parameters\\n\");\n-\t/* >8 End of parse application arguments. */\n-\n-\t/* Check that there is an even number of ports to send/receive on. */\n-\tnb_ports = rte_eth_dev_count_avail();\n-\tif (nb_ports < 2 || (nb_ports & 1))\n-\t\trte_exit(EXIT_FAILURE, \"Error: number of ports must be even\\n\");\n-\n-\t/* Creates a new mempool in memory to hold the mbufs. 8< */\n-\tmbuf_pool = rte_pktmbuf_pool_create(\"MBUF_POOL\", NUM_MBUFS * nb_ports,\n-\t\tMBUF_CACHE_SIZE, 0, RTE_MBUF_DEFAULT_BUF_SIZE, rte_socket_id());\n-\t/* >8 End of creation of new mempool in memory. */\n-\n-\tif (mbuf_pool == NULL)\n-\t\trte_exit(EXIT_FAILURE, \"Cannot create mbuf pool\\n\");\n-\n-\t/* Initialize all ports. 8< */\n-\tRTE_ETH_FOREACH_DEV(portid)\n-\t\tif (port_init(portid, mbuf_pool) != 0)\n-\t\t\trte_exit(EXIT_FAILURE, \"Cannot init port %\"PRIu8 \"\\n\",\n-\t\t\t\t\tportid);\n-\t/* >8 End of initialization of all ports. */\n-\n-\tif (rte_lcore_count() > 1)\n-\t\tprintf(\"\\nWARNING: Too many lcores enabled. Only 1 used.\\n\");\n-\n-\tsocket_id = rte_eth_dev_socket_id(0);\n-\tif (socket_id == SOCKET_ID_ANY)\n-\t\tsocket_id = rte_lcore_to_socket_id(rte_get_next_lcore(-1, 0, 0));\n-\n-\t/* Memory allocation. 8< */\n-\tsize = RTE_CACHE_LINE_ROUNDUP(sizeof(struct flow_classifier_acl));\n-\tcls_app = rte_zmalloc(NULL, size, RTE_CACHE_LINE_SIZE);\n-\tif (cls_app == NULL)\n-\t\trte_exit(EXIT_FAILURE, \"Cannot allocate classifier memory\\n\");\n-\n-\tcls_params.name = \"flow_classifier\";\n-\tcls_params.socket_id = socket_id;\n-\n-\tcls_app->cls = rte_flow_classifier_create(&cls_params);\n-\tif (cls_app->cls == NULL) {\n-\t\trte_free(cls_app);\n-\t\trte_exit(EXIT_FAILURE, \"Cannot create classifier\\n\");\n-\t}\n-\n-\t/* initialise ACL table params */\n-\ttable_acl_params.name = \"table_acl_ipv4_5tuple\";\n-\ttable_acl_params.n_rules = FLOW_CLASSIFY_MAX_RULE_NUM;\n-\ttable_acl_params.n_rule_fields = RTE_DIM(ipv4_defs);\n-\tmemcpy(table_acl_params.field_format, ipv4_defs, sizeof(ipv4_defs));\n-\n-\t/* initialise table create params */\n-\tcls_table_params.ops = &rte_table_acl_ops;\n-\tcls_table_params.arg_create = &table_acl_params;\n-\tcls_table_params.type = RTE_FLOW_CLASSIFY_TABLE_ACL_IP4_5TUPLE;\n-\n-\tret = rte_flow_classify_table_create(cls_app->cls, &cls_table_params);\n-\tif (ret) {\n-\t\trte_flow_classifier_free(cls_app->cls);\n-\t\trte_free(cls_app);\n-\t\trte_exit(EXIT_FAILURE, \"Failed to create classifier table\\n\");\n-\t}\n-\t/* >8 End of initialization of table create params. */\n-\n-\t/* read file of IPv4 5 tuple rules and initialize parameters\n-\t * for rte_flow_classify_validate and rte_flow_classify_table_entry_add\n-\t * API's.\n-\t */\n-\n-\t/* Read file of IPv4 tuple rules. 8< */\n-\tif (add_rules(parm_config.rule_ipv4_name, cls_app)) {\n-\t\trte_flow_classifier_free(cls_app->cls);\n-\t\trte_free(cls_app);\n-\t\trte_exit(EXIT_FAILURE, \"Failed to add rules\\n\");\n-\t}\n-\t/* >8 End of reading file of IPv4 5 tuple rules. */\n-\n-\t/* Call lcore_main on the main core only. */\n-\tlcore_main(cls_app);\n-\n-\t/* clean up the EAL */\n-\trte_eal_cleanup();\n-\n-\treturn 0;\n-}\ndiff --git a/examples/flow_classify/ipv4_rules_file.txt b/examples/flow_classify/ipv4_rules_file.txt\ndeleted file mode 100644\nindex cd5215736aaf..000000000000\n--- a/examples/flow_classify/ipv4_rules_file.txt\n+++ /dev/null\n@@ -1,14 +0,0 @@\n-#file format:\n-#src_ip/masklen dst_ip/masklen src_port : mask dst_port : mask proto/mask priority\n-#\n-2.2.2.3/24 2.2.2.7/24 32 : 0xffff 33 : 0xffff 17/0xff 0\n-9.9.9.3/24 9.9.9.7/24 32 : 0xffff 33 : 0xffff 17/0xff 1\n-9.9.9.3/24 9.9.9.7/24 32 : 0xffff 33 : 0xffff 6/0xff 2\n-9.9.8.3/24 9.9.8.7/24 32 : 0xffff 33 : 0xffff 6/0xff 3\n-6.7.8.9/24 2.3.4.5/24 32 : 0x0000 33 : 0x0000 132/0xff 4\n-6.7.8.9/32 192.168.0.36/32 10 : 0xffff 11 : 0xffff 6/0xfe 5\n-6.7.8.9/24 192.168.0.36/24 10 : 0xffff 11 : 0xffff 6/0xfe 6\n-6.7.8.9/16 192.168.0.36/16 10 : 0xffff 11 : 0xffff 6/0xfe 7\n-6.7.8.9/8 192.168.0.36/8 10 : 0xffff 11 : 0xffff 6/0xfe 8\n-#error rules\n-#9.8.7.6/8 192.168.0.36/8 10 : 0xffff 11 : 0xffff 6/0xfe 9\ndiff --git a/examples/flow_classify/meson.build b/examples/flow_classify/meson.build\ndeleted file mode 100644\nindex 1be1bf037427..000000000000\n--- a/examples/flow_classify/meson.build\n+++ /dev/null\n@@ -1,13 +0,0 @@\n-# SPDX-License-Identifier: BSD-3-Clause\n-# Copyright(c) 2017 Intel Corporation\n-\n-# meson file, for building this example as part of a main DPDK build.\n-#\n-# To build this example as a standalone application with an already-installed\n-# DPDK instance, use 'make'\n-\n-deps += 'flow_classify'\n-allow_experimental_apis = true\n-sources = files(\n-        'flow_classify.c',\n-)\ndiff --git a/examples/meson.build b/examples/meson.build\nindex 55ba8847a053..65c8303a9d23 100644\n--- a/examples/meson.build\n+++ b/examples/meson.build\n@@ -16,7 +16,6 @@ all_examples = [\n         'ethtool',\n         'eventdev_pipeline',\n         'fips_validation',\n-        'flow_classify',\n         'flow_filtering',\n         'helloworld',\n         'ip_fragmentation',\ndiff --git a/lib/flow_classify/meson.build b/lib/flow_classify/meson.build\ndeleted file mode 100644\nindex 3bb861c68fb5..000000000000\n--- a/lib/flow_classify/meson.build\n+++ /dev/null\n@@ -1,12 +0,0 @@\n-# SPDX-License-Identifier: BSD-3-Clause\n-# Copyright(c) 2017 Intel Corporation\n-\n-if is_windows\n-    build = false\n-    reason = 'not supported on Windows'\n-    subdir_done()\n-endif\n-\n-sources = files('rte_flow_classify.c', 'rte_flow_classify_parse.c')\n-headers = files('rte_flow_classify.h')\n-deps += ['net', 'table']\ndiff --git a/lib/flow_classify/rte_flow_classify.c b/lib/flow_classify/rte_flow_classify.c\ndeleted file mode 100644\nindex 60ca319f24e4..000000000000\n--- a/lib/flow_classify/rte_flow_classify.c\n+++ /dev/null\n@@ -1,670 +0,0 @@\n-/* SPDX-License-Identifier: BSD-3-Clause\n- * Copyright(c) 2017 Intel Corporation\n- */\n-\n-#include <rte_string_fns.h>\n-#include <rte_flow_classify.h>\n-#include \"rte_flow_classify_parse.h\"\n-#include <rte_table_acl.h>\n-\n-static uint32_t unique_id = 1;\n-\n-enum rte_flow_classify_table_type table_type\n-\t= RTE_FLOW_CLASSIFY_TABLE_TYPE_NONE;\n-\n-struct rte_flow_classify_table_entry {\n-\t/* meta-data for classify rule */\n-\tuint32_t rule_id;\n-\n-\t/* Flow action */\n-\tstruct classify_action action;\n-};\n-\n-struct rte_cls_table {\n-\t/* Input parameters */\n-\tstruct rte_table_ops ops;\n-\tuint32_t entry_size;\n-\tenum rte_flow_classify_table_type type;\n-\n-\t/* Handle to the low-level table object */\n-\tvoid *h_table;\n-};\n-\n-#define RTE_FLOW_CLASSIFIER_MAX_NAME_SZ 256\n-\n-struct rte_flow_classifier {\n-\t/* Input parameters */\n-\tchar name[RTE_FLOW_CLASSIFIER_MAX_NAME_SZ];\n-\tint socket_id;\n-\n-\t/* Internal */\n-\t/* ntuple_filter */\n-\tstruct rte_eth_ntuple_filter ntuple_filter;\n-\n-\t/* classifier tables */\n-\tstruct rte_cls_table tables[RTE_FLOW_CLASSIFY_TABLE_MAX];\n-\tuint32_t table_mask;\n-\tuint32_t num_tables;\n-\n-\tuint16_t nb_pkts;\n-\tstruct rte_flow_classify_table_entry\n-\t\t*entries[RTE_PORT_IN_BURST_SIZE_MAX];\n-} __rte_cache_aligned;\n-\n-enum {\n-\tPROTO_FIELD_IPV4,\n-\tSRC_FIELD_IPV4,\n-\tDST_FIELD_IPV4,\n-\tSRCP_FIELD_IPV4,\n-\tDSTP_FIELD_IPV4,\n-\tNUM_FIELDS_IPV4\n-};\n-\n-struct acl_keys {\n-\tstruct rte_table_acl_rule_add_params key_add; /* add key */\n-\tstruct rte_table_acl_rule_delete_params\tkey_del; /* delete key */\n-};\n-\n-struct classify_rules {\n-\tenum rte_flow_classify_rule_type type;\n-\tunion {\n-\t\tstruct rte_flow_classify_ipv4_5tuple ipv4_5tuple;\n-\t} u;\n-};\n-\n-struct rte_flow_classify_rule {\n-\tuint32_t id; /* unique ID of classify rule */\n-\tenum rte_flow_classify_table_type tbl_type; /* rule table */\n-\tstruct classify_rules rules; /* union of rules */\n-\tunion {\n-\t\tstruct acl_keys key;\n-\t} u;\n-\tint key_found;   /* rule key found in table */\n-\tstruct rte_flow_classify_table_entry entry;  /* rule meta data */\n-\tvoid *entry_ptr; /* handle to the table entry for rule meta data */\n-};\n-\n-int\n-rte_flow_classify_validate(\n-\t\t   struct rte_flow_classifier *cls,\n-\t\t   const struct rte_flow_attr *attr,\n-\t\t   const struct rte_flow_item pattern[],\n-\t\t   const struct rte_flow_action actions[],\n-\t\t   struct rte_flow_error *error)\n-{\n-\tstruct rte_flow_item *items;\n-\tparse_filter_t parse_filter;\n-\tuint32_t item_num = 0;\n-\tuint32_t i = 0;\n-\tint ret;\n-\n-\tif (error == NULL)\n-\t\treturn -EINVAL;\n-\n-\tif (cls == NULL) {\n-\t\tRTE_FLOW_CLASSIFY_LOG(ERR,\n-\t\t\t\"%s: rte_flow_classifier parameter is NULL\\n\",\n-\t\t\t__func__);\n-\t\treturn -EINVAL;\n-\t}\n-\n-\tif (!attr) {\n-\t\trte_flow_error_set(error, EINVAL,\n-\t\t\t\t   RTE_FLOW_ERROR_TYPE_ATTR,\n-\t\t\t\t   NULL, \"NULL attribute.\");\n-\t\treturn -EINVAL;\n-\t}\n-\n-\tif (!pattern) {\n-\t\trte_flow_error_set(error,\n-\t\t\tEINVAL, RTE_FLOW_ERROR_TYPE_ITEM_NUM,\n-\t\t\tNULL, \"NULL pattern.\");\n-\t\treturn -EINVAL;\n-\t}\n-\n-\tif (!actions) {\n-\t\trte_flow_error_set(error, EINVAL,\n-\t\t\t\t   RTE_FLOW_ERROR_TYPE_ACTION_NUM,\n-\t\t\t\t   NULL, \"NULL action.\");\n-\t\treturn -EINVAL;\n-\t}\n-\n-\tmemset(&cls->ntuple_filter, 0, sizeof(cls->ntuple_filter));\n-\n-\t/* Get the non-void item number of pattern */\n-\twhile ((pattern + i)->type != RTE_FLOW_ITEM_TYPE_END) {\n-\t\tif ((pattern + i)->type != RTE_FLOW_ITEM_TYPE_VOID)\n-\t\t\titem_num++;\n-\t\ti++;\n-\t}\n-\titem_num++;\n-\n-\titems = malloc(item_num * sizeof(struct rte_flow_item));\n-\tif (!items) {\n-\t\trte_flow_error_set(error, ENOMEM,\n-\t\t\t\tRTE_FLOW_ERROR_TYPE_ITEM_NUM,\n-\t\t\t\tNULL, \"No memory for pattern items.\");\n-\t\treturn -ENOMEM;\n-\t}\n-\n-\tmemset(items, 0, item_num * sizeof(struct rte_flow_item));\n-\tclassify_pattern_skip_void_item(items, pattern);\n-\n-\tparse_filter = classify_find_parse_filter_func(items);\n-\tif (!parse_filter) {\n-\t\trte_flow_error_set(error, EINVAL,\n-\t\t\t\tRTE_FLOW_ERROR_TYPE_ITEM,\n-\t\t\t\tpattern, \"Unsupported pattern\");\n-\t\tfree(items);\n-\t\treturn -EINVAL;\n-\t}\n-\n-\tret = parse_filter(attr, items, actions, &cls->ntuple_filter, error);\n-\tfree(items);\n-\treturn ret;\n-}\n-\n-\n-#define uint32_t_to_char(ip, a, b, c, d) do {\\\n-\t\t*a = (unsigned char)(ip >> 24 & 0xff);\\\n-\t\t*b = (unsigned char)(ip >> 16 & 0xff);\\\n-\t\t*c = (unsigned char)(ip >> 8 & 0xff);\\\n-\t\t*d = (unsigned char)(ip & 0xff);\\\n-\t} while (0)\n-\n-static inline void\n-print_acl_ipv4_key_add(struct rte_table_acl_rule_add_params *key)\n-{\n-\tunsigned char a, b, c, d;\n-\n-\tprintf(\"%s:    0x%02hhx/0x%hhx \", __func__,\n-\t\tkey->field_value[PROTO_FIELD_IPV4].value.u8,\n-\t\tkey->field_value[PROTO_FIELD_IPV4].mask_range.u8);\n-\n-\tuint32_t_to_char(key->field_value[SRC_FIELD_IPV4].value.u32,\n-\t\t\t&a, &b, &c, &d);\n-\tprintf(\" %hhu.%hhu.%hhu.%hhu/0x%x \", a, b, c, d,\n-\t\t\tkey->field_value[SRC_FIELD_IPV4].mask_range.u32);\n-\n-\tuint32_t_to_char(key->field_value[DST_FIELD_IPV4].value.u32,\n-\t\t\t&a, &b, &c, &d);\n-\tprintf(\"%hhu.%hhu.%hhu.%hhu/0x%x \", a, b, c, d,\n-\t\t\tkey->field_value[DST_FIELD_IPV4].mask_range.u32);\n-\n-\tprintf(\"%hu : 0x%x %hu : 0x%x\",\n-\t\tkey->field_value[SRCP_FIELD_IPV4].value.u16,\n-\t\tkey->field_value[SRCP_FIELD_IPV4].mask_range.u16,\n-\t\tkey->field_value[DSTP_FIELD_IPV4].value.u16,\n-\t\tkey->field_value[DSTP_FIELD_IPV4].mask_range.u16);\n-\n-\tprintf(\" priority: 0x%x\\n\", key->priority);\n-}\n-\n-static inline void\n-print_acl_ipv4_key_delete(struct rte_table_acl_rule_delete_params *key)\n-{\n-\tunsigned char a, b, c, d;\n-\n-\tprintf(\"%s: 0x%02hhx/0x%hhx \", __func__,\n-\t\tkey->field_value[PROTO_FIELD_IPV4].value.u8,\n-\t\tkey->field_value[PROTO_FIELD_IPV4].mask_range.u8);\n-\n-\tuint32_t_to_char(key->field_value[SRC_FIELD_IPV4].value.u32,\n-\t\t\t&a, &b, &c, &d);\n-\tprintf(\" %hhu.%hhu.%hhu.%hhu/0x%x \", a, b, c, d,\n-\t\t\tkey->field_value[SRC_FIELD_IPV4].mask_range.u32);\n-\n-\tuint32_t_to_char(key->field_value[DST_FIELD_IPV4].value.u32,\n-\t\t\t&a, &b, &c, &d);\n-\tprintf(\"%hhu.%hhu.%hhu.%hhu/0x%x \", a, b, c, d,\n-\t\t\tkey->field_value[DST_FIELD_IPV4].mask_range.u32);\n-\n-\tprintf(\"%hu : 0x%x %hu : 0x%x\\n\",\n-\t\tkey->field_value[SRCP_FIELD_IPV4].value.u16,\n-\t\tkey->field_value[SRCP_FIELD_IPV4].mask_range.u16,\n-\t\tkey->field_value[DSTP_FIELD_IPV4].value.u16,\n-\t\tkey->field_value[DSTP_FIELD_IPV4].mask_range.u16);\n-}\n-\n-static int\n-rte_flow_classifier_check_params(struct rte_flow_classifier_params *params)\n-{\n-\tif (params == NULL) {\n-\t\tRTE_FLOW_CLASSIFY_LOG(ERR,\n-\t\t\t\"%s: Incorrect value for parameter params\\n\", __func__);\n-\t\treturn -EINVAL;\n-\t}\n-\n-\t/* name */\n-\tif (params->name == NULL) {\n-\t\tRTE_FLOW_CLASSIFY_LOG(ERR,\n-\t\t\t\"%s: Incorrect value for parameter name\\n\", __func__);\n-\t\treturn -EINVAL;\n-\t}\n-\n-\t/* socket */\n-\tif (params->socket_id < 0) {\n-\t\tRTE_FLOW_CLASSIFY_LOG(ERR,\n-\t\t\t\"%s: Incorrect value for parameter socket_id\\n\",\n-\t\t\t__func__);\n-\t\treturn -EINVAL;\n-\t}\n-\n-\treturn 0;\n-}\n-\n-struct rte_flow_classifier *\n-rte_flow_classifier_create(struct rte_flow_classifier_params *params)\n-{\n-\tstruct rte_flow_classifier *cls;\n-\tint ret;\n-\n-\tRTE_FLOW_CLASSIFY_LOG(WARNING,\n-\t\t\"WARNING: flow_classify is deprecated and will be removed in DPDK 23.11\\n\");\n-\n-\t/* Check input parameters */\n-\tret = rte_flow_classifier_check_params(params);\n-\tif (ret != 0) {\n-\t\tRTE_FLOW_CLASSIFY_LOG(ERR,\n-\t\t\t\"%s: flow classifier params check failed (%d)\\n\",\n-\t\t\t__func__, ret);\n-\t\treturn NULL;\n-\t}\n-\n-\t/* Allocate memory for the flow classifier */\n-\tcls = rte_zmalloc_socket(\"FLOW_CLASSIFIER\",\n-\t\t\tsizeof(struct rte_flow_classifier),\n-\t\t\tRTE_CACHE_LINE_SIZE, params->socket_id);\n-\n-\tif (cls == NULL) {\n-\t\tRTE_FLOW_CLASSIFY_LOG(ERR,\n-\t\t\t\"%s: flow classifier memory allocation failed\\n\",\n-\t\t\t__func__);\n-\t\treturn NULL;\n-\t}\n-\n-\t/* Save input parameters */\n-\tstrlcpy(cls->name, params->name, RTE_FLOW_CLASSIFIER_MAX_NAME_SZ);\n-\n-\tcls->socket_id = params->socket_id;\n-\n-\treturn cls;\n-}\n-\n-static void\n-rte_flow_classify_table_free(struct rte_cls_table *table)\n-{\n-\tif (table->ops.f_free != NULL)\n-\t\ttable->ops.f_free(table->h_table);\n-}\n-\n-int\n-rte_flow_classifier_free(struct rte_flow_classifier *cls)\n-{\n-\tuint32_t i;\n-\n-\t/* Check input parameters */\n-\tif (cls == NULL) {\n-\t\tRTE_FLOW_CLASSIFY_LOG(ERR,\n-\t\t\t\"%s: rte_flow_classifier parameter is NULL\\n\",\n-\t\t\t__func__);\n-\t\treturn -EINVAL;\n-\t}\n-\n-\t/* Free tables */\n-\tfor (i = 0; i < cls->num_tables; i++) {\n-\t\tstruct rte_cls_table *table = &cls->tables[i];\n-\n-\t\trte_flow_classify_table_free(table);\n-\t}\n-\n-\t/* Free flow classifier memory */\n-\trte_free(cls);\n-\n-\treturn 0;\n-}\n-\n-static int\n-rte_table_check_params(struct rte_flow_classifier *cls,\n-\t\tstruct rte_flow_classify_table_params *params)\n-{\n-\tif (cls == NULL) {\n-\t\tRTE_FLOW_CLASSIFY_LOG(ERR,\n-\t\t\t\"%s: flow classifier parameter is NULL\\n\",\n-\t\t\t__func__);\n-\t\treturn -EINVAL;\n-\t}\n-\tif (params == NULL) {\n-\t\tRTE_FLOW_CLASSIFY_LOG(ERR, \"%s: params parameter is NULL\\n\",\n-\t\t\t__func__);\n-\t\treturn -EINVAL;\n-\t}\n-\n-\t/* ops */\n-\tif (params->ops == NULL) {\n-\t\tRTE_FLOW_CLASSIFY_LOG(ERR, \"%s: params->ops is NULL\\n\",\n-\t\t\t__func__);\n-\t\treturn -EINVAL;\n-\t}\n-\n-\tif (params->ops->f_create == NULL) {\n-\t\tRTE_FLOW_CLASSIFY_LOG(ERR,\n-\t\t\t\"%s: f_create function pointer is NULL\\n\", __func__);\n-\t\treturn -EINVAL;\n-\t}\n-\n-\tif (params->ops->f_lookup == NULL) {\n-\t\tRTE_FLOW_CLASSIFY_LOG(ERR,\n-\t\t\t\"%s: f_lookup function pointer is NULL\\n\", __func__);\n-\t\treturn -EINVAL;\n-\t}\n-\n-\t/* De we have room for one more table? */\n-\tif (cls->num_tables == RTE_FLOW_CLASSIFY_TABLE_MAX) {\n-\t\tRTE_FLOW_CLASSIFY_LOG(ERR,\n-\t\t\t\"%s: Incorrect value for num_tables parameter\\n\",\n-\t\t\t__func__);\n-\t\treturn -EINVAL;\n-\t}\n-\n-\treturn 0;\n-}\n-\n-int\n-rte_flow_classify_table_create(struct rte_flow_classifier *cls,\n-\tstruct rte_flow_classify_table_params *params)\n-{\n-\tstruct rte_cls_table *table;\n-\tvoid *h_table;\n-\tuint32_t entry_size;\n-\tint ret;\n-\n-\t/* Check input arguments */\n-\tret = rte_table_check_params(cls, params);\n-\tif (ret != 0)\n-\t\treturn ret;\n-\n-\t/* calculate table entry size */\n-\tentry_size = sizeof(struct rte_flow_classify_table_entry);\n-\n-\t/* Create the table */\n-\th_table = params->ops->f_create(params->arg_create, cls->socket_id,\n-\t\tentry_size);\n-\tif (h_table == NULL) {\n-\t\tRTE_FLOW_CLASSIFY_LOG(ERR, \"%s: Table creation failed\\n\",\n-\t\t\t__func__);\n-\t\treturn -EINVAL;\n-\t}\n-\n-\t/* Commit current table to the classifier */\n-\ttable = &cls->tables[cls->num_tables];\n-\ttable->type = params->type;\n-\tcls->num_tables++;\n-\n-\t/* Save input parameters */\n-\tmemcpy(&table->ops, params->ops, sizeof(struct rte_table_ops));\n-\n-\t/* Initialize table internal data structure */\n-\ttable->entry_size = entry_size;\n-\ttable->h_table = h_table;\n-\n-\treturn 0;\n-}\n-\n-static struct rte_flow_classify_rule *\n-allocate_acl_ipv4_5tuple_rule(struct rte_flow_classifier *cls)\n-{\n-\tstruct rte_flow_classify_rule *rule;\n-\n-\trule = malloc(sizeof(struct rte_flow_classify_rule));\n-\tif (!rule)\n-\t\treturn rule;\n-\n-\tmemset(rule, 0, sizeof(struct rte_flow_classify_rule));\n-\trule->id = unique_id++;\n-\trule->rules.type = RTE_FLOW_CLASSIFY_RULE_TYPE_IPV4_5TUPLE;\n-\n-\t/* key add values */\n-\trule->u.key.key_add.priority = cls->ntuple_filter.priority;\n-\trule->u.key.key_add.field_value[PROTO_FIELD_IPV4].mask_range.u8 =\n-\t\t\tcls->ntuple_filter.proto_mask;\n-\trule->u.key.key_add.field_value[PROTO_FIELD_IPV4].value.u8 =\n-\t\t\tcls->ntuple_filter.proto;\n-\trule->rules.u.ipv4_5tuple.proto = cls->ntuple_filter.proto;\n-\trule->rules.u.ipv4_5tuple.proto_mask = cls->ntuple_filter.proto_mask;\n-\n-\trule->u.key.key_add.field_value[SRC_FIELD_IPV4].mask_range.u32 =\n-\t\t\tcls->ntuple_filter.src_ip_mask;\n-\trule->u.key.key_add.field_value[SRC_FIELD_IPV4].value.u32 =\n-\t\t\tcls->ntuple_filter.src_ip;\n-\trule->rules.u.ipv4_5tuple.src_ip_mask = cls->ntuple_filter.src_ip_mask;\n-\trule->rules.u.ipv4_5tuple.src_ip = cls->ntuple_filter.src_ip;\n-\n-\trule->u.key.key_add.field_value[DST_FIELD_IPV4].mask_range.u32 =\n-\t\t\tcls->ntuple_filter.dst_ip_mask;\n-\trule->u.key.key_add.field_value[DST_FIELD_IPV4].value.u32 =\n-\t\t\tcls->ntuple_filter.dst_ip;\n-\trule->rules.u.ipv4_5tuple.dst_ip_mask = cls->ntuple_filter.dst_ip_mask;\n-\trule->rules.u.ipv4_5tuple.dst_ip = cls->ntuple_filter.dst_ip;\n-\n-\trule->u.key.key_add.field_value[SRCP_FIELD_IPV4].mask_range.u16 =\n-\t\t\tcls->ntuple_filter.src_port_mask;\n-\trule->u.key.key_add.field_value[SRCP_FIELD_IPV4].value.u16 =\n-\t\t\tcls->ntuple_filter.src_port;\n-\trule->rules.u.ipv4_5tuple.src_port_mask =\n-\t\t\tcls->ntuple_filter.src_port_mask;\n-\trule->rules.u.ipv4_5tuple.src_port = cls->ntuple_filter.src_port;\n-\n-\trule->u.key.key_add.field_value[DSTP_FIELD_IPV4].mask_range.u16 =\n-\t\t\tcls->ntuple_filter.dst_port_mask;\n-\trule->u.key.key_add.field_value[DSTP_FIELD_IPV4].value.u16 =\n-\t\t\tcls->ntuple_filter.dst_port;\n-\trule->rules.u.ipv4_5tuple.dst_port_mask =\n-\t\t\tcls->ntuple_filter.dst_port_mask;\n-\trule->rules.u.ipv4_5tuple.dst_port = cls->ntuple_filter.dst_port;\n-\n-\tif (rte_log_can_log(librte_flow_classify_logtype, RTE_LOG_DEBUG))\n-\t\tprint_acl_ipv4_key_add(&rule->u.key.key_add);\n-\n-\t/* key delete values */\n-\tmemcpy(&rule->u.key.key_del.field_value[PROTO_FIELD_IPV4],\n-\t       &rule->u.key.key_add.field_value[PROTO_FIELD_IPV4],\n-\t       NUM_FIELDS_IPV4 * sizeof(struct rte_acl_field));\n-\n-\tif (rte_log_can_log(librte_flow_classify_logtype, RTE_LOG_DEBUG))\n-\t\tprint_acl_ipv4_key_delete(&rule->u.key.key_del);\n-\n-\treturn rule;\n-}\n-\n-struct rte_flow_classify_rule *\n-rte_flow_classify_table_entry_add(struct rte_flow_classifier *cls,\n-\t\tconst struct rte_flow_attr *attr,\n-\t\tconst struct rte_flow_item pattern[],\n-\t\tconst struct rte_flow_action actions[],\n-\t\tint *key_found,\n-\t\tstruct rte_flow_error *error)\n-{\n-\tstruct rte_flow_classify_rule *rule;\n-\tstruct rte_flow_classify_table_entry *table_entry;\n-\tstruct classify_action *action;\n-\tuint32_t i;\n-\tint ret;\n-\n-\tif (!error)\n-\t\treturn NULL;\n-\n-\tif (key_found == NULL) {\n-\t\trte_flow_error_set(error, EINVAL,\n-\t\t\t\tRTE_FLOW_ERROR_TYPE_UNSPECIFIED,\n-\t\t\t\tNULL, \"NULL key_found.\");\n-\t\treturn NULL;\n-\t}\n-\n-\t/* parse attr, pattern and actions */\n-\tret = rte_flow_classify_validate(cls, attr, pattern, actions, error);\n-\tif (ret < 0)\n-\t\treturn NULL;\n-\n-\tswitch (table_type) {\n-\tcase RTE_FLOW_CLASSIFY_TABLE_ACL_IP4_5TUPLE:\n-\t\trule = allocate_acl_ipv4_5tuple_rule(cls);\n-\t\tif (!rule)\n-\t\t\treturn NULL;\n-\t\trule->tbl_type = table_type;\n-\t\tcls->table_mask |= table_type;\n-\t\tbreak;\n-\tdefault:\n-\t\treturn NULL;\n-\t}\n-\n-\taction = classify_get_flow_action();\n-\ttable_entry = &rule->entry;\n-\ttable_entry->rule_id = rule->id;\n-\ttable_entry->action.action_mask = action->action_mask;\n-\n-\t/* Copy actions */\n-\tif (action->action_mask & (1LLU << RTE_FLOW_ACTION_TYPE_COUNT)) {\n-\t\tmemcpy(&table_entry->action.act.counter, &action->act.counter,\n-\t\t\t\tsizeof(table_entry->action.act.counter));\n-\t}\n-\tif (action->action_mask & (1LLU << RTE_FLOW_ACTION_TYPE_MARK)) {\n-\t\tmemcpy(&table_entry->action.act.mark, &action->act.mark,\n-\t\t\t\tsizeof(table_entry->action.act.mark));\n-\t}\n-\n-\tfor (i = 0; i < cls->num_tables; i++) {\n-\t\tstruct rte_cls_table *table = &cls->tables[i];\n-\n-\t\tif (table->type == table_type) {\n-\t\t\tif (table->ops.f_add != NULL) {\n-\t\t\t\tret = table->ops.f_add(\n-\t\t\t\t\ttable->h_table,\n-\t\t\t\t\t&rule->u.key.key_add,\n-\t\t\t\t\t&rule->entry,\n-\t\t\t\t\t&rule->key_found,\n-\t\t\t\t\t&rule->entry_ptr);\n-\t\t\t\tif (ret) {\n-\t\t\t\t\tfree(rule);\n-\t\t\t\t\treturn NULL;\n-\t\t\t\t}\n-\n-\t\t\t*key_found = rule->key_found;\n-\t\t\t}\n-\n-\t\t\treturn rule;\n-\t\t}\n-\t}\n-\tfree(rule);\n-\treturn NULL;\n-}\n-\n-int\n-rte_flow_classify_table_entry_delete(struct rte_flow_classifier *cls,\n-\t\tstruct rte_flow_classify_rule *rule)\n-{\n-\tuint32_t i;\n-\tint ret = -EINVAL;\n-\n-\tif (!cls || !rule)\n-\t\treturn ret;\n-\tenum rte_flow_classify_table_type tbl_type = rule->tbl_type;\n-\n-\tfor (i = 0; i < cls->num_tables; i++) {\n-\t\tstruct rte_cls_table *table = &cls->tables[i];\n-\n-\t\tif (table->type == tbl_type) {\n-\t\t\tif (table->ops.f_delete != NULL) {\n-\t\t\t\tret = table->ops.f_delete(table->h_table,\n-\t\t\t\t\t\t&rule->u.key.key_del,\n-\t\t\t\t\t\t&rule->key_found,\n-\t\t\t\t\t\t&rule->entry);\n-\t\t\t\tif (ret == 0)\n-\t\t\t\t\tfree(rule);\n-\t\t\t\treturn ret;\n-\t\t\t}\n-\t\t}\n-\t}\n-\treturn ret;\n-}\n-\n-static int\n-flow_classifier_lookup(struct rte_flow_classifier *cls,\n-\t\tstruct rte_cls_table *table,\n-\t\tstruct rte_mbuf **pkts,\n-\t\tconst uint16_t nb_pkts)\n-{\n-\tint ret = -EINVAL;\n-\tuint64_t pkts_mask;\n-\tuint64_t lookup_hit_mask;\n-\n-\tpkts_mask = RTE_LEN2MASK(nb_pkts, uint64_t);\n-\tret = table->ops.f_lookup(table->h_table,\n-\t\tpkts, pkts_mask, &lookup_hit_mask,\n-\t\t(void **)cls->entries);\n-\n-\tif (!ret && lookup_hit_mask)\n-\t\tcls->nb_pkts = nb_pkts;\n-\telse\n-\t\tcls->nb_pkts = 0;\n-\n-\treturn ret;\n-}\n-\n-static int\n-action_apply(struct rte_flow_classifier *cls,\n-\t\tstruct rte_flow_classify_rule *rule,\n-\t\tstruct rte_flow_classify_stats *stats)\n-{\n-\tstruct rte_flow_classify_ipv4_5tuple_stats *ntuple_stats;\n-\tstruct rte_flow_classify_table_entry *entry = &rule->entry;\n-\tuint64_t count = 0;\n-\tuint32_t action_mask = entry->action.action_mask;\n-\tint i, ret = -EINVAL;\n-\n-\tif (action_mask & (1LLU << RTE_FLOW_ACTION_TYPE_COUNT)) {\n-\t\tfor (i = 0; i < cls->nb_pkts; i++) {\n-\t\t\tif (rule->id == cls->entries[i]->rule_id)\n-\t\t\t\tcount++;\n-\t\t}\n-\t\tif (count) {\n-\t\t\tret = 0;\n-\t\t\tntuple_stats = stats->stats;\n-\t\t\tntuple_stats->counter1 = count;\n-\t\t\tntuple_stats->ipv4_5tuple = rule->rules.u.ipv4_5tuple;\n-\t\t}\n-\t}\n-\treturn ret;\n-}\n-\n-int\n-rte_flow_classifier_query(struct rte_flow_classifier *cls,\n-\t\tstruct rte_mbuf **pkts,\n-\t\tconst uint16_t nb_pkts,\n-\t\tstruct rte_flow_classify_rule *rule,\n-\t\tstruct rte_flow_classify_stats *stats)\n-{\n-\tenum rte_flow_classify_table_type tbl_type;\n-\tuint32_t i;\n-\tint ret = -EINVAL;\n-\n-\tif (!cls || !rule || !stats || !pkts  || nb_pkts == 0)\n-\t\treturn ret;\n-\n-\ttbl_type = rule->tbl_type;\n-\tfor (i = 0; i < cls->num_tables; i++) {\n-\t\tstruct rte_cls_table *table = &cls->tables[i];\n-\n-\t\t\tif (table->type == tbl_type) {\n-\t\t\t\tret = flow_classifier_lookup(cls, table,\n-\t\t\t\t\t\tpkts, nb_pkts);\n-\t\t\t\tif (!ret) {\n-\t\t\t\t\tret = action_apply(cls, rule, stats);\n-\t\t\t\t\treturn ret;\n-\t\t\t\t}\n-\t\t\t}\n-\t}\n-\treturn ret;\n-}\n-\n-RTE_LOG_REGISTER_DEFAULT(librte_flow_classify_logtype, INFO);\ndiff --git a/lib/flow_classify/rte_flow_classify.h b/lib/flow_classify/rte_flow_classify.h\ndeleted file mode 100644\nindex 39512b620667..000000000000\n--- a/lib/flow_classify/rte_flow_classify.h\n+++ /dev/null\n@@ -1,284 +0,0 @@\n-/* SPDX-License-Identifier: BSD-3-Clause\n- * Copyright(c) 2017 Intel Corporation\n- */\n-\n-#ifndef _RTE_FLOW_CLASSIFY_H_\n-#define _RTE_FLOW_CLASSIFY_H_\n-\n-/**\n- * @file\n- *\n- * RTE Flow Classify Library.\n- *\n- * @warning\n- * @b EXPERIMENTAL:\n- * All functions in this file may be changed or removed without prior notice.\n- *\n- * This library provides flow record information with some measured properties.\n- *\n- * Application should define the flow and measurement criteria (action) for it.\n- *\n- * The Library doesn't maintain any flow records itself, instead flow\n- * information is returned to upper layer only for given packets.\n- *\n- * It is application's responsibility to call rte_flow_classifier_query()\n- * for a burst of packets, just after receiving them or before transmitting\n- * them.\n- * Application should provide the flow type interested in, measurement to apply\n- * to that flow in rte_flow_classify_table_entry_add() API, and should provide\n- * the rte_flow_classifier object and storage to put results in for the\n- * rte_flow_classifier_query() API.\n- *\n- *  Usage:\n- *  - application calls rte_flow_classifier_create() to create an\n- *    rte_flow_classifier object.\n- *  - application calls rte_flow_classify_table_create() to create a table\n- *    in the rte_flow_classifier object.\n- *  - application calls rte_flow_classify_table_entry_add() to add a rule to\n- *    the table in the rte_flow_classifier object.\n- *  - application calls rte_flow_classifier_query() in a polling manner,\n- *    preferably after rte_eth_rx_burst(). This will cause the library to\n- *    match packet information to flow information with some measurements.\n- *  - rte_flow_classifier object can be destroyed when it is no longer needed\n- *    with rte_flow_classifier_free()\n- */\n-\n-#include <rte_compat.h>\n-#include <rte_common.h>\n-#include <rte_flow.h>\n-\n-#ifdef __cplusplus\n-extern \"C\" {\n-#endif\n-\n-extern int librte_flow_classify_logtype;\n-\n-#define RTE_FLOW_CLASSIFY_LOG(level, ...) \\\n-\trte_log(RTE_LOG_ ## level, \\\n-\t\tlibrte_flow_classify_logtype, \\\n-\t\tRTE_FMT(\"%s(): \" RTE_FMT_HEAD(__VA_ARGS__,), \\\n-\t\t\t__func__, \\\n-\t\t\tRTE_FMT_TAIL(__VA_ARGS__,)))\n-\n-#ifndef RTE_FLOW_CLASSIFY_TABLE_MAX\n-#define RTE_FLOW_CLASSIFY_TABLE_MAX\t\t32\n-#endif\n-\n-/** Opaque data type for flow classifier */\n-struct rte_flow_classifier;\n-\n-/** Opaque data type for flow classify rule */\n-struct rte_flow_classify_rule;\n-\n-/** Flow classify rule type */\n-enum rte_flow_classify_rule_type {\n-\t/** no type */\n-\tRTE_FLOW_CLASSIFY_RULE_TYPE_NONE,\n-\t/** IPv4 5tuple type */\n-\tRTE_FLOW_CLASSIFY_RULE_TYPE_IPV4_5TUPLE,\n-};\n-\n-/** Flow classify table type */\n-enum rte_flow_classify_table_type {\n-\t/** No type */\n-\tRTE_FLOW_CLASSIFY_TABLE_TYPE_NONE = 1 << 0,\n-\t/** ACL IP4 5TUPLE */\n-\tRTE_FLOW_CLASSIFY_TABLE_ACL_IP4_5TUPLE = 1 << 1,\n-\t/** ACL VLAN IP4 5TUPLE */\n-\tRTE_FLOW_CLASSIFY_TABLE_ACL_VLAN_IP4_5TUPLE = 1 << 2,\n-\t/** ACL QinQ IP4 5TUPLE */\n-\tRTE_FLOW_CLASSIFY_TABLE_ACL_QINQ_IP4_5TUPLE = 1 << 3,\n-\n-};\n-\n-/** Parameters for flow classifier creation */\n-struct rte_flow_classifier_params {\n-\t/** flow classifier name */\n-\tconst char *name;\n-\n-\t/** CPU socket ID where memory for the flow classifier and its */\n-\t/** elements (tables) should be allocated */\n-\tint socket_id;\n-};\n-\n-/** Parameters for table creation */\n-struct rte_flow_classify_table_params {\n-\t/** Table operations (specific to each table type) */\n-\tstruct rte_table_ops *ops;\n-\n-\t/** Opaque param to be passed to the table create operation */\n-\tvoid *arg_create;\n-\n-\t/** Classifier table type */\n-\tenum rte_flow_classify_table_type type;\n-};\n-\n-/** IPv4 5-tuple data */\n-struct rte_flow_classify_ipv4_5tuple {\n-\tuint32_t dst_ip;         /**< Destination IP address in big endian. */\n-\tuint32_t dst_ip_mask;    /**< Mask of destination IP address. */\n-\tuint32_t src_ip;         /**< Source IP address in big endian. */\n-\tuint32_t src_ip_mask;    /**< Mask of destination IP address. */\n-\tuint16_t dst_port;       /**< Destination port in big endian. */\n-\tuint16_t dst_port_mask;  /**< Mask of destination port. */\n-\tuint16_t src_port;       /**< Source Port in big endian. */\n-\tuint16_t src_port_mask;  /**< Mask of source port. */\n-\tuint8_t proto;           /**< L4 protocol. */\n-\tuint8_t proto_mask;      /**< Mask of L4 protocol. */\n-};\n-\n-/**\n- * Flow stats\n- *\n- * For the count action, stats can be returned by the query API.\n- *\n- * Storage for stats is provided by application.\n- */\n-struct rte_flow_classify_stats {\n-\tvoid *stats;\n-};\n-\n-struct rte_flow_classify_ipv4_5tuple_stats {\n-\t/** count of packets that match IPv4 5tuple pattern */\n-\tuint64_t counter1;\n-\t/** IPv4 5tuple data */\n-\tstruct rte_flow_classify_ipv4_5tuple ipv4_5tuple;\n-};\n-\n-/**\n- * Flow classifier create\n- *\n- * @param params\n- *   Parameters for flow classifier creation\n- * @return\n- *   Handle to flow classifier instance on success or NULL otherwise\n- */\n-__rte_experimental\n-struct rte_flow_classifier *\n-rte_flow_classifier_create(struct rte_flow_classifier_params *params);\n-\n-/**\n- * Flow classifier free\n- *\n- * @param cls\n- *   Handle to flow classifier instance\n- * @return\n- *   0 on success, error code otherwise\n- */\n-__rte_experimental\n-int\n-rte_flow_classifier_free(struct rte_flow_classifier *cls);\n-\n-/**\n- * Flow classify table create\n- *\n- * @param cls\n- *   Handle to flow classifier instance\n- * @param params\n- *   Parameters for flow_classify table creation\n- * @return\n- *   0 on success, error code otherwise\n- */\n-__rte_experimental\n-int\n-rte_flow_classify_table_create(struct rte_flow_classifier *cls,\n-\t\tstruct rte_flow_classify_table_params *params);\n-\n-/**\n- * Flow classify validate\n- *\n- * @param cls\n- *   Handle to flow classifier instance\n- * @param[in] attr\n- *   Flow rule attributes\n- * @param[in] pattern\n- *   Pattern specification (list terminated by the END pattern item).\n- * @param[in] actions\n- *   Associated actions (list terminated by the END pattern item).\n- * @param[out] error\n- *   Perform verbose error reporting if not NULL. Structure\n- *   initialised in case of error only.\n- * @return\n- *   0 on success, error code otherwise\n- */\n-__rte_experimental\n-int\n-rte_flow_classify_validate(struct rte_flow_classifier *cls,\n-\t\tconst struct rte_flow_attr *attr,\n-\t\tconst struct rte_flow_item pattern[],\n-\t\tconst struct rte_flow_action actions[],\n-\t\tstruct rte_flow_error *error);\n-\n-/**\n- * Add a flow classify rule to the flow_classifier table.\n- *\n- * @param[in] cls\n- *   Flow classifier handle\n- * @param[in] attr\n- *   Flow rule attributes\n- * @param[in] pattern\n- *   Pattern specification (list terminated by the END pattern item).\n- * @param[in] actions\n- *   Associated actions (list terminated by the END pattern item).\n- * @param[out] key_found\n- *  returns 1 if rule present already, 0 otherwise.\n- * @param[out] error\n- *   Perform verbose error reporting if not NULL. Structure\n- *   initialised in case of error only.\n- * @return\n- *   A valid handle in case of success, NULL otherwise.\n- */\n-__rte_experimental\n-struct rte_flow_classify_rule *\n-rte_flow_classify_table_entry_add(struct rte_flow_classifier *cls,\n-\t\tconst struct rte_flow_attr *attr,\n-\t\tconst struct rte_flow_item pattern[],\n-\t\tconst struct rte_flow_action actions[],\n-\t\tint *key_found,\n-\t\tstruct rte_flow_error *error);\n-\n-/**\n- * Delete a flow classify rule from the flow_classifier table.\n- *\n- * @param[in] cls\n- *   Flow classifier handle\n- * @param[in] rule\n- *   Flow classify rule\n- * @return\n- *   0 on success, error code otherwise.\n- */\n-__rte_experimental\n-int\n-rte_flow_classify_table_entry_delete(struct rte_flow_classifier *cls,\n-\t\tstruct rte_flow_classify_rule *rule);\n-\n-/**\n- * Query flow classifier for given rule.\n- *\n- * @param[in] cls\n- *   Flow classifier handle\n- * @param[in] pkts\n- *   Pointer to packets to process\n- * @param[in] nb_pkts\n- *   Number of packets to process\n- * @param[in] rule\n- *   Flow classify rule\n- * @param[in] stats\n- *   Flow classify stats\n- *\n- * @return\n- *   0 on success, error code otherwise.\n- */\n-__rte_experimental\n-int\n-rte_flow_classifier_query(struct rte_flow_classifier *cls,\n-\t\tstruct rte_mbuf **pkts,\n-\t\tconst uint16_t nb_pkts,\n-\t\tstruct rte_flow_classify_rule *rule,\n-\t\tstruct rte_flow_classify_stats *stats);\n-\n-#ifdef __cplusplus\n-}\n-#endif\n-\n-#endif /* _RTE_FLOW_CLASSIFY_H_ */\ndiff --git a/lib/flow_classify/rte_flow_classify_parse.c b/lib/flow_classify/rte_flow_classify_parse.c\ndeleted file mode 100644\nindex 345d129d35e0..000000000000\n--- a/lib/flow_classify/rte_flow_classify_parse.c\n+++ /dev/null\n@@ -1,532 +0,0 @@\n-/* SPDX-License-Identifier: BSD-3-Clause\n- * Copyright(c) 2017 Intel Corporation\n- */\n-\n-#include <rte_flow_classify.h>\n-#include \"rte_flow_classify_parse.h\"\n-\n-struct classify_valid_pattern {\n-\tenum rte_flow_item_type *items;\n-\tparse_filter_t parse_filter;\n-};\n-\n-static struct classify_action action;\n-\n-/* Pattern for IPv4 5-tuple UDP filter */\n-static enum rte_flow_item_type pattern_ntuple_1[] = {\n-\tRTE_FLOW_ITEM_TYPE_ETH,\n-\tRTE_FLOW_ITEM_TYPE_IPV4,\n-\tRTE_FLOW_ITEM_TYPE_UDP,\n-\tRTE_FLOW_ITEM_TYPE_END,\n-};\n-\n-/* Pattern for IPv4 5-tuple TCP filter */\n-static enum rte_flow_item_type pattern_ntuple_2[] = {\n-\tRTE_FLOW_ITEM_TYPE_ETH,\n-\tRTE_FLOW_ITEM_TYPE_IPV4,\n-\tRTE_FLOW_ITEM_TYPE_TCP,\n-\tRTE_FLOW_ITEM_TYPE_END,\n-};\n-\n-/* Pattern for IPv4 5-tuple SCTP filter */\n-static enum rte_flow_item_type pattern_ntuple_3[] = {\n-\tRTE_FLOW_ITEM_TYPE_ETH,\n-\tRTE_FLOW_ITEM_TYPE_IPV4,\n-\tRTE_FLOW_ITEM_TYPE_SCTP,\n-\tRTE_FLOW_ITEM_TYPE_END,\n-};\n-\n-static int\n-classify_parse_ntuple_filter(const struct rte_flow_attr *attr,\n-\t\t\t const struct rte_flow_item pattern[],\n-\t\t\t const struct rte_flow_action actions[],\n-\t\t\t struct rte_eth_ntuple_filter *filter,\n-\t\t\t struct rte_flow_error *error);\n-\n-static struct classify_valid_pattern classify_supported_patterns[] = {\n-\t/* ntuple */\n-\t{ pattern_ntuple_1, classify_parse_ntuple_filter },\n-\t{ pattern_ntuple_2, classify_parse_ntuple_filter },\n-\t{ pattern_ntuple_3, classify_parse_ntuple_filter },\n-};\n-\n-struct classify_action *\n-classify_get_flow_action(void)\n-{\n-\treturn &action;\n-}\n-\n-/* Find the first VOID or non-VOID item pointer */\n-const struct rte_flow_item *\n-classify_find_first_item(const struct rte_flow_item *item, bool is_void)\n-{\n-\tbool is_find;\n-\n-\twhile (item->type != RTE_FLOW_ITEM_TYPE_END) {\n-\t\tif (is_void)\n-\t\t\tis_find = item->type == RTE_FLOW_ITEM_TYPE_VOID;\n-\t\telse\n-\t\t\tis_find = item->type != RTE_FLOW_ITEM_TYPE_VOID;\n-\t\tif (is_find)\n-\t\t\tbreak;\n-\t\titem++;\n-\t}\n-\treturn item;\n-}\n-\n-/* Skip all VOID items of the pattern */\n-void\n-classify_pattern_skip_void_item(struct rte_flow_item *items,\n-\t\t\t    const struct rte_flow_item *pattern)\n-{\n-\tuint32_t cpy_count = 0;\n-\tconst struct rte_flow_item *pb = pattern, *pe = pattern;\n-\n-\tfor (;;) {\n-\t\t/* Find a non-void item first */\n-\t\tpb = classify_find_first_item(pb, false);\n-\t\tif (pb->type == RTE_FLOW_ITEM_TYPE_END) {\n-\t\t\tpe = pb;\n-\t\t\tbreak;\n-\t\t}\n-\n-\t\t/* Find a void item */\n-\t\tpe = classify_find_first_item(pb + 1, true);\n-\n-\t\tcpy_count = pe - pb;\n-\t\trte_memcpy(items, pb, sizeof(struct rte_flow_item) * cpy_count);\n-\n-\t\titems += cpy_count;\n-\n-\t\tif (pe->type == RTE_FLOW_ITEM_TYPE_END) {\n-\t\t\tpb = pe;\n-\t\t\tbreak;\n-\t\t}\n-\t}\n-\t/* Copy the END item. */\n-\trte_memcpy(items, pe, sizeof(struct rte_flow_item));\n-}\n-\n-/* Check if the pattern matches a supported item type array */\n-static bool\n-classify_match_pattern(enum rte_flow_item_type *item_array,\n-\t\t   struct rte_flow_item *pattern)\n-{\n-\tstruct rte_flow_item *item = pattern;\n-\n-\twhile ((*item_array == item->type) &&\n-\t       (*item_array != RTE_FLOW_ITEM_TYPE_END)) {\n-\t\titem_array++;\n-\t\titem++;\n-\t}\n-\n-\treturn (*item_array == RTE_FLOW_ITEM_TYPE_END &&\n-\t\titem->type == RTE_FLOW_ITEM_TYPE_END);\n-}\n-\n-/* Find if there's parse filter function matched */\n-parse_filter_t\n-classify_find_parse_filter_func(struct rte_flow_item *pattern)\n-{\n-\tparse_filter_t parse_filter = NULL;\n-\tuint8_t i = 0;\n-\n-\tfor (; i < RTE_DIM(classify_supported_patterns); i++) {\n-\t\tif (classify_match_pattern(classify_supported_patterns[i].items,\n-\t\t\t\t\tpattern)) {\n-\t\t\tparse_filter =\n-\t\t\t\tclassify_supported_patterns[i].parse_filter;\n-\t\t\tbreak;\n-\t\t}\n-\t}\n-\n-\treturn parse_filter;\n-}\n-\n-#define FLOW_RULE_MIN_PRIORITY 8\n-#define FLOW_RULE_MAX_PRIORITY 0\n-\n-#define NEXT_ITEM_OF_PATTERN(item, pattern, index)\\\n-\tdo {\\\n-\t\titem = pattern + index;\\\n-\t\twhile (item->type == RTE_FLOW_ITEM_TYPE_VOID) {\\\n-\t\t\tindex++;\\\n-\t\t\titem = pattern + index;\\\n-\t\t} \\\n-\t} while (0)\n-\n-#define NEXT_ITEM_OF_ACTION(act, actions, index)\\\n-\tdo {\\\n-\t\tact = actions + index;\\\n-\t\twhile (act->type == RTE_FLOW_ACTION_TYPE_VOID) {\\\n-\t\t\tindex++;\\\n-\t\t\tact = actions + index;\\\n-\t\t} \\\n-\t} while (0)\n-\n-/**\n- * Please aware there's an assumption for all the parsers.\n- * rte_flow_item is using big endian, rte_flow_attr and\n- * rte_flow_action are using CPU order.\n- * Because the pattern is used to describe the packets,\n- * normally the packets should use network order.\n- */\n-\n-/**\n- * Parse the rule to see if it is a n-tuple rule.\n- * And get the n-tuple filter info BTW.\n- * pattern:\n- * The first not void item can be ETH or IPV4.\n- * The second not void item must be IPV4 if the first one is ETH.\n- * The third not void item must be UDP or TCP.\n- * The next not void item must be END.\n- * action:\n- * The first not void action should be QUEUE.\n- * The next not void action should be END.\n- * pattern example:\n- * ITEM\t\tSpec\t\t\tMask\n- * ETH\t\tNULL\t\t\tNULL\n- * IPV4\t\tsrc_addr 192.168.1.20\t0xFFFFFFFF\n- *\t\t\tdst_addr 192.167.3.50\t0xFFFFFFFF\n- *\t\t\tnext_proto_id\t17\t0xFF\n- * UDP/TCP/\tsrc_port\t80\t0xFFFF\n- * SCTP\t\tdst_port\t80\t0xFFFF\n- * END\n- * other members in mask and spec should set to 0x00.\n- * item->last should be NULL.\n- */\n-static int\n-classify_parse_ntuple_filter(const struct rte_flow_attr *attr,\n-\t\t\t const struct rte_flow_item pattern[],\n-\t\t\t const struct rte_flow_action actions[],\n-\t\t\t struct rte_eth_ntuple_filter *filter,\n-\t\t\t struct rte_flow_error *error)\n-{\n-\tconst struct rte_flow_item *item;\n-\tconst struct rte_flow_action *act;\n-\tconst struct rte_flow_item_ipv4 *ipv4_spec;\n-\tconst struct rte_flow_item_ipv4 *ipv4_mask;\n-\tconst struct rte_flow_item_tcp *tcp_spec;\n-\tconst struct rte_flow_item_tcp *tcp_mask;\n-\tconst struct rte_flow_item_udp *udp_spec;\n-\tconst struct rte_flow_item_udp *udp_mask;\n-\tconst struct rte_flow_item_sctp *sctp_spec;\n-\tconst struct rte_flow_item_sctp *sctp_mask;\n-\tconst struct rte_flow_action_count *count;\n-\tconst struct rte_flow_action_mark *mark_spec;\n-\tuint32_t index;\n-\n-\t/* parse pattern */\n-\tindex = 0;\n-\n-\t/* the first not void item can be MAC or IPv4 */\n-\tNEXT_ITEM_OF_PATTERN(item, pattern, index);\n-\n-\tif (item->type != RTE_FLOW_ITEM_TYPE_ETH &&\n-\t    item->type != RTE_FLOW_ITEM_TYPE_IPV4) {\n-\t\trte_flow_error_set(error, EINVAL,\n-\t\t\tRTE_FLOW_ERROR_TYPE_ITEM,\n-\t\t\titem, \"Not supported by ntuple filter\");\n-\t\treturn -EINVAL;\n-\t}\n-\t/* Skip Ethernet */\n-\tif (item->type == RTE_FLOW_ITEM_TYPE_ETH) {\n-\t\t/*Not supported last point for range*/\n-\t\tif (item->last) {\n-\t\t\trte_flow_error_set(error, EINVAL,\n-\t\t\t\t\tRTE_FLOW_ERROR_TYPE_UNSPECIFIED,\n-\t\t\t\t\titem,\n-\t\t\t\t\t\"Not supported last point for range\");\n-\t\t\treturn -EINVAL;\n-\n-\t\t}\n-\t\t/* if the first item is MAC, the content should be NULL */\n-\t\tif (item->spec || item->mask) {\n-\t\t\trte_flow_error_set(error, EINVAL,\n-\t\t\t\t\tRTE_FLOW_ERROR_TYPE_ITEM,\n-\t\t\t\t\titem,\n-\t\t\t\t\t\"Not supported by ntuple filter\");\n-\t\t\treturn -EINVAL;\n-\t\t}\n-\t\t/* check if the next not void item is IPv4 */\n-\t\tindex++;\n-\t\tNEXT_ITEM_OF_PATTERN(item, pattern, index);\n-\t\tif (item->type != RTE_FLOW_ITEM_TYPE_IPV4) {\n-\t\t\trte_flow_error_set(error, EINVAL,\n-\t\t\t\t\tRTE_FLOW_ERROR_TYPE_ITEM,\n-\t\t\t\t\titem,\n-\t\t\t\t\t\"Not supported by ntuple filter\");\n-\t\t\treturn -EINVAL;\n-\t\t}\n-\t}\n-\n-\t/* get the IPv4 info */\n-\tif (!item->spec || !item->mask) {\n-\t\trte_flow_error_set(error, EINVAL,\n-\t\t\tRTE_FLOW_ERROR_TYPE_ITEM,\n-\t\t\titem, \"Invalid ntuple mask\");\n-\t\treturn -EINVAL;\n-\t}\n-\t/*Not supported last point for range*/\n-\tif (item->last) {\n-\t\trte_flow_error_set(error, EINVAL,\n-\t\t\tRTE_FLOW_ERROR_TYPE_UNSPECIFIED,\n-\t\t\titem, \"Not supported last point for range\");\n-\t\treturn -EINVAL;\n-\n-\t}\n-\n-\tipv4_mask = item->mask;\n-\t/**\n-\t * Only support src & dst addresses, protocol,\n-\t * others should be masked.\n-\t */\n-\tif (ipv4_mask->hdr.version_ihl ||\n-\t\tipv4_mask->hdr.type_of_service ||\n-\t\tipv4_mask->hdr.total_length ||\n-\t\tipv4_mask->hdr.packet_id ||\n-\t\tipv4_mask->hdr.fragment_offset ||\n-\t\tipv4_mask->hdr.time_to_live ||\n-\t\tipv4_mask->hdr.hdr_checksum) {\n-\t\trte_flow_error_set(error,\n-\t\t\tEINVAL, RTE_FLOW_ERROR_TYPE_ITEM,\n-\t\t\titem, \"Not supported by ntuple filter\");\n-\t\treturn -EINVAL;\n-\t}\n-\n-\tfilter->dst_ip_mask = ipv4_mask->hdr.dst_addr;\n-\tfilter->src_ip_mask = ipv4_mask->hdr.src_addr;\n-\tfilter->proto_mask  = ipv4_mask->hdr.next_proto_id;\n-\n-\tipv4_spec = item->spec;\n-\tfilter->dst_ip = ipv4_spec->hdr.dst_addr;\n-\tfilter->src_ip = ipv4_spec->hdr.src_addr;\n-\tfilter->proto  = ipv4_spec->hdr.next_proto_id;\n-\n-\t/* check if the next not void item is TCP or UDP or SCTP */\n-\tindex++;\n-\tNEXT_ITEM_OF_PATTERN(item, pattern, index);\n-\tif (item->type != RTE_FLOW_ITEM_TYPE_TCP &&\n-\t    item->type != RTE_FLOW_ITEM_TYPE_UDP &&\n-\t    item->type != RTE_FLOW_ITEM_TYPE_SCTP) {\n-\t\tmemset(filter, 0, sizeof(struct rte_eth_ntuple_filter));\n-\t\trte_flow_error_set(error, EINVAL,\n-\t\t\tRTE_FLOW_ERROR_TYPE_ITEM,\n-\t\t\titem, \"Not supported by ntuple filter\");\n-\t\treturn -EINVAL;\n-\t}\n-\n-\t/* get the TCP/UDP info */\n-\tif (!item->spec || !item->mask) {\n-\t\tmemset(filter, 0, sizeof(struct rte_eth_ntuple_filter));\n-\t\trte_flow_error_set(error, EINVAL,\n-\t\t\tRTE_FLOW_ERROR_TYPE_ITEM,\n-\t\t\titem, \"Invalid ntuple mask\");\n-\t\treturn -EINVAL;\n-\t}\n-\n-\t/*Not supported last point for range*/\n-\tif (item->last) {\n-\t\tmemset(filter, 0, sizeof(struct rte_eth_ntuple_filter));\n-\t\trte_flow_error_set(error, EINVAL,\n-\t\t\tRTE_FLOW_ERROR_TYPE_UNSPECIFIED,\n-\t\t\titem, \"Not supported last point for range\");\n-\t\treturn -EINVAL;\n-\n-\t}\n-\n-\tif (item->type == RTE_FLOW_ITEM_TYPE_TCP) {\n-\t\ttcp_mask = item->mask;\n-\n-\t\t/**\n-\t\t * Only support src & dst ports, tcp flags,\n-\t\t * others should be masked.\n-\t\t */\n-\t\tif (tcp_mask->hdr.sent_seq ||\n-\t\t    tcp_mask->hdr.recv_ack ||\n-\t\t    tcp_mask->hdr.data_off ||\n-\t\t    tcp_mask->hdr.rx_win ||\n-\t\t    tcp_mask->hdr.cksum ||\n-\t\t    tcp_mask->hdr.tcp_urp) {\n-\t\t\tmemset(filter, 0,\n-\t\t\t\tsizeof(struct rte_eth_ntuple_filter));\n-\t\t\trte_flow_error_set(error, EINVAL,\n-\t\t\t\tRTE_FLOW_ERROR_TYPE_ITEM,\n-\t\t\t\titem, \"Not supported by ntuple filter\");\n-\t\t\treturn -EINVAL;\n-\t\t}\n-\n-\t\tfilter->dst_port_mask  = tcp_mask->hdr.dst_port;\n-\t\tfilter->src_port_mask  = tcp_mask->hdr.src_port;\n-\t\tif (tcp_mask->hdr.tcp_flags == 0xFF) {\n-\t\t\tfilter->flags |= RTE_NTUPLE_FLAGS_TCP_FLAG;\n-\t\t} else if (!tcp_mask->hdr.tcp_flags) {\n-\t\t\tfilter->flags &= ~RTE_NTUPLE_FLAGS_TCP_FLAG;\n-\t\t} else {\n-\t\t\tmemset(filter, 0, sizeof(struct rte_eth_ntuple_filter));\n-\t\t\trte_flow_error_set(error, EINVAL,\n-\t\t\t\tRTE_FLOW_ERROR_TYPE_ITEM,\n-\t\t\t\titem, \"Not supported by ntuple filter\");\n-\t\t\treturn -EINVAL;\n-\t\t}\n-\n-\t\ttcp_spec = item->spec;\n-\t\tfilter->dst_port  = tcp_spec->hdr.dst_port;\n-\t\tfilter->src_port  = tcp_spec->hdr.src_port;\n-\t\tfilter->tcp_flags = tcp_spec->hdr.tcp_flags;\n-\t} else if (item->type == RTE_FLOW_ITEM_TYPE_UDP) {\n-\t\tudp_mask = item->mask;\n-\n-\t\t/**\n-\t\t * Only support src & dst ports,\n-\t\t * others should be masked.\n-\t\t */\n-\t\tif (udp_mask->hdr.dgram_len ||\n-\t\t    udp_mask->hdr.dgram_cksum) {\n-\t\t\tmemset(filter, 0,\n-\t\t\t\tsizeof(struct rte_eth_ntuple_filter));\n-\t\t\trte_flow_error_set(error, EINVAL,\n-\t\t\t\tRTE_FLOW_ERROR_TYPE_ITEM,\n-\t\t\t\titem, \"Not supported by ntuple filter\");\n-\t\t\treturn -EINVAL;\n-\t\t}\n-\n-\t\tfilter->dst_port_mask = udp_mask->hdr.dst_port;\n-\t\tfilter->src_port_mask = udp_mask->hdr.src_port;\n-\n-\t\tudp_spec = item->spec;\n-\t\tfilter->dst_port = udp_spec->hdr.dst_port;\n-\t\tfilter->src_port = udp_spec->hdr.src_port;\n-\t} else {\n-\t\tsctp_mask = item->mask;\n-\n-\t\t/**\n-\t\t * Only support src & dst ports,\n-\t\t * others should be masked.\n-\t\t */\n-\t\tif (sctp_mask->hdr.tag ||\n-\t\t    sctp_mask->hdr.cksum) {\n-\t\t\tmemset(filter, 0,\n-\t\t\t\tsizeof(struct rte_eth_ntuple_filter));\n-\t\t\trte_flow_error_set(error, EINVAL,\n-\t\t\t\tRTE_FLOW_ERROR_TYPE_ITEM,\n-\t\t\t\titem, \"Not supported by ntuple filter\");\n-\t\t\treturn -EINVAL;\n-\t\t}\n-\n-\t\tfilter->dst_port_mask = sctp_mask->hdr.dst_port;\n-\t\tfilter->src_port_mask = sctp_mask->hdr.src_port;\n-\n-\t\tsctp_spec = item->spec;\n-\t\tfilter->dst_port = sctp_spec->hdr.dst_port;\n-\t\tfilter->src_port = sctp_spec->hdr.src_port;\n-\t}\n-\n-\t/* check if the next not void item is END */\n-\tindex++;\n-\tNEXT_ITEM_OF_PATTERN(item, pattern, index);\n-\tif (item->type != RTE_FLOW_ITEM_TYPE_END) {\n-\t\tmemset(filter, 0, sizeof(struct rte_eth_ntuple_filter));\n-\t\trte_flow_error_set(error, EINVAL,\n-\t\t\tRTE_FLOW_ERROR_TYPE_ITEM,\n-\t\t\titem, \"Not supported by ntuple filter\");\n-\t\treturn -EINVAL;\n-\t}\n-\n-\ttable_type = RTE_FLOW_CLASSIFY_TABLE_ACL_IP4_5TUPLE;\n-\n-\t/* parse attr */\n-\t/* must be input direction */\n-\tif (!attr->ingress) {\n-\t\tmemset(filter, 0, sizeof(struct rte_eth_ntuple_filter));\n-\t\trte_flow_error_set(error, EINVAL,\n-\t\t\t\t   RTE_FLOW_ERROR_TYPE_ATTR_INGRESS,\n-\t\t\t\t   attr, \"Only support ingress.\");\n-\t\treturn -EINVAL;\n-\t}\n-\n-\t/* not supported */\n-\tif (attr->egress) {\n-\t\tmemset(filter, 0, sizeof(struct rte_eth_ntuple_filter));\n-\t\trte_flow_error_set(error, EINVAL,\n-\t\t\t\t   RTE_FLOW_ERROR_TYPE_ATTR_EGRESS,\n-\t\t\t\t   attr, \"Not support egress.\");\n-\t\treturn -EINVAL;\n-\t}\n-\n-\tif (attr->priority > 0xFFFF) {\n-\t\tmemset(filter, 0, sizeof(struct rte_eth_ntuple_filter));\n-\t\trte_flow_error_set(error, EINVAL,\n-\t\t\t\t   RTE_FLOW_ERROR_TYPE_ATTR_PRIORITY,\n-\t\t\t\t   attr, \"Error priority.\");\n-\t\treturn -EINVAL;\n-\t}\n-\tfilter->priority = (uint16_t)attr->priority;\n-\tif (attr->priority >  FLOW_RULE_MIN_PRIORITY)\n-\t\tfilter->priority = FLOW_RULE_MAX_PRIORITY;\n-\n-\t/* parse action */\n-\tindex = 0;\n-\n-\t/**\n-\t * n-tuple only supports count and Mark,\n-\t * check if the first not void action is COUNT or MARK.\n-\t */\n-\tmemset(&action, 0, sizeof(action));\n-\tNEXT_ITEM_OF_ACTION(act, actions, index);\n-\tswitch (act->type) {\n-\tcase RTE_FLOW_ACTION_TYPE_COUNT:\n-\t\taction.action_mask |= 1LLU << RTE_FLOW_ACTION_TYPE_COUNT;\n-\t\tcount = act->conf;\n-\t\tmemcpy(&action.act.counter, count, sizeof(action.act.counter));\n-\t\tbreak;\n-\tcase RTE_FLOW_ACTION_TYPE_MARK:\n-\t\taction.action_mask |= 1LLU << RTE_FLOW_ACTION_TYPE_MARK;\n-\t\tmark_spec = act->conf;\n-\t\tmemcpy(&action.act.mark, mark_spec, sizeof(action.act.mark));\n-\t\tbreak;\n-\tdefault:\n-\t\tmemset(filter, 0, sizeof(struct rte_eth_ntuple_filter));\n-\t\trte_flow_error_set(error, EINVAL,\n-\t\t   RTE_FLOW_ERROR_TYPE_ACTION, act,\n-\t\t   \"Invalid action.\");\n-\t\treturn -EINVAL;\n-\t}\n-\n-\t/* check if the next not void item is MARK or COUNT or END */\n-\tindex++;\n-\tNEXT_ITEM_OF_ACTION(act, actions, index);\n-\tswitch (act->type) {\n-\tcase RTE_FLOW_ACTION_TYPE_COUNT:\n-\t\taction.action_mask |= 1LLU << RTE_FLOW_ACTION_TYPE_COUNT;\n-\t\tcount = act->conf;\n-\t\tmemcpy(&action.act.counter, count, sizeof(action.act.counter));\n-\t\tbreak;\n-\tcase RTE_FLOW_ACTION_TYPE_MARK:\n-\t\taction.action_mask |= 1LLU << RTE_FLOW_ACTION_TYPE_MARK;\n-\t\tmark_spec = act->conf;\n-\t\tmemcpy(&action.act.mark, mark_spec, sizeof(action.act.mark));\n-\t\tbreak;\n-\tcase RTE_FLOW_ACTION_TYPE_END:\n-\t\treturn 0;\n-\tdefault:\n-\t\tmemset(filter, 0, sizeof(struct rte_eth_ntuple_filter));\n-\t\trte_flow_error_set(error, EINVAL,\n-\t\t   RTE_FLOW_ERROR_TYPE_ACTION, act,\n-\t\t   \"Invalid action.\");\n-\t\treturn -EINVAL;\n-\t}\n-\n-\t/* check if the next not void item is END */\n-\tindex++;\n-\tNEXT_ITEM_OF_ACTION(act, actions, index);\n-\tif (act->type != RTE_FLOW_ACTION_TYPE_END) {\n-\t\tmemset(filter, 0, sizeof(struct rte_eth_ntuple_filter));\n-\t\trte_flow_error_set(error, EINVAL,\n-\t\t   RTE_FLOW_ERROR_TYPE_ACTION, act,\n-\t\t   \"Invalid action.\");\n-\t\treturn -EINVAL;\n-\t}\n-\n-\treturn 0;\n-}\ndiff --git a/lib/flow_classify/rte_flow_classify_parse.h b/lib/flow_classify/rte_flow_classify_parse.h\ndeleted file mode 100644\nindex 7943efc0d4ba..000000000000\n--- a/lib/flow_classify/rte_flow_classify_parse.h\n+++ /dev/null\n@@ -1,58 +0,0 @@\n-/* SPDX-License-Identifier: BSD-3-Clause\n- * Copyright(c) 2017 Intel Corporation\n- */\n-\n-#ifndef _RTE_FLOW_CLASSIFY_PARSE_H_\n-#define _RTE_FLOW_CLASSIFY_PARSE_H_\n-\n-#include <rte_ethdev.h>\n-#include <rte_flow.h>\n-#include <stdbool.h>\n-\n-#ifdef __cplusplus\n-extern \"C\" {\n-#endif\n-\n-extern enum rte_flow_classify_table_type table_type;\n-\n-struct classify_action {\n-\t/* Flow action mask */\n-\tuint64_t action_mask;\n-\n-\tstruct action {\n-\t\t/** Integer value to return with packets */\n-\t\tstruct rte_flow_action_mark mark;\n-\t\t/** Flow rule counter */\n-\t\tstruct rte_flow_query_count counter;\n-\t} act;\n-};\n-\n-typedef int (*parse_filter_t)(const struct rte_flow_attr *attr,\n-\t\t\t      const struct rte_flow_item pattern[],\n-\t\t\t      const struct rte_flow_action actions[],\n-\t\t\t      struct rte_eth_ntuple_filter *filter,\n-\t\t\t      struct rte_flow_error *error);\n-\n-/* Skip all VOID items of the pattern */\n-void\n-classify_pattern_skip_void_item(struct rte_flow_item *items,\n-\t\t\t    const struct rte_flow_item *pattern);\n-\n-/* Find the first VOID or non-VOID item pointer */\n-const struct rte_flow_item *\n-classify_find_first_item(const struct rte_flow_item *item, bool is_void);\n-\n-\n-/* Find if there's parse filter function matched */\n-parse_filter_t\n-classify_find_parse_filter_func(struct rte_flow_item *pattern);\n-\n-/* get action data */\n-struct classify_action *\n-classify_get_flow_action(void);\n-\n-#ifdef __cplusplus\n-}\n-#endif\n-\n-#endif /* _RTE_FLOW_CLASSIFY_PARSE_H_ */\ndiff --git a/lib/flow_classify/version.map b/lib/flow_classify/version.map\ndeleted file mode 100644\nindex 49bc25c6a087..000000000000\n--- a/lib/flow_classify/version.map\n+++ /dev/null\n@@ -1,13 +0,0 @@\n-EXPERIMENTAL {\n-\tglobal:\n-\n-\trte_flow_classifier_create;\n-\trte_flow_classifier_free;\n-\trte_flow_classifier_query;\n-\trte_flow_classify_table_create;\n-\trte_flow_classify_table_entry_add;\n-\trte_flow_classify_table_entry_delete;\n-\trte_flow_classify_validate;\n-\n-\tlocal: *;\n-};\ndiff --git a/lib/meson.build b/lib/meson.build\nindex fac2f52cad4f..ecac701161c8 100644\n--- a/lib/meson.build\n+++ b/lib/meson.build\n@@ -62,7 +62,6 @@ libraries = [\n         'pdump', # pdump lib depends on bpf\n         'table',\n         'pipeline',\n-        'flow_classify', # flow_classify lib depends on pkt framework table lib\n         'graph',\n         'node',\n ]\n@@ -70,7 +69,6 @@ libraries = [\n optional_libs = [\n         'bitratestats',\n         'cfgfile',\n-        'flow_classify',\n         'gpudev',\n         'graph',\n         'gro',\n@@ -89,7 +87,6 @@ optional_libs = [\n ]\n \n dpdk_libs_deprecated += [\n-        'flow_classify',\n         'kni',\n ]\n \ndiff --git a/meson_options.txt b/meson_options.txt\nindex 82c8297065f0..95e22e0ce70c 100644\n--- a/meson_options.txt\n+++ b/meson_options.txt\n@@ -10,7 +10,7 @@ option('disable_apps', type: 'string', value: '', description:\n        'Comma-separated list of apps to explicitly disable.')\n option('disable_drivers', type: 'string', value: '', description:\n        'Comma-separated list of drivers to explicitly disable.')\n-option('disable_libs', type: 'string', value: 'flow_classify,kni', description:\n+option('disable_libs', type: 'string', value: 'kni', description:\n        'Comma-separated list of libraries to explicitly disable. [NOTE: not all libs can be disabled]')\n option('drivers_install_subdir', type: 'string', value: 'dpdk/pmds-<VERSION>', description:\n        'Subdirectory of libdir where to install PMDs. Defaults to using a versioned subdirectory.')\n",
    "prefixes": [
        "v2",
        "1/2"
    ]
}