get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 36001,
    "url": "https://patches.dpdk.org/api/patches/36001/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/20180312172615.6621-13-jasvinder.singh@intel.com/",
    "project": {
        "id": 1,
        "url": "https://patches.dpdk.org/api/projects/1/?format=api",
        "name": "DPDK",
        "link_name": "dpdk",
        "list_id": "dev.dpdk.org",
        "list_email": "dev@dpdk.org",
        "web_url": "http://core.dpdk.org",
        "scm_url": "git://dpdk.org/dpdk",
        "webscm_url": "http://git.dpdk.org/dpdk",
        "list_archive_url": "https://inbox.dpdk.org/dev",
        "list_archive_url_format": "https://inbox.dpdk.org/dev/{}",
        "commit_url_format": ""
    },
    "msgid": "<20180312172615.6621-13-jasvinder.singh@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20180312172615.6621-13-jasvinder.singh@intel.com",
    "date": "2018-03-12T17:25:43",
    "name": "[dpdk-dev,v2,12/44] ip_pipeline: remove flow classification pipeline",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "1c07ce410b5104c166b08bc1b70caae6a1a9ba1d",
    "submitter": {
        "id": 285,
        "url": "https://patches.dpdk.org/api/people/285/?format=api",
        "name": "Jasvinder Singh",
        "email": "jasvinder.singh@intel.com"
    },
    "delegate": null,
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/20180312172615.6621-13-jasvinder.singh@intel.com/mbox/",
    "series": [],
    "comments": "https://patches.dpdk.org/api/patches/36001/comments/",
    "check": "fail",
    "checks": "https://patches.dpdk.org/api/patches/36001/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@dpdk.org",
        "Delivered-To": "patchwork@dpdk.org",
        "Received": [
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id F13915F45;\n\tMon, 12 Mar 2018 18:52:29 +0100 (CET)",
            "from mga05.intel.com (mga05.intel.com [192.55.52.43])\n\tby dpdk.org (Postfix) with ESMTP id 3625F5F45\n\tfor <dev@dpdk.org>; Mon, 12 Mar 2018 18:52:27 +0100 (CET)",
            "from orsmga004.jf.intel.com ([10.7.209.38])\n\tby fmsmga105.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384;\n\t12 Mar 2018 10:26:33 -0700",
            "from silpixa00381635.ir.intel.com (HELO\n\tsilpixa00381635.ger.corp.intel.com) ([10.237.222.149])\n\tby orsmga004.jf.intel.com with ESMTP; 12 Mar 2018 10:26:31 -0700"
        ],
        "X-Amp-Result": "SKIPPED(no attachment in message)",
        "X-Amp-File-Uploaded": "False",
        "X-ExtLoop1": "1",
        "X-IronPort-AV": "E=Sophos;i=\"5.47,462,1515484800\"; d=\"scan'208\";a=\"182012874\"",
        "From": "Jasvinder Singh <jasvinder.singh@intel.com>",
        "To": "dev@dpdk.org",
        "Cc": "cristian.dumitrescu@intel.com",
        "Date": "Mon, 12 Mar 2018 17:25:43 +0000",
        "Message-Id": "<20180312172615.6621-13-jasvinder.singh@intel.com>",
        "X-Mailer": "git-send-email 2.9.3",
        "In-Reply-To": "<20180312172615.6621-1-jasvinder.singh@intel.com>",
        "References": "<20180309182426.135278-2-jasvinder.singh@intel.com>\n\t<20180312172615.6621-1-jasvinder.singh@intel.com>",
        "Subject": "[dpdk-dev] [PATCH v2 12/44] ip_pipeline: remove flow classification\n\tpipeline",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://dpdk.org/ml/options/dev>,\n\t<mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://dpdk.org/ml/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://dpdk.org/ml/listinfo/dev>,\n\t<mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "Remove flow classification pipeline.\n\nSigned-off-by: Cristian Dumitrescu <cristian.dumitrescu@intel.com>\nSigned-off-by: Jasvinder Singh <jasvinder.singh@intel.com>\n---\n examples/ip_pipeline/Makefile                      |    2 -\n examples/ip_pipeline/init.c                        |    2 -\n examples/ip_pipeline/meson.build                   |    2 -\n .../pipeline/pipeline_flow_classification.c        | 1878 --------------------\n .../pipeline/pipeline_flow_classification.h        |  106 --\n .../pipeline/pipeline_flow_classification_be.c     |  723 --------\n .../pipeline/pipeline_flow_classification_be.h     |  113 --\n 7 files changed, 2826 deletions(-)\n delete mode 100644 examples/ip_pipeline/pipeline/pipeline_flow_classification.c\n delete mode 100644 examples/ip_pipeline/pipeline/pipeline_flow_classification.h\n delete mode 100644 examples/ip_pipeline/pipeline/pipeline_flow_classification_be.c\n delete mode 100644 examples/ip_pipeline/pipeline/pipeline_flow_classification_be.h",
    "diff": "diff --git a/examples/ip_pipeline/Makefile b/examples/ip_pipeline/Makefile\nindex f67cfe6..e43001f 100644\n--- a/examples/ip_pipeline/Makefile\n+++ b/examples/ip_pipeline/Makefile\n@@ -21,8 +21,6 @@ SRCS-y += pipeline_master_be.c\n SRCS-y += pipeline_master.c\n SRCS-y += pipeline_firewall_be.c\n SRCS-y += pipeline_firewall.c\n-SRCS-y += pipeline_flow_classification_be.c\n-SRCS-y += pipeline_flow_classification.c\n SRCS-y += pipeline_flow_actions_be.c\n SRCS-y += pipeline_flow_actions.c\n \ndiff --git a/examples/ip_pipeline/init.c b/examples/ip_pipeline/init.c\nindex 241d80a..4780bb1 100644\n--- a/examples/ip_pipeline/init.c\n+++ b/examples/ip_pipeline/init.c\n@@ -27,7 +27,6 @@\n #include \"pipeline_common_fe.h\"\n #include \"pipeline_master.h\"\n #include \"pipeline_firewall.h\"\n-#include \"pipeline_flow_classification.h\"\n #include \"pipeline_flow_actions.h\"\n #include \"thread_fe.h\"\n \n@@ -1820,7 +1819,6 @@ int app_init(struct app_params *app)\n \tapp_pipeline_common_cmd_push(app);\n \tapp_pipeline_thread_cmd_push(app);\n \tapp_pipeline_type_register(app, &pipeline_master);\n-\tapp_pipeline_type_register(app, &pipeline_flow_classification);\n \tapp_pipeline_type_register(app, &pipeline_flow_actions);\n \tapp_pipeline_type_register(app, &pipeline_firewall);\n \ndiff --git a/examples/ip_pipeline/meson.build b/examples/ip_pipeline/meson.build\nindex 53d36df..a04e418 100644\n--- a/examples/ip_pipeline/meson.build\n+++ b/examples/ip_pipeline/meson.build\n@@ -24,8 +24,6 @@ sources = files(\n \t'pipeline/pipeline_firewall.c',\n \t'pipeline/pipeline_flow_actions_be.c',\n \t'pipeline/pipeline_flow_actions.c',\n-\t'pipeline/pipeline_flow_classification_be.c',\n-\t'pipeline/pipeline_flow_classification.c',\n \t'pipeline/pipeline_master_be.c',\n \t'pipeline/pipeline_master.c',\n )\ndiff --git a/examples/ip_pipeline/pipeline/pipeline_flow_classification.c b/examples/ip_pipeline/pipeline/pipeline_flow_classification.c\ndeleted file mode 100644\nindex d39e0fb..0000000\n--- a/examples/ip_pipeline/pipeline/pipeline_flow_classification.c\n+++ /dev/null\n@@ -1,1878 +0,0 @@\n-/* SPDX-License-Identifier: BSD-3-Clause\n- * Copyright(c) 2010-2016 Intel Corporation\n- */\n-\n-#include <stdio.h>\n-#include <string.h>\n-#include <sys/queue.h>\n-#include <netinet/in.h>\n-#include <unistd.h>\n-\n-#include <rte_common.h>\n-#include <rte_hexdump.h>\n-#include <rte_malloc.h>\n-#include <cmdline_rdline.h>\n-#include <cmdline_parse.h>\n-#include <cmdline_parse_num.h>\n-#include <cmdline_parse_string.h>\n-\n-#include \"app.h\"\n-#include \"pipeline_common_fe.h\"\n-#include \"pipeline_flow_classification.h\"\n-#include \"hash_func.h\"\n-#include \"parser.h\"\n-\n-/*\n- * Key conversion\n- */\n-\n-struct pkt_key_qinq {\n-\tuint16_t ethertype_svlan;\n-\tuint16_t svlan;\n-\tuint16_t ethertype_cvlan;\n-\tuint16_t cvlan;\n-} __attribute__((__packed__));\n-\n-struct pkt_key_ipv4_5tuple {\n-\tuint8_t ttl;\n-\tuint8_t proto;\n-\tuint16_t checksum;\n-\tuint32_t ip_src;\n-\tuint32_t ip_dst;\n-\tuint16_t port_src;\n-\tuint16_t port_dst;\n-} __attribute__((__packed__));\n-\n-struct pkt_key_ipv6_5tuple {\n-\tuint16_t payload_length;\n-\tuint8_t proto;\n-\tuint8_t hop_limit;\n-\tuint8_t ip_src[16];\n-\tuint8_t ip_dst[16];\n-\tuint16_t port_src;\n-\tuint16_t port_dst;\n-} __attribute__((__packed__));\n-\n-static int\n-app_pipeline_fc_key_convert(struct pipeline_fc_key *key_in,\n-\tuint8_t *key_out,\n-\tuint32_t *signature)\n-{\n-\tuint8_t buffer[PIPELINE_FC_FLOW_KEY_MAX_SIZE];\n-\tuint8_t m[PIPELINE_FC_FLOW_KEY_MAX_SIZE]; /* key mask */\n-\tvoid *key_buffer = (key_out) ? key_out : buffer;\n-\n-\tmemset(m, 0xFF, sizeof(m));\n-\tswitch (key_in->type) {\n-\tcase FLOW_KEY_QINQ:\n-\t{\n-\t\tstruct pkt_key_qinq *qinq = key_buffer;\n-\n-\t\tqinq->ethertype_svlan = 0;\n-\t\tqinq->svlan = rte_cpu_to_be_16(key_in->key.qinq.svlan);\n-\t\tqinq->ethertype_cvlan = 0;\n-\t\tqinq->cvlan = rte_cpu_to_be_16(key_in->key.qinq.cvlan);\n-\n-\t\tif (signature)\n-\t\t\t*signature = (uint32_t) hash_default_key8(qinq, m, 8, 0);\n-\t\treturn 0;\n-\t}\n-\n-\tcase FLOW_KEY_IPV4_5TUPLE:\n-\t{\n-\t\tstruct pkt_key_ipv4_5tuple *ipv4 = key_buffer;\n-\n-\t\tipv4->ttl = 0;\n-\t\tipv4->proto = key_in->key.ipv4_5tuple.proto;\n-\t\tipv4->checksum = 0;\n-\t\tipv4->ip_src = rte_cpu_to_be_32(key_in->key.ipv4_5tuple.ip_src);\n-\t\tipv4->ip_dst = rte_cpu_to_be_32(key_in->key.ipv4_5tuple.ip_dst);\n-\t\tipv4->port_src = rte_cpu_to_be_16(key_in->key.ipv4_5tuple.port_src);\n-\t\tipv4->port_dst = rte_cpu_to_be_16(key_in->key.ipv4_5tuple.port_dst);\n-\n-\t\tif (signature)\n-\t\t\t*signature = (uint32_t) hash_default_key16(ipv4, m, 16, 0);\n-\t\treturn 0;\n-\t}\n-\n-\tcase FLOW_KEY_IPV6_5TUPLE:\n-\t{\n-\t\tstruct pkt_key_ipv6_5tuple *ipv6 = key_buffer;\n-\n-\t\tmemset(ipv6, 0, 64);\n-\t\tipv6->payload_length = 0;\n-\t\tipv6->proto = key_in->key.ipv6_5tuple.proto;\n-\t\tipv6->hop_limit = 0;\n-\t\tmemcpy(&ipv6->ip_src, &key_in->key.ipv6_5tuple.ip_src, 16);\n-\t\tmemcpy(&ipv6->ip_dst, &key_in->key.ipv6_5tuple.ip_dst, 16);\n-\t\tipv6->port_src = rte_cpu_to_be_16(key_in->key.ipv6_5tuple.port_src);\n-\t\tipv6->port_dst = rte_cpu_to_be_16(key_in->key.ipv6_5tuple.port_dst);\n-\n-\t\tif (signature)\n-\t\t\t*signature = (uint32_t) hash_default_key64(ipv6, m, 64, 0);\n-\t\treturn 0;\n-\t}\n-\n-\tdefault:\n-\t\treturn -1;\n-\t}\n-}\n-\n-/*\n- * Flow classification pipeline\n- */\n-\n-struct app_pipeline_fc_flow {\n-\tstruct pipeline_fc_key key;\n-\tuint32_t port_id;\n-\tuint32_t flow_id;\n-\tuint32_t signature;\n-\tvoid *entry_ptr;\n-\n-\tTAILQ_ENTRY(app_pipeline_fc_flow) node;\n-};\n-\n-#define N_BUCKETS                                65536\n-\n-struct app_pipeline_fc {\n-\t/* Parameters */\n-\tuint32_t n_ports_in;\n-\tuint32_t n_ports_out;\n-\n-\t/* Flows */\n-\tTAILQ_HEAD(, app_pipeline_fc_flow) flows[N_BUCKETS];\n-\tuint32_t n_flows;\n-\n-\t/* Default flow */\n-\tuint32_t default_flow_present;\n-\tuint32_t default_flow_port_id;\n-\tvoid *default_flow_entry_ptr;\n-};\n-\n-static struct app_pipeline_fc_flow *\n-app_pipeline_fc_flow_find(struct app_pipeline_fc *p,\n-\tstruct pipeline_fc_key *key)\n-{\n-\tstruct app_pipeline_fc_flow *f;\n-\tuint32_t signature, bucket_id;\n-\n-\tapp_pipeline_fc_key_convert(key, NULL, &signature);\n-\tbucket_id = signature & (N_BUCKETS - 1);\n-\n-\tTAILQ_FOREACH(f, &p->flows[bucket_id], node)\n-\t\tif ((signature == f->signature) &&\n-\t\t\t(memcmp(key,\n-\t\t\t\t&f->key,\n-\t\t\t\tsizeof(struct pipeline_fc_key)) == 0))\n-\t\t\treturn f;\n-\n-\treturn NULL;\n-}\n-\n-static void*\n-app_pipeline_fc_init(struct pipeline_params *params,\n-\t__rte_unused void *arg)\n-{\n-\tstruct app_pipeline_fc *p;\n-\tuint32_t size, i;\n-\n-\t/* Check input arguments */\n-\tif ((params == NULL) ||\n-\t\t(params->n_ports_in == 0) ||\n-\t\t(params->n_ports_out == 0))\n-\t\treturn NULL;\n-\n-\t/* Memory allocation */\n-\tsize = RTE_CACHE_LINE_ROUNDUP(sizeof(struct app_pipeline_fc));\n-\tp = rte_zmalloc(NULL, size, RTE_CACHE_LINE_SIZE);\n-\tif (p == NULL)\n-\t\treturn NULL;\n-\n-\t/* Initialization */\n-\tp->n_ports_in = params->n_ports_in;\n-\tp->n_ports_out = params->n_ports_out;\n-\n-\tfor (i = 0; i < N_BUCKETS; i++)\n-\t\tTAILQ_INIT(&p->flows[i]);\n-\tp->n_flows = 0;\n-\n-\treturn (void *) p;\n-}\n-\n-static int\n-app_pipeline_fc_free(void *pipeline)\n-{\n-\tstruct app_pipeline_fc *p = pipeline;\n-\tuint32_t i;\n-\n-\t/* Check input arguments */\n-\tif (p == NULL)\n-\t\treturn -1;\n-\n-\t/* Free resources */\n-\tfor (i = 0; i < N_BUCKETS; i++)\n-\t\twhile (!TAILQ_EMPTY(&p->flows[i])) {\n-\t\t\tstruct app_pipeline_fc_flow *flow;\n-\n-\t\t\tflow = TAILQ_FIRST(&p->flows[i]);\n-\t\t\tTAILQ_REMOVE(&p->flows[i], flow, node);\n-\t\t\trte_free(flow);\n-\t\t}\n-\n-\trte_free(p);\n-\treturn 0;\n-}\n-\n-static int\n-app_pipeline_fc_key_check(struct pipeline_fc_key *key)\n-{\n-\tswitch (key->type) {\n-\tcase FLOW_KEY_QINQ:\n-\t{\n-\t\tuint16_t svlan = key->key.qinq.svlan;\n-\t\tuint16_t cvlan = key->key.qinq.cvlan;\n-\n-\t\tif ((svlan & 0xF000) ||\n-\t\t\t(cvlan & 0xF000))\n-\t\t\treturn -1;\n-\n-\t\treturn 0;\n-\t}\n-\n-\tcase FLOW_KEY_IPV4_5TUPLE:\n-\t\treturn 0;\n-\n-\tcase FLOW_KEY_IPV6_5TUPLE:\n-\t\treturn 0;\n-\n-\tdefault:\n-\t\treturn -1;\n-\t}\n-}\n-\n-int\n-app_pipeline_fc_load_file_qinq(char *filename,\n-\tstruct pipeline_fc_key *keys,\n-\tuint32_t *port_ids,\n-\tuint32_t *flow_ids,\n-\tuint32_t *n_keys,\n-\tuint32_t *line)\n-{\n-\tFILE *f = NULL;\n-\tchar file_buf[1024];\n-\tuint32_t i, l;\n-\n-\t/* Check input arguments */\n-\tif ((filename == NULL) ||\n-\t\t(keys == NULL) ||\n-\t\t(port_ids == NULL) ||\n-\t\t(flow_ids == NULL) ||\n-\t\t(n_keys == NULL) ||\n-\t\t(*n_keys == 0) ||\n-\t\t(line == NULL)) {\n-\t\tif (line)\n-\t\t\t*line = 0;\n-\t\treturn -1;\n-\t\t}\n-\n-\t/* Open input file */\n-\tf = fopen(filename, \"r\");\n-\tif (f == NULL) {\n-\t\t*line = 0;\n-\t\treturn -1;\n-\t}\n-\n-\t/* Read file */\n-\tfor (i = 0, l = 1; i < *n_keys; l++) {\n-\t\tchar *tokens[32];\n-\t\tuint32_t n_tokens = RTE_DIM(tokens);\n-\n-\t\tuint16_t svlan, cvlan;\n-\t\tuint32_t portid, flowid;\n-\t\tint status;\n-\n-\t\tif (fgets(file_buf, sizeof(file_buf), f) == NULL)\n-\t\t\tbreak;\n-\n-\t\tstatus = parse_tokenize_string(file_buf, tokens, &n_tokens);\n-\t\tif (status)\n-\t\t\tgoto error1;\n-\n-\t\tif ((n_tokens == 0) || (tokens[0][0] == '#'))\n-\t\t\tcontinue;\n-\n-\t\tif ((n_tokens != 7) ||\n-\t\t\tstrcmp(tokens[0], \"qinq\") ||\n-\t\t\tparser_read_uint16(&svlan, tokens[1]) ||\n-\t\t\tparser_read_uint16(&cvlan, tokens[2]) ||\n-\t\t\tstrcmp(tokens[3], \"port\") ||\n-\t\t\tparser_read_uint32(&portid, tokens[4]) ||\n-\t\t\tstrcmp(tokens[5], \"id\") ||\n-\t\t\tparser_read_uint32(&flowid, tokens[6]))\n-\t\t\tgoto error1;\n-\n-\t\tkeys[i].type = FLOW_KEY_QINQ;\n-\t\tkeys[i].key.qinq.svlan = svlan;\n-\t\tkeys[i].key.qinq.cvlan = cvlan;\n-\n-\t\tport_ids[i] = portid;\n-\t\tflow_ids[i] = flowid;\n-\n-\t\tif (app_pipeline_fc_key_check(&keys[i]))\n-\t\t\tgoto error1;\n-\n-\t\ti++;\n-\t}\n-\n-\t/* Close file */\n-\t*n_keys = i;\n-\tfclose(f);\n-\treturn 0;\n-\n-error1:\n-\t*line = l;\n-\tfclose(f);\n-\treturn -1;\n-}\n-\n-int\n-app_pipeline_fc_load_file_ipv4(char *filename,\n-\tstruct pipeline_fc_key *keys,\n-\tuint32_t *port_ids,\n-\tuint32_t *flow_ids,\n-\tuint32_t *n_keys,\n-\tuint32_t *line)\n-{\n-\tFILE *f = NULL;\n-\tchar file_buf[1024];\n-\tuint32_t i, l;\n-\n-\t/* Check input arguments */\n-\tif ((filename == NULL) ||\n-\t\t(keys == NULL) ||\n-\t\t(port_ids == NULL) ||\n-\t\t(flow_ids == NULL) ||\n-\t\t(n_keys == NULL) ||\n-\t\t(*n_keys == 0) ||\n-\t\t(line == NULL)) {\n-\t\tif (line)\n-\t\t\t*line = 0;\n-\t\treturn -1;\n-\t\t}\n-\n-\t/* Open input file */\n-\tf = fopen(filename, \"r\");\n-\tif (f == NULL) {\n-\t\t*line = 0;\n-\t\treturn -1;\n-\t}\n-\n-\t/* Read file */\n-\tfor (i = 0, l = 1; i < *n_keys; l++) {\n-\t\tchar *tokens[32];\n-\t\tuint32_t n_tokens = RTE_DIM(tokens);\n-\n-\t\tstruct in_addr sipaddr, dipaddr;\n-\t\tuint16_t sport, dport;\n-\t\tuint8_t proto;\n-\t\tuint32_t portid, flowid;\n-\t\tint status;\n-\n-\t\tif (fgets(file_buf, sizeof(file_buf), f) == NULL)\n-\t\t\tbreak;\n-\n-\t\tstatus = parse_tokenize_string(file_buf, tokens, &n_tokens);\n-\t\tif (status)\n-\t\t\tgoto error2;\n-\n-\t\tif ((n_tokens == 0) || (tokens[0][0] == '#'))\n-\t\t\tcontinue;\n-\n-\t\tif ((n_tokens != 10) ||\n-\t\t\tstrcmp(tokens[0], \"ipv4\") ||\n-\t\t\tparse_ipv4_addr(tokens[1], &sipaddr) ||\n-\t\t\tparse_ipv4_addr(tokens[2], &dipaddr) ||\n-\t\t\tparser_read_uint16(&sport, tokens[3]) ||\n-\t\t\tparser_read_uint16(&dport, tokens[4]) ||\n-\t\t\tparser_read_uint8(&proto, tokens[5]) ||\n-\t\t\tstrcmp(tokens[6], \"port\") ||\n-\t\t\tparser_read_uint32(&portid, tokens[7]) ||\n-\t\t\tstrcmp(tokens[8], \"id\") ||\n-\t\t\tparser_read_uint32(&flowid, tokens[9]))\n-\t\t\tgoto error2;\n-\n-\t\tkeys[i].type = FLOW_KEY_IPV4_5TUPLE;\n-\t\tkeys[i].key.ipv4_5tuple.ip_src = rte_be_to_cpu_32(sipaddr.s_addr);\n-\t\tkeys[i].key.ipv4_5tuple.ip_dst = rte_be_to_cpu_32(dipaddr.s_addr);\n-\t\tkeys[i].key.ipv4_5tuple.port_src = sport;\n-\t\tkeys[i].key.ipv4_5tuple.port_dst = dport;\n-\t\tkeys[i].key.ipv4_5tuple.proto = proto;\n-\n-\t\tport_ids[i] = portid;\n-\t\tflow_ids[i] = flowid;\n-\n-\t\tif (app_pipeline_fc_key_check(&keys[i]))\n-\t\t\tgoto error2;\n-\n-\t\ti++;\n-\t}\n-\n-\t/* Close file */\n-\t*n_keys = i;\n-\tfclose(f);\n-\treturn 0;\n-\n-error2:\n-\t*line = l;\n-\tfclose(f);\n-\treturn -1;\n-}\n-\n-int\n-app_pipeline_fc_load_file_ipv6(char *filename,\n-\tstruct pipeline_fc_key *keys,\n-\tuint32_t *port_ids,\n-\tuint32_t *flow_ids,\n-\tuint32_t *n_keys,\n-\tuint32_t *line)\n-{\n-\tFILE *f = NULL;\n-\tchar file_buf[1024];\n-\tuint32_t i, l;\n-\n-\t/* Check input arguments */\n-\tif ((filename == NULL) ||\n-\t\t(keys == NULL) ||\n-\t\t(port_ids == NULL) ||\n-\t\t(flow_ids == NULL) ||\n-\t\t(n_keys == NULL) ||\n-\t\t(*n_keys == 0) ||\n-\t\t(line == NULL)) {\n-\t\tif (line)\n-\t\t\t*line = 0;\n-\t\treturn -1;\n-\t\t}\n-\n-\t/* Open input file */\n-\tf = fopen(filename, \"r\");\n-\tif (f == NULL) {\n-\t\t*line = 0;\n-\t\treturn -1;\n-\t}\n-\n-\t/* Read file */\n-\tfor (i = 0, l = 1; i < *n_keys; l++) {\n-\t\tchar *tokens[32];\n-\t\tuint32_t n_tokens = RTE_DIM(tokens);\n-\n-\t\tstruct in6_addr sipaddr, dipaddr;\n-\t\tuint16_t sport, dport;\n-\t\tuint8_t proto;\n-\t\tuint32_t portid, flowid;\n-\t\tint status;\n-\n-\t\tif (fgets(file_buf, sizeof(file_buf), f) == NULL)\n-\t\t\tbreak;\n-\n-\t\tstatus = parse_tokenize_string(file_buf, tokens, &n_tokens);\n-\t\tif (status)\n-\t\t\tgoto error3;\n-\n-\t\tif ((n_tokens == 0) || (tokens[0][0] == '#'))\n-\t\t\tcontinue;\n-\n-\t\tif ((n_tokens != 10) ||\n-\t\t\tstrcmp(tokens[0], \"ipv6\") ||\n-\t\t\tparse_ipv6_addr(tokens[1], &sipaddr) ||\n-\t\t\tparse_ipv6_addr(tokens[2], &dipaddr) ||\n-\t\t\tparser_read_uint16(&sport, tokens[3]) ||\n-\t\t\tparser_read_uint16(&dport, tokens[4]) ||\n-\t\t\tparser_read_uint8(&proto, tokens[5]) ||\n-\t\t\tstrcmp(tokens[6], \"port\") ||\n-\t\t\tparser_read_uint32(&portid, tokens[7]) ||\n-\t\t\tstrcmp(tokens[8], \"id\") ||\n-\t\t\tparser_read_uint32(&flowid, tokens[9]))\n-\t\t\tgoto error3;\n-\n-\t\tkeys[i].type = FLOW_KEY_IPV6_5TUPLE;\n-\t\tmemcpy(keys[i].key.ipv6_5tuple.ip_src,\n-\t\t\tsipaddr.s6_addr,\n-\t\t\tsizeof(sipaddr.s6_addr));\n-\t\tmemcpy(keys[i].key.ipv6_5tuple.ip_dst,\n-\t\t\tdipaddr.s6_addr,\n-\t\t\tsizeof(dipaddr.s6_addr));\n-\t\tkeys[i].key.ipv6_5tuple.port_src = sport;\n-\t\tkeys[i].key.ipv6_5tuple.port_dst = dport;\n-\t\tkeys[i].key.ipv6_5tuple.proto = proto;\n-\n-\t\tport_ids[i] = portid;\n-\t\tflow_ids[i] = flowid;\n-\n-\t\tif (app_pipeline_fc_key_check(&keys[i]))\n-\t\t\tgoto error3;\n-\n-\t\ti++;\n-\t}\n-\n-\t/* Close file */\n-\t*n_keys = i;\n-\tfclose(f);\n-\treturn 0;\n-\n-error3:\n-\t*line = l;\n-\tfclose(f);\n-\treturn -1;\n-}\n-\n-\n-\n-int\n-app_pipeline_fc_add(struct app_params *app,\n-\tuint32_t pipeline_id,\n-\tstruct pipeline_fc_key *key,\n-\tuint32_t port_id,\n-\tuint32_t flow_id)\n-{\n-\tstruct app_pipeline_fc *p;\n-\tstruct app_pipeline_fc_flow *flow;\n-\n-\tstruct pipeline_fc_add_msg_req *req;\n-\tstruct pipeline_fc_add_msg_rsp *rsp;\n-\n-\tuint32_t signature;\n-\tint new_flow;\n-\n-\t/* Check input arguments */\n-\tif ((app == NULL) ||\n-\t\t(key == NULL))\n-\t\treturn -1;\n-\n-\tp = app_pipeline_data_fe(app, pipeline_id, &pipeline_flow_classification);\n-\tif (p == NULL)\n-\t\treturn -1;\n-\n-\tif (port_id >= p->n_ports_out)\n-\t\treturn -1;\n-\n-\tif (app_pipeline_fc_key_check(key) != 0)\n-\t\treturn -1;\n-\n-\t/* Find existing flow or allocate new flow */\n-\tflow = app_pipeline_fc_flow_find(p, key);\n-\tnew_flow = (flow == NULL);\n-\tif (flow == NULL) {\n-\t\tflow = rte_malloc(NULL, sizeof(*flow), RTE_CACHE_LINE_SIZE);\n-\n-\t\tif (flow == NULL)\n-\t\t\treturn -1;\n-\t}\n-\n-\t/* Allocate and write request */\n-\treq = app_msg_alloc(app);\n-\tif (req == NULL)\n-\t\treturn -1;\n-\n-\treq->type = PIPELINE_MSG_REQ_CUSTOM;\n-\treq->subtype = PIPELINE_FC_MSG_REQ_FLOW_ADD;\n-\tapp_pipeline_fc_key_convert(key, req->key, &signature);\n-\treq->port_id = port_id;\n-\treq->flow_id = flow_id;\n-\n-\t/* Send request and wait for response */\n-\trsp = app_msg_send_recv(app, pipeline_id, req, MSG_TIMEOUT_DEFAULT);\n-\tif (rsp == NULL) {\n-\t\tif (new_flow)\n-\t\t\trte_free(flow);\n-\t\treturn -1;\n-\t}\n-\n-\t/* Read response and write flow */\n-\tif (rsp->status ||\n-\t\t(rsp->entry_ptr == NULL) ||\n-\t\t((new_flow == 0) && (rsp->key_found == 0)) ||\n-\t\t((new_flow == 1) && (rsp->key_found == 1))) {\n-\t\tapp_msg_free(app, rsp);\n-\t\tif (new_flow)\n-\t\t\trte_free(flow);\n-\t\treturn -1;\n-\t}\n-\n-\tmemset(&flow->key, 0, sizeof(flow->key));\n-\tmemcpy(&flow->key, key, sizeof(flow->key));\n-\tflow->port_id = port_id;\n-\tflow->flow_id = flow_id;\n-\tflow->signature = signature;\n-\tflow->entry_ptr = rsp->entry_ptr;\n-\n-\t/* Commit rule */\n-\tif (new_flow) {\n-\t\tuint32_t bucket_id = signature & (N_BUCKETS - 1);\n-\n-\t\tTAILQ_INSERT_TAIL(&p->flows[bucket_id], flow, node);\n-\t\tp->n_flows++;\n-\t}\n-\n-\t/* Free response */\n-\tapp_msg_free(app, rsp);\n-\n-\treturn 0;\n-}\n-\n-int\n-app_pipeline_fc_add_bulk(struct app_params *app,\n-\tuint32_t pipeline_id,\n-\tstruct pipeline_fc_key *key,\n-\tuint32_t *port_id,\n-\tuint32_t *flow_id,\n-\tuint32_t n_keys)\n-{\n-\tstruct app_pipeline_fc *p;\n-\tstruct pipeline_fc_add_bulk_msg_req *req;\n-\tstruct pipeline_fc_add_bulk_msg_rsp *rsp;\n-\n-\tstruct app_pipeline_fc_flow **flow;\n-\tuint32_t *signature;\n-\tint *new_flow;\n-\tstruct pipeline_fc_add_bulk_flow_req *flow_req;\n-\tstruct pipeline_fc_add_bulk_flow_rsp *flow_rsp;\n-\n-\tuint32_t i;\n-\tint status;\n-\n-\t/* Check input arguments */\n-\tif ((app == NULL) ||\n-\t\t(key == NULL) ||\n-\t\t(port_id == NULL) ||\n-\t\t(flow_id == NULL) ||\n-\t\t(n_keys == 0))\n-\t\treturn -1;\n-\n-\tp = app_pipeline_data_fe(app, pipeline_id, &pipeline_flow_classification);\n-\tif (p == NULL)\n-\t\treturn -1;\n-\n-\tfor (i = 0; i < n_keys; i++)\n-\t\tif (port_id[i] >= p->n_ports_out)\n-\t\t\treturn -1;\n-\n-\tfor (i = 0; i < n_keys; i++)\n-\t\tif (app_pipeline_fc_key_check(&key[i]) != 0)\n-\t\t\treturn -1;\n-\n-\t/* Memory allocation */\n-\tflow = rte_malloc(NULL,\n-\t\tn_keys * sizeof(struct app_pipeline_fc_flow *),\n-\t\tRTE_CACHE_LINE_SIZE);\n-\tif (flow == NULL)\n-\t\treturn -1;\n-\n-\tsignature = rte_malloc(NULL,\n-\t\tn_keys * sizeof(uint32_t),\n-\t\tRTE_CACHE_LINE_SIZE);\n-\tif (signature == NULL) {\n-\t\trte_free(flow);\n-\t\treturn -1;\n-\t}\n-\n-\tnew_flow = rte_malloc(\n-\t\tNULL,\n-\t\tn_keys * sizeof(int),\n-\t\tRTE_CACHE_LINE_SIZE);\n-\tif (new_flow == NULL) {\n-\t\trte_free(signature);\n-\t\trte_free(flow);\n-\t\treturn -1;\n-\t}\n-\n-\tflow_req = rte_malloc(NULL,\n-\t\tn_keys * sizeof(struct pipeline_fc_add_bulk_flow_req),\n-\t\tRTE_CACHE_LINE_SIZE);\n-\tif (flow_req == NULL) {\n-\t\trte_free(new_flow);\n-\t\trte_free(signature);\n-\t\trte_free(flow);\n-\t\treturn -1;\n-\t}\n-\n-\tflow_rsp = rte_malloc(NULL,\n-\t\tn_keys * sizeof(struct pipeline_fc_add_bulk_flow_rsp),\n-\t\tRTE_CACHE_LINE_SIZE);\n-\tif (flow_rsp == NULL) {\n-\t\trte_free(flow_req);\n-\t\trte_free(new_flow);\n-\t\trte_free(signature);\n-\t\trte_free(flow);\n-\t\treturn -1;\n-\t}\n-\n-\t/* Find existing flow or allocate new flow */\n-\tfor (i = 0; i < n_keys; i++) {\n-\t\tflow[i] = app_pipeline_fc_flow_find(p, &key[i]);\n-\t\tnew_flow[i] = (flow[i] == NULL);\n-\t\tif (flow[i] == NULL) {\n-\t\t\tflow[i] = rte_zmalloc(NULL,\n-\t\t\t\tsizeof(struct app_pipeline_fc_flow),\n-\t\t\t\tRTE_CACHE_LINE_SIZE);\n-\n-\t\t\tif (flow[i] == NULL) {\n-\t\t\t\tuint32_t j;\n-\n-\t\t\t\tfor (j = 0; j < i; j++)\n-\t\t\t\t\tif (new_flow[j])\n-\t\t\t\t\t\trte_free(flow[j]);\n-\n-\t\t\t\trte_free(flow_rsp);\n-\t\t\t\trte_free(flow_req);\n-\t\t\t\trte_free(new_flow);\n-\t\t\t\trte_free(signature);\n-\t\t\t\trte_free(flow);\n-\t\t\t\treturn -1;\n-\t\t\t}\n-\t\t}\n-\t}\n-\n-\t/* Allocate and write request */\n-\treq = app_msg_alloc(app);\n-\tif (req == NULL) {\n-\t\tfor (i = 0; i < n_keys; i++)\n-\t\t\tif (new_flow[i])\n-\t\t\t\trte_free(flow[i]);\n-\n-\t\trte_free(flow_rsp);\n-\t\trte_free(flow_req);\n-\t\trte_free(new_flow);\n-\t\trte_free(signature);\n-\t\trte_free(flow);\n-\t\treturn -1;\n-\t}\n-\n-\tfor (i = 0; i < n_keys; i++) {\n-\t\tapp_pipeline_fc_key_convert(&key[i],\n-\t\t\tflow_req[i].key,\n-\t\t\t&signature[i]);\n-\t\tflow_req[i].port_id = port_id[i];\n-\t\tflow_req[i].flow_id = flow_id[i];\n-\t}\n-\n-\treq->type = PIPELINE_MSG_REQ_CUSTOM;\n-\treq->subtype = PIPELINE_FC_MSG_REQ_FLOW_ADD_BULK;\n-\treq->req = flow_req;\n-\treq->rsp = flow_rsp;\n-\treq->n_keys = n_keys;\n-\n-\t/* Send request and wait for response */\n-\trsp = app_msg_send_recv(app, pipeline_id, req, 10000);\n-\tif (rsp == NULL) {\n-\t\tfor (i = 0; i < n_keys; i++)\n-\t\t\tif (new_flow[i])\n-\t\t\t\trte_free(flow[i]);\n-\n-\t\trte_free(flow_rsp);\n-\t\trte_free(flow_req);\n-\t\trte_free(new_flow);\n-\t\trte_free(signature);\n-\t\trte_free(flow);\n-\t\treturn -1;\n-\t}\n-\n-\t/* Read response */\n-\tstatus = 0;\n-\n-\tfor (i = 0; i < rsp->n_keys; i++)\n-\t\tif ((flow_rsp[i].entry_ptr == NULL) ||\n-\t\t\t((new_flow[i] == 0) && (flow_rsp[i].key_found == 0)) ||\n-\t\t\t((new_flow[i] == 1) && (flow_rsp[i].key_found == 1)))\n-\t\t\tstatus = -1;\n-\n-\tif (rsp->n_keys < n_keys)\n-\t\tstatus = -1;\n-\n-\t/* Commit flows */\n-\tfor (i = 0; i < rsp->n_keys; i++) {\n-\t\tmemcpy(&flow[i]->key, &key[i], sizeof(flow[i]->key));\n-\t\tflow[i]->port_id = port_id[i];\n-\t\tflow[i]->flow_id = flow_id[i];\n-\t\tflow[i]->signature = signature[i];\n-\t\tflow[i]->entry_ptr = flow_rsp[i].entry_ptr;\n-\n-\t\tif (new_flow[i]) {\n-\t\t\tuint32_t bucket_id = signature[i] & (N_BUCKETS - 1);\n-\n-\t\t\tTAILQ_INSERT_TAIL(&p->flows[bucket_id], flow[i], node);\n-\t\t\tp->n_flows++;\n-\t\t}\n-\t}\n-\n-\t/* Free resources */\n-\n-\tfor (i = rsp->n_keys; i < n_keys; i++)\n-\t\tif (new_flow[i])\n-\t\t\trte_free(flow[i]);\n-\n-\tapp_msg_free(app, rsp);\n-\trte_free(flow_rsp);\n-\trte_free(flow_req);\n-\trte_free(new_flow);\n-\trte_free(signature);\n-\trte_free(flow);\n-\n-\treturn status;\n-}\n-\n-int\n-app_pipeline_fc_del(struct app_params *app,\n-\tuint32_t pipeline_id,\n-\tstruct pipeline_fc_key *key)\n-{\n-\tstruct app_pipeline_fc *p;\n-\tstruct app_pipeline_fc_flow *flow;\n-\n-\tstruct pipeline_fc_del_msg_req *req;\n-\tstruct pipeline_fc_del_msg_rsp *rsp;\n-\n-\tuint32_t signature, bucket_id;\n-\n-\t/* Check input arguments */\n-\tif ((app == NULL) ||\n-\t\t(key == NULL))\n-\t\treturn -1;\n-\n-\tp = app_pipeline_data_fe(app, pipeline_id, &pipeline_flow_classification);\n-\tif (p == NULL)\n-\t\treturn -1;\n-\n-\tif (app_pipeline_fc_key_check(key) != 0)\n-\t\treturn -1;\n-\n-\t/* Find rule */\n-\tflow = app_pipeline_fc_flow_find(p, key);\n-\tif (flow == NULL)\n-\t\treturn 0;\n-\n-\t/* Allocate and write request */\n-\treq = app_msg_alloc(app);\n-\tif (req == NULL)\n-\t\treturn -1;\n-\n-\treq->type = PIPELINE_MSG_REQ_CUSTOM;\n-\treq->subtype = PIPELINE_FC_MSG_REQ_FLOW_DEL;\n-\tapp_pipeline_fc_key_convert(key, req->key, &signature);\n-\n-\t/* Send request and wait for response */\n-\trsp = app_msg_send_recv(app, pipeline_id, req, MSG_TIMEOUT_DEFAULT);\n-\tif (rsp == NULL)\n-\t\treturn -1;\n-\n-\t/* Read response */\n-\tif (rsp->status || !rsp->key_found) {\n-\t\tapp_msg_free(app, rsp);\n-\t\treturn -1;\n-\t}\n-\n-\t/* Remove rule */\n-\tbucket_id = signature & (N_BUCKETS - 1);\n-\tTAILQ_REMOVE(&p->flows[bucket_id], flow, node);\n-\tp->n_flows--;\n-\trte_free(flow);\n-\n-\t/* Free response */\n-\tapp_msg_free(app, rsp);\n-\n-\treturn 0;\n-}\n-\n-int\n-app_pipeline_fc_add_default(struct app_params *app,\n-\tuint32_t pipeline_id,\n-\tuint32_t port_id)\n-{\n-\tstruct app_pipeline_fc *p;\n-\n-\tstruct pipeline_fc_add_default_msg_req *req;\n-\tstruct pipeline_fc_add_default_msg_rsp *rsp;\n-\n-\t/* Check input arguments */\n-\tif (app == NULL)\n-\t\treturn -1;\n-\n-\tp = app_pipeline_data_fe(app, pipeline_id, &pipeline_flow_classification);\n-\tif (p == NULL)\n-\t\treturn -1;\n-\n-\tif (port_id >= p->n_ports_out)\n-\t\treturn -1;\n-\n-\t/* Allocate and write request */\n-\treq = app_msg_alloc(app);\n-\tif (req == NULL)\n-\t\treturn -1;\n-\n-\treq->type = PIPELINE_MSG_REQ_CUSTOM;\n-\treq->subtype = PIPELINE_FC_MSG_REQ_FLOW_ADD_DEFAULT;\n-\treq->port_id = port_id;\n-\n-\t/* Send request and wait for response */\n-\trsp = app_msg_send_recv(app, pipeline_id, req, MSG_TIMEOUT_DEFAULT);\n-\tif (rsp == NULL)\n-\t\treturn -1;\n-\n-\t/* Read response and write flow */\n-\tif (rsp->status || (rsp->entry_ptr == NULL)) {\n-\t\tapp_msg_free(app, rsp);\n-\t\treturn -1;\n-\t}\n-\n-\tp->default_flow_port_id = port_id;\n-\tp->default_flow_entry_ptr = rsp->entry_ptr;\n-\n-\t/* Commit route */\n-\tp->default_flow_present = 1;\n-\n-\t/* Free response */\n-\tapp_msg_free(app, rsp);\n-\n-\treturn 0;\n-}\n-\n-int\n-app_pipeline_fc_del_default(struct app_params *app,\n-\tuint32_t pipeline_id)\n-{\n-\tstruct app_pipeline_fc *p;\n-\n-\tstruct pipeline_fc_del_default_msg_req *req;\n-\tstruct pipeline_fc_del_default_msg_rsp *rsp;\n-\n-\t/* Check input arguments */\n-\tif (app == NULL)\n-\t\treturn -1;\n-\n-\tp = app_pipeline_data_fe(app, pipeline_id, &pipeline_flow_classification);\n-\tif (p == NULL)\n-\t\treturn -EINVAL;\n-\n-\t/* Allocate and write request */\n-\treq = app_msg_alloc(app);\n-\tif (req == NULL)\n-\t\treturn -1;\n-\n-\treq->type = PIPELINE_MSG_REQ_CUSTOM;\n-\treq->subtype = PIPELINE_FC_MSG_REQ_FLOW_DEL_DEFAULT;\n-\n-\t/* Send request and wait for response */\n-\trsp = app_msg_send_recv(app, pipeline_id, req, MSG_TIMEOUT_DEFAULT);\n-\tif (rsp == NULL)\n-\t\treturn -1;\n-\n-\t/* Read response */\n-\tif (rsp->status) {\n-\t\tapp_msg_free(app, rsp);\n-\t\treturn -1;\n-\t}\n-\n-\t/* Commit route */\n-\tp->default_flow_present = 0;\n-\n-\t/* Free response */\n-\tapp_msg_free(app, rsp);\n-\n-\treturn 0;\n-}\n-\n-/*\n- * Flow ls\n- */\n-\n-static void\n-print_fc_qinq_flow(struct app_pipeline_fc_flow *flow)\n-{\n-\tprintf(\"(SVLAN = %\" PRIu32 \", \"\n-\t\t\"CVLAN = %\" PRIu32 \") => \"\n-\t\t\"Port = %\" PRIu32 \", \"\n-\t\t\"Flow ID = %\" PRIu32 \", \"\n-\t\t\"(signature = 0x%08\" PRIx32 \", \"\n-\t\t\"entry_ptr = %p)\\n\",\n-\n-\t\tflow->key.key.qinq.svlan,\n-\t\tflow->key.key.qinq.cvlan,\n-\t\tflow->port_id,\n-\t\tflow->flow_id,\n-\t\tflow->signature,\n-\t\tflow->entry_ptr);\n-}\n-\n-static void\n-print_fc_ipv4_5tuple_flow(struct app_pipeline_fc_flow *flow)\n-{\n-\tprintf(\"(SA = %\" PRIu32 \".%\" PRIu32 \".%\" PRIu32 \".%\" PRIu32 \", \"\n-\t\t   \"DA = %\" PRIu32 \".%\" PRIu32 \".%\" PRIu32 \".%\" PRIu32 \", \"\n-\t\t   \"SP = %\" PRIu32 \", \"\n-\t\t   \"DP = %\" PRIu32 \", \"\n-\t\t   \"Proto = %\" PRIu32 \") => \"\n-\t\t   \"Port = %\" PRIu32 \", \"\n-\t\t   \"Flow ID = %\" PRIu32 \" \"\n-\t\t   \"(signature = 0x%08\" PRIx32 \", \"\n-\t\t   \"entry_ptr = %p)\\n\",\n-\n-\t\t   (flow->key.key.ipv4_5tuple.ip_src >> 24) & 0xFF,\n-\t\t   (flow->key.key.ipv4_5tuple.ip_src >> 16) & 0xFF,\n-\t\t   (flow->key.key.ipv4_5tuple.ip_src >> 8) & 0xFF,\n-\t\t   flow->key.key.ipv4_5tuple.ip_src & 0xFF,\n-\n-\t\t   (flow->key.key.ipv4_5tuple.ip_dst >> 24) & 0xFF,\n-\t\t   (flow->key.key.ipv4_5tuple.ip_dst >> 16) & 0xFF,\n-\t\t   (flow->key.key.ipv4_5tuple.ip_dst >> 8) & 0xFF,\n-\t\t   flow->key.key.ipv4_5tuple.ip_dst & 0xFF,\n-\n-\t\t   flow->key.key.ipv4_5tuple.port_src,\n-\t\t   flow->key.key.ipv4_5tuple.port_dst,\n-\n-\t\t   flow->key.key.ipv4_5tuple.proto,\n-\n-\t\t   flow->port_id,\n-\t\t   flow->flow_id,\n-\t\t   flow->signature,\n-\t\t   flow->entry_ptr);\n-}\n-\n-static void\n-print_fc_ipv6_5tuple_flow(struct app_pipeline_fc_flow *flow) {\n-\tprintf(\"(SA = %02\" PRIx32 \"%02\" PRIx32 \":%02\" PRIx32 \"%02\" PRIx32\n-\t\t\":%02\" PRIx32 \"%02\" PRIx32 \":%02\" PRIx32 \"%02\" PRIx32\n-\t\t\":%02\" PRIx32 \"%02\" PRIx32 \":%02\" PRIx32 \"%02\" PRIx32\n-\t\t\":%02\" PRIx32 \"%02\" PRIx32 \":%02\" PRIx32 \"%02\" PRIx32 \", \"\n-\t\t\"DA = %02\" PRIx32 \"%02\" PRIx32 \":%02\" PRIx32 \"%02\" PRIx32\n-\t\t\":%02\" PRIx32 \"%02\" PRIx32 \":%02\" PRIx32 \"%02\" PRIx32\n-\t\t\":%02\" PRIx32 \"%02\" PRIx32 \":%02\" PRIx32 \"%02\" PRIx32\n-\t\t\":%02\" PRIx32 \"%02\" PRIx32 \":%02\" PRIx32 \"%02\" PRIx32 \", \"\n-\t\t\"SP = %\" PRIu32 \", \"\n-\t\t\"DP = %\" PRIu32 \" \"\n-\t\t\"Proto = %\" PRIu32 \" \"\n-\t\t\"=> Port = %\" PRIu32 \", \"\n-\t\t\"Flow ID = %\" PRIu32 \" \"\n-\t\t\"(signature = 0x%08\" PRIx32 \", \"\n-\t\t\"entry_ptr = %p)\\n\",\n-\n-\t\tflow->key.key.ipv6_5tuple.ip_src[0],\n-\t\tflow->key.key.ipv6_5tuple.ip_src[1],\n-\t\tflow->key.key.ipv6_5tuple.ip_src[2],\n-\t\tflow->key.key.ipv6_5tuple.ip_src[3],\n-\t\tflow->key.key.ipv6_5tuple.ip_src[4],\n-\t\tflow->key.key.ipv6_5tuple.ip_src[5],\n-\t\tflow->key.key.ipv6_5tuple.ip_src[6],\n-\t\tflow->key.key.ipv6_5tuple.ip_src[7],\n-\t\tflow->key.key.ipv6_5tuple.ip_src[8],\n-\t\tflow->key.key.ipv6_5tuple.ip_src[9],\n-\t\tflow->key.key.ipv6_5tuple.ip_src[10],\n-\t\tflow->key.key.ipv6_5tuple.ip_src[11],\n-\t\tflow->key.key.ipv6_5tuple.ip_src[12],\n-\t\tflow->key.key.ipv6_5tuple.ip_src[13],\n-\t\tflow->key.key.ipv6_5tuple.ip_src[14],\n-\t\tflow->key.key.ipv6_5tuple.ip_src[15],\n-\n-\t\tflow->key.key.ipv6_5tuple.ip_dst[0],\n-\t\tflow->key.key.ipv6_5tuple.ip_dst[1],\n-\t\tflow->key.key.ipv6_5tuple.ip_dst[2],\n-\t\tflow->key.key.ipv6_5tuple.ip_dst[3],\n-\t\tflow->key.key.ipv6_5tuple.ip_dst[4],\n-\t\tflow->key.key.ipv6_5tuple.ip_dst[5],\n-\t\tflow->key.key.ipv6_5tuple.ip_dst[6],\n-\t\tflow->key.key.ipv6_5tuple.ip_dst[7],\n-\t\tflow->key.key.ipv6_5tuple.ip_dst[8],\n-\t\tflow->key.key.ipv6_5tuple.ip_dst[9],\n-\t\tflow->key.key.ipv6_5tuple.ip_dst[10],\n-\t\tflow->key.key.ipv6_5tuple.ip_dst[11],\n-\t\tflow->key.key.ipv6_5tuple.ip_dst[12],\n-\t\tflow->key.key.ipv6_5tuple.ip_dst[13],\n-\t\tflow->key.key.ipv6_5tuple.ip_dst[14],\n-\t\tflow->key.key.ipv6_5tuple.ip_dst[15],\n-\n-\t\tflow->key.key.ipv6_5tuple.port_src,\n-\t\tflow->key.key.ipv6_5tuple.port_dst,\n-\n-\t\tflow->key.key.ipv6_5tuple.proto,\n-\n-\t\tflow->port_id,\n-\t\tflow->flow_id,\n-\t\tflow->signature,\n-\t\tflow->entry_ptr);\n-}\n-\n-static void\n-print_fc_flow(struct app_pipeline_fc_flow *flow)\n-{\n-\tswitch (flow->key.type) {\n-\tcase FLOW_KEY_QINQ:\n-\t\tprint_fc_qinq_flow(flow);\n-\t\tbreak;\n-\n-\tcase FLOW_KEY_IPV4_5TUPLE:\n-\t\tprint_fc_ipv4_5tuple_flow(flow);\n-\t\tbreak;\n-\n-\tcase FLOW_KEY_IPV6_5TUPLE:\n-\t\tprint_fc_ipv6_5tuple_flow(flow);\n-\t\tbreak;\n-\t}\n-}\n-\n-static int\n-app_pipeline_fc_ls(struct app_params *app,\n-\t\tuint32_t pipeline_id)\n-{\n-\tstruct app_pipeline_fc *p;\n-\tstruct app_pipeline_fc_flow *flow;\n-\tuint32_t i;\n-\n-\t/* Check input arguments */\n-\tif (app == NULL)\n-\t\treturn -1;\n-\n-\tp = app_pipeline_data_fe(app, pipeline_id, &pipeline_flow_classification);\n-\tif (p == NULL)\n-\t\treturn -1;\n-\n-\tfor (i = 0; i < N_BUCKETS; i++)\n-\t\tTAILQ_FOREACH(flow, &p->flows[i], node)\n-\t\t\tprint_fc_flow(flow);\n-\n-\tif (p->default_flow_present)\n-\t\tprintf(\"Default flow: port %\" PRIu32 \" (entry ptr = %p)\\n\",\n-\t\t\tp->default_flow_port_id,\n-\t\t\tp->default_flow_entry_ptr);\n-\telse\n-\t\tprintf(\"Default: DROP\\n\");\n-\n-\treturn 0;\n-}\n-/*\n- * flow\n- *\n- * flow add:\n- *    p <pipelineid> flow add qinq <svlan> <cvlan> port <portid> id <flowid>\n- *    p <pipelineid> flow add qinq bulk <file>\n- *    p <pipelineid> flow add ipv4 <sipaddr> <dipaddr> <sport> <dport> <proto> port <port ID> id <flowid>\n- *    p <pipelineid> flow add ipv4 bulk <file>\n- *    p <pipelineid> flow add ipv6 <sipaddr> <dipaddr> <sport> <dport> <proto> port <port ID> id <flowid>\n- *    p <pipelineid> flow add ipv6 bulk <file>\n- *\n- * flow add default:\n- *    p <pipelineid> flow add default <portid>\n- *\n- * flow del:\n- *    p <pipelineid> flow del qinq <svlan> <cvlan>\n- *    p <pipelineid> flow del ipv4 <sipaddr> <dipaddr> <sport> <dport> <proto>\n- *    p <pipelineid> flow del ipv6 <sipaddr> <dipaddr> <sport> <dport> <proto>\n- *\n- * flow del default:\n- *    p <pipelineid> flow del default\n- *\n- * flow ls:\n- *    p <pipelineid> flow ls\n- */\n-\n-struct cmd_flow_result {\n-\tcmdline_fixed_string_t p_string;\n-\tuint32_t pipeline_id;\n-\tcmdline_fixed_string_t flow_string;\n-\tcmdline_multi_string_t multi_string;\n-};\n-\n-static void\n-cmd_flow_parsed(void *parsed_result,\n-\t__attribute__((unused)) struct cmdline *cl,\n-\tvoid *data)\n-{\n-\tstruct cmd_flow_result *results = parsed_result;\n-\tstruct app_params *app = data;\n-\n-\tchar *tokens[16];\n-\tuint32_t n_tokens = RTE_DIM(tokens);\n-\tint status;\n-\n-\tstatus = parse_tokenize_string(results->multi_string, tokens, &n_tokens);\n-\tif (status) {\n-\t\tprintf(CMD_MSG_TOO_MANY_ARGS, \"flow\");\n-\t\treturn;\n-\t}\n-\n-\t/* flow add qinq */\n-\tif ((n_tokens >= 3) &&\n-\t\t(strcmp(tokens[0], \"add\") == 0) &&\n-\t\t(strcmp(tokens[1], \"qinq\") == 0) &&\n-\t\tstrcmp(tokens[2], \"bulk\")) {\n-\t\tstruct pipeline_fc_key key;\n-\t\tuint32_t svlan;\n-\t\tuint32_t cvlan;\n-\t\tuint32_t port_id;\n-\t\tuint32_t flow_id;\n-\n-\t\tmemset(&key, 0, sizeof(key));\n-\n-\t\tif (n_tokens != 8) {\n-\t\t\tprintf(CMD_MSG_MISMATCH_ARGS, \"flow add qinq\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (parser_read_uint32(&svlan, tokens[2]) != 0) {\n-\t\t\tprintf(CMD_MSG_INVALID_ARG, \"svlan\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (parser_read_uint32(&cvlan, tokens[3]) != 0) {\n-\t\t\tprintf(CMD_MSG_INVALID_ARG, \"cvlan\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (strcmp(tokens[4], \"port\") != 0) {\n-\t\t\tprintf(CMD_MSG_ARG_NOT_FOUND, \"port\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (parser_read_uint32(&port_id, tokens[5]) != 0) {\n-\t\t\tprintf(CMD_MSG_INVALID_ARG, \"portid\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (strcmp(tokens[6], \"id\") != 0) {\n-\t\t\tprintf(CMD_MSG_ARG_NOT_FOUND, \"id\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (parser_read_uint32(&flow_id, tokens[7]) != 0) {\n-\t\t\tprintf(CMD_MSG_INVALID_ARG, \"flowid\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tkey.type = FLOW_KEY_QINQ;\n-\t\tkey.key.qinq.svlan = svlan;\n-\t\tkey.key.qinq.cvlan = cvlan;\n-\n-\t\tstatus = app_pipeline_fc_add(app,\n-\t\t\tresults->pipeline_id,\n-\t\t\t&key,\n-\t\t\tport_id,\n-\t\t\tflow_id);\n-\t\tif (status)\n-\t\t\tprintf(CMD_MSG_FAIL, \"flow add qinq\");\n-\n-\t\treturn;\n-\t} /* flow add qinq */\n-\n-\t/* flow add ipv4 */\n-\tif ((n_tokens >= 3) &&\n-\t\t(strcmp(tokens[0], \"add\") == 0) &&\n-\t\t(strcmp(tokens[1], \"ipv4\") == 0) &&\n-\t\tstrcmp(tokens[2], \"bulk\")) {\n-\t\tstruct pipeline_fc_key key;\n-\t\tstruct in_addr sipaddr;\n-\t\tstruct in_addr dipaddr;\n-\t\tuint32_t sport;\n-\t\tuint32_t dport;\n-\t\tuint32_t proto;\n-\t\tuint32_t port_id;\n-\t\tuint32_t flow_id;\n-\n-\t\tmemset(&key, 0, sizeof(key));\n-\n-\t\tif (n_tokens != 11) {\n-\t\t\tprintf(CMD_MSG_MISMATCH_ARGS, \"flow add ipv4\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (parse_ipv4_addr(tokens[2], &sipaddr) != 0) {\n-\t\t\tprintf(CMD_MSG_INVALID_ARG, \"sipv4addr\");\n-\t\t\treturn;\n-\t\t}\n-\t\tif (parse_ipv4_addr(tokens[3], &dipaddr) != 0) {\n-\t\t\tprintf(CMD_MSG_INVALID_ARG, \"dipv4addr\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (parser_read_uint32(&sport, tokens[4]) != 0) {\n-\t\t\tprintf(CMD_MSG_INVALID_ARG, \"sport\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (parser_read_uint32(&dport, tokens[5]) != 0) {\n-\t\t\tprintf(CMD_MSG_INVALID_ARG, \"dport\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (parser_read_uint32(&proto, tokens[6]) != 0) {\n-\t\t\tprintf(CMD_MSG_INVALID_ARG, \"proto\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (strcmp(tokens[7], \"port\") != 0) {\n-\t\t\tprintf(CMD_MSG_ARG_NOT_FOUND, \"port\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (parser_read_uint32(&port_id, tokens[8]) != 0) {\n-\t\t\tprintf(CMD_MSG_INVALID_ARG, \"portid\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (strcmp(tokens[9], \"id\") != 0) {\n-\t\t\tprintf(CMD_MSG_ARG_NOT_FOUND, \"id\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (parser_read_uint32(&flow_id, tokens[10]) != 0) {\n-\t\t\tprintf(CMD_MSG_INVALID_ARG, \"flowid\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tkey.type = FLOW_KEY_IPV4_5TUPLE;\n-\t\tkey.key.ipv4_5tuple.ip_src = rte_be_to_cpu_32(sipaddr.s_addr);\n-\t\tkey.key.ipv4_5tuple.ip_dst = rte_be_to_cpu_32(dipaddr.s_addr);\n-\t\tkey.key.ipv4_5tuple.port_src = sport;\n-\t\tkey.key.ipv4_5tuple.port_dst = dport;\n-\t\tkey.key.ipv4_5tuple.proto = proto;\n-\n-\t\tstatus = app_pipeline_fc_add(app,\n-\t\t\tresults->pipeline_id,\n-\t\t\t&key,\n-\t\t\tport_id,\n-\t\t\tflow_id);\n-\t\tif (status)\n-\t\t\tprintf(CMD_MSG_FAIL, \"flow add ipv4\");\n-\n-\t\treturn;\n-\t} /* flow add ipv4 */\n-\n-\t/* flow add ipv6 */\n-\tif ((n_tokens >= 3) &&\n-\t\t(strcmp(tokens[0], \"add\") == 0) &&\n-\t\t(strcmp(tokens[1], \"ipv6\") == 0) &&\n-\t\tstrcmp(tokens[2], \"bulk\")) {\n-\t\tstruct pipeline_fc_key key;\n-\t\tstruct in6_addr sipaddr;\n-\t\tstruct in6_addr dipaddr;\n-\t\tuint32_t sport;\n-\t\tuint32_t dport;\n-\t\tuint32_t proto;\n-\t\tuint32_t port_id;\n-\t\tuint32_t flow_id;\n-\n-\t\tmemset(&key, 0, sizeof(key));\n-\n-\t\tif (n_tokens != 11) {\n-\t\t\tprintf(CMD_MSG_MISMATCH_ARGS, \"flow add ipv6\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (parse_ipv6_addr(tokens[2], &sipaddr) != 0) {\n-\t\t\tprintf(CMD_MSG_INVALID_ARG, \"sipv6addr\");\n-\t\t\treturn;\n-\t\t}\n-\t\tif (parse_ipv6_addr(tokens[3], &dipaddr) != 0) {\n-\t\t\tprintf(CMD_MSG_INVALID_ARG, \"dipv6addr\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (parser_read_uint32(&sport, tokens[4]) != 0) {\n-\t\t\tprintf(CMD_MSG_INVALID_ARG, \"sport\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (parser_read_uint32(&dport, tokens[5]) != 0) {\n-\t\t\tprintf(CMD_MSG_INVALID_ARG, \"dport\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (parser_read_uint32(&proto, tokens[6]) != 0) {\n-\t\t\tprintf(CMD_MSG_INVALID_ARG, \"proto\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (strcmp(tokens[7], \"port\") != 0) {\n-\t\t\tprintf(CMD_MSG_ARG_NOT_FOUND, \"port\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (parser_read_uint32(&port_id, tokens[8]) != 0) {\n-\t\t\tprintf(CMD_MSG_INVALID_ARG, \"portid\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (strcmp(tokens[9], \"id\") != 0) {\n-\t\t\tprintf(CMD_MSG_ARG_NOT_FOUND, \"id\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (parser_read_uint32(&flow_id, tokens[10]) != 0) {\n-\t\t\tprintf(CMD_MSG_INVALID_ARG, \"flowid\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tkey.type = FLOW_KEY_IPV6_5TUPLE;\n-\t\tmemcpy(key.key.ipv6_5tuple.ip_src, (void *)&sipaddr, 16);\n-\t\tmemcpy(key.key.ipv6_5tuple.ip_dst, (void *)&dipaddr, 16);\n-\t\tkey.key.ipv6_5tuple.port_src = sport;\n-\t\tkey.key.ipv6_5tuple.port_dst = dport;\n-\t\tkey.key.ipv6_5tuple.proto = proto;\n-\n-\t\tstatus = app_pipeline_fc_add(app,\n-\t\t\tresults->pipeline_id,\n-\t\t\t&key,\n-\t\t\tport_id,\n-\t\t\tflow_id);\n-\t\tif (status)\n-\t\t\tprintf(CMD_MSG_FAIL, \"flow add ipv6\");\n-\n-\t\treturn;\n-\t} /* flow add ipv6 */\n-\n-\t/* flow add qinq bulk */\n-\tif ((n_tokens >= 3) &&\n-\t\t(strcmp(tokens[0], \"add\") == 0) &&\n-\t\t(strcmp(tokens[1], \"qinq\") == 0) &&\n-\t\t(strcmp(tokens[2], \"bulk\") == 0)) {\n-\t\tstruct pipeline_fc_key *keys;\n-\t\tuint32_t *port_ids, *flow_ids, n_keys, line;\n-\t\tchar *filename;\n-\n-\t\tif (n_tokens != 4) {\n-\t\t\tprintf(CMD_MSG_MISMATCH_ARGS, \"flow add qinq bulk\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tfilename = tokens[3];\n-\n-\t\tn_keys = APP_PIPELINE_FC_MAX_FLOWS_IN_FILE;\n-\t\tkeys = malloc(n_keys * sizeof(struct pipeline_fc_key));\n-\t\tif (keys == NULL)\n-\t\t\treturn;\n-\t\tmemset(keys, 0, n_keys * sizeof(struct pipeline_fc_key));\n-\n-\t\tport_ids = malloc(n_keys * sizeof(uint32_t));\n-\t\tif (port_ids == NULL) {\n-\t\t\tfree(keys);\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tflow_ids = malloc(n_keys * sizeof(uint32_t));\n-\t\tif (flow_ids == NULL) {\n-\t\t\tfree(port_ids);\n-\t\t\tfree(keys);\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tstatus = app_pipeline_fc_load_file_qinq(filename,\n-\t\t\tkeys,\n-\t\t\tport_ids,\n-\t\t\tflow_ids,\n-\t\t\t&n_keys,\n-\t\t\t&line);\n-\t\tif (status != 0) {\n-\t\t\tprintf(CMD_MSG_FILE_ERR, filename, line);\n-\t\t\tfree(flow_ids);\n-\t\t\tfree(port_ids);\n-\t\t\tfree(keys);\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tstatus = app_pipeline_fc_add_bulk(app,\n-\t\t\tresults->pipeline_id,\n-\t\t\tkeys,\n-\t\t\tport_ids,\n-\t\t\tflow_ids,\n-\t\t\tn_keys);\n-\t\tif (status)\n-\t\t\tprintf(CMD_MSG_FAIL, \"flow add qinq bulk\");\n-\n-\t\tfree(flow_ids);\n-\t\tfree(port_ids);\n-\t\tfree(keys);\n-\t\treturn;\n-\t} /* flow add qinq bulk */\n-\n-\t/* flow add ipv4 bulk */\n-\tif ((n_tokens >= 3) &&\n-\t\t(strcmp(tokens[0], \"add\") == 0) &&\n-\t\t(strcmp(tokens[1], \"ipv4\") == 0) &&\n-\t\t(strcmp(tokens[2], \"bulk\") == 0)) {\n-\t\tstruct pipeline_fc_key *keys;\n-\t\tuint32_t *port_ids, *flow_ids, n_keys, line;\n-\t\tchar *filename;\n-\n-\t\tif (n_tokens != 4) {\n-\t\t\tprintf(CMD_MSG_MISMATCH_ARGS, \"flow add ipv4 bulk\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tfilename = tokens[3];\n-\n-\t\tn_keys = APP_PIPELINE_FC_MAX_FLOWS_IN_FILE;\n-\t\tkeys = malloc(n_keys * sizeof(struct pipeline_fc_key));\n-\t\tif (keys == NULL)\n-\t\t\treturn;\n-\t\tmemset(keys, 0, n_keys * sizeof(struct pipeline_fc_key));\n-\n-\t\tport_ids = malloc(n_keys * sizeof(uint32_t));\n-\t\tif (port_ids == NULL) {\n-\t\t\tfree(keys);\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tflow_ids = malloc(n_keys * sizeof(uint32_t));\n-\t\tif (flow_ids == NULL) {\n-\t\t\tfree(port_ids);\n-\t\t\tfree(keys);\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tstatus = app_pipeline_fc_load_file_ipv4(filename,\n-\t\t\tkeys,\n-\t\t\tport_ids,\n-\t\t\tflow_ids,\n-\t\t\t&n_keys,\n-\t\t\t&line);\n-\t\tif (status != 0) {\n-\t\t\tprintf(CMD_MSG_FILE_ERR, filename, line);\n-\t\t\tfree(flow_ids);\n-\t\t\tfree(port_ids);\n-\t\t\tfree(keys);\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tstatus = app_pipeline_fc_add_bulk(app,\n-\t\t\tresults->pipeline_id,\n-\t\t\tkeys,\n-\t\t\tport_ids,\n-\t\t\tflow_ids,\n-\t\t\tn_keys);\n-\t\tif (status)\n-\t\t\tprintf(CMD_MSG_FAIL, \"flow add ipv4 bulk\");\n-\n-\t\tfree(flow_ids);\n-\t\tfree(port_ids);\n-\t\tfree(keys);\n-\t\treturn;\n-\t} /* flow add ipv4 bulk */\n-\n-\t/* flow add ipv6 bulk */\n-\tif ((n_tokens >= 3) &&\n-\t\t(strcmp(tokens[0], \"add\") == 0) &&\n-\t\t(strcmp(tokens[1], \"ipv6\") == 0) &&\n-\t\t(strcmp(tokens[2], \"bulk\") == 0)) {\n-\t\tstruct pipeline_fc_key *keys;\n-\t\tuint32_t *port_ids, *flow_ids, n_keys, line;\n-\t\tchar *filename;\n-\n-\t\tif (n_tokens != 4) {\n-\t\t\tprintf(CMD_MSG_MISMATCH_ARGS, \"flow add ipv6 bulk\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tfilename = tokens[3];\n-\n-\t\tn_keys = APP_PIPELINE_FC_MAX_FLOWS_IN_FILE;\n-\t\tkeys = malloc(n_keys * sizeof(struct pipeline_fc_key));\n-\t\tif (keys == NULL)\n-\t\t\treturn;\n-\t\tmemset(keys, 0, n_keys * sizeof(struct pipeline_fc_key));\n-\n-\t\tport_ids = malloc(n_keys * sizeof(uint32_t));\n-\t\tif (port_ids == NULL) {\n-\t\t\tfree(keys);\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tflow_ids = malloc(n_keys * sizeof(uint32_t));\n-\t\tif (flow_ids == NULL) {\n-\t\t\tfree(port_ids);\n-\t\t\tfree(keys);\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tstatus = app_pipeline_fc_load_file_ipv6(filename,\n-\t\t\tkeys,\n-\t\t\tport_ids,\n-\t\t\tflow_ids,\n-\t\t\t&n_keys,\n-\t\t\t&line);\n-\t\tif (status != 0) {\n-\t\t\tprintf(CMD_MSG_FILE_ERR, filename, line);\n-\t\t\tfree(flow_ids);\n-\t\t\tfree(port_ids);\n-\t\t\tfree(keys);\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tstatus = app_pipeline_fc_add_bulk(app,\n-\t\t\tresults->pipeline_id,\n-\t\t\tkeys,\n-\t\t\tport_ids,\n-\t\t\tflow_ids,\n-\t\t\tn_keys);\n-\t\tif (status)\n-\t\t\tprintf(CMD_MSG_FAIL, \"flow add ipv6 bulk\");\n-\n-\t\tfree(flow_ids);\n-\t\tfree(port_ids);\n-\t\tfree(keys);\n-\t\treturn;\n-\t} /* flow add ipv6 bulk */\n-\n-\t/* flow add default*/\n-\tif ((n_tokens >= 2) &&\n-\t\t(strcmp(tokens[0], \"add\") == 0) &&\n-\t\t(strcmp(tokens[1], \"default\") == 0)) {\n-\t\tuint32_t port_id;\n-\n-\t\tif (n_tokens != 3) {\n-\t\t\tprintf(CMD_MSG_MISMATCH_ARGS, \"flow add default\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (parser_read_uint32(&port_id, tokens[2]) != 0) {\n-\t\t\tprintf(CMD_MSG_INVALID_ARG, \"portid\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tstatus = app_pipeline_fc_add_default(app,\n-\t\t\tresults->pipeline_id,\n-\t\t\tport_id);\n-\t\tif (status)\n-\t\t\tprintf(CMD_MSG_FAIL, \"flow add default\");\n-\n-\t\treturn;\n-\t} /* flow add default */\n-\n-\t/* flow del qinq */\n-\tif ((n_tokens >= 2) &&\n-\t\t(strcmp(tokens[0], \"del\") == 0) &&\n-\t\t(strcmp(tokens[1], \"qinq\") == 0)) {\n-\t\tstruct pipeline_fc_key key;\n-\t\tuint32_t svlan;\n-\t\tuint32_t cvlan;\n-\n-\t\tmemset(&key, 0, sizeof(key));\n-\n-\t\tif (n_tokens != 4) {\n-\t\t\tprintf(CMD_MSG_MISMATCH_ARGS, \"flow del qinq\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (parser_read_uint32(&svlan, tokens[2]) != 0) {\n-\t\t\tprintf(CMD_MSG_INVALID_ARG, \"svlan\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (parser_read_uint32(&cvlan, tokens[3]) != 0) {\n-\t\t\tprintf(CMD_MSG_INVALID_ARG, \"cvlan\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tkey.type = FLOW_KEY_QINQ;\n-\t\tkey.key.qinq.svlan = svlan;\n-\t\tkey.key.qinq.cvlan = cvlan;\n-\n-\t\tstatus = app_pipeline_fc_del(app,\n-\t\t\tresults->pipeline_id,\n-\t\t\t&key);\n-\t\tif (status)\n-\t\t\tprintf(CMD_MSG_FAIL, \"flow del qinq\");\n-\n-\t\treturn;\n-\t} /* flow del qinq */\n-\n-\t/* flow del ipv4 */\n-\tif ((n_tokens >= 2) &&\n-\t\t(strcmp(tokens[0], \"del\") == 0) &&\n-\t\t(strcmp(tokens[1], \"ipv4\") == 0)) {\n-\t\tstruct pipeline_fc_key key;\n-\t\tstruct in_addr sipaddr;\n-\t\tstruct in_addr dipaddr;\n-\t\tuint32_t sport;\n-\t\tuint32_t dport;\n-\t\tuint32_t proto;\n-\n-\t\tmemset(&key, 0, sizeof(key));\n-\n-\t\tif (n_tokens != 7) {\n-\t\t\tprintf(CMD_MSG_MISMATCH_ARGS, \"flow del ipv4\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (parse_ipv4_addr(tokens[2], &sipaddr) != 0) {\n-\t\t\tprintf(CMD_MSG_INVALID_ARG, \"sipv4addr\");\n-\t\t\treturn;\n-\t\t}\n-\t\tif (parse_ipv4_addr(tokens[3], &dipaddr) != 0) {\n-\t\t\tprintf(CMD_MSG_INVALID_ARG, \"dipv4addr\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (parser_read_uint32(&sport, tokens[4]) != 0) {\n-\t\t\tprintf(CMD_MSG_INVALID_ARG, \"sport\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (parser_read_uint32(&dport, tokens[5]) != 0) {\n-\t\t\tprintf(CMD_MSG_INVALID_ARG, \"dport\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (parser_read_uint32(&proto, tokens[6]) != 0) {\n-\t\t\tprintf(CMD_MSG_INVALID_ARG, \"proto\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tkey.type = FLOW_KEY_IPV4_5TUPLE;\n-\t\tkey.key.ipv4_5tuple.ip_src = rte_be_to_cpu_32(sipaddr.s_addr);\n-\t\tkey.key.ipv4_5tuple.ip_dst = rte_be_to_cpu_32(dipaddr.s_addr);\n-\t\tkey.key.ipv4_5tuple.port_src = sport;\n-\t\tkey.key.ipv4_5tuple.port_dst = dport;\n-\t\tkey.key.ipv4_5tuple.proto = proto;\n-\n-\t\tstatus = app_pipeline_fc_del(app,\n-\t\t\tresults->pipeline_id,\n-\t\t\t&key);\n-\t\tif (status)\n-\t\t\tprintf(CMD_MSG_FAIL, \"flow del ipv4\");\n-\n-\t\treturn;\n-\t} /* flow del ipv4 */\n-\n-\t/* flow del ipv6 */\n-\tif ((n_tokens >= 2) &&\n-\t\t(strcmp(tokens[0], \"del\") == 0) &&\n-\t\t(strcmp(tokens[1], \"ipv6\") == 0)) {\n-\t\tstruct pipeline_fc_key key;\n-\t\tstruct in6_addr sipaddr;\n-\t\tstruct in6_addr dipaddr;\n-\t\tuint32_t sport;\n-\t\tuint32_t dport;\n-\t\tuint32_t proto;\n-\n-\t\tmemset(&key, 0, sizeof(key));\n-\n-\t\tif (n_tokens != 7) {\n-\t\t\tprintf(CMD_MSG_MISMATCH_ARGS, \"flow del ipv6\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (parse_ipv6_addr(tokens[2], &sipaddr) != 0) {\n-\t\t\tprintf(CMD_MSG_INVALID_ARG, \"sipv6addr\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (parse_ipv6_addr(tokens[3], &dipaddr) != 0) {\n-\t\t\tprintf(CMD_MSG_INVALID_ARG, \"dipv6addr\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (parser_read_uint32(&sport, tokens[4]) != 0) {\n-\t\t\tprintf(CMD_MSG_INVALID_ARG, \"sport\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (parser_read_uint32(&dport, tokens[5]) != 0) {\n-\t\t\tprintf(CMD_MSG_INVALID_ARG, \"dport\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tif (parser_read_uint32(&proto, tokens[6]) != 0) {\n-\t\t\tprintf(CMD_MSG_INVALID_ARG, \"proto\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tkey.type = FLOW_KEY_IPV6_5TUPLE;\n-\t\tmemcpy(key.key.ipv6_5tuple.ip_src, &sipaddr, 16);\n-\t\tmemcpy(key.key.ipv6_5tuple.ip_dst, &dipaddr, 16);\n-\t\tkey.key.ipv6_5tuple.port_src = sport;\n-\t\tkey.key.ipv6_5tuple.port_dst = dport;\n-\t\tkey.key.ipv6_5tuple.proto = proto;\n-\n-\t\tstatus = app_pipeline_fc_del(app,\n-\t\t\tresults->pipeline_id,\n-\t\t\t&key);\n-\t\tif (status)\n-\t\t\tprintf(CMD_MSG_FAIL, \"flow del ipv6\");\n-\n-\t\treturn;\n-\t} /* flow del ipv6 */\n-\n-\t/* flow del default*/\n-\tif ((n_tokens >= 2) &&\n-\t\t(strcmp(tokens[0], \"del\") == 0) &&\n-\t\t(strcmp(tokens[1], \"default\") == 0)) {\n-\t\tif (n_tokens != 2) {\n-\t\t\tprintf(CMD_MSG_MISMATCH_ARGS, \"flow del default\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tstatus = app_pipeline_fc_del_default(app,\n-\t\t\tresults->pipeline_id);\n-\t\tif (status)\n-\t\t\tprintf(CMD_MSG_FAIL, \"flow del default\");\n-\n-\t\treturn;\n-\t} /* flow del default */\n-\n-\t/* flow ls */\n-\tif ((n_tokens >= 1) && (strcmp(tokens[0], \"ls\") == 0)) {\n-\t\tif (n_tokens != 1) {\n-\t\t\tprintf(CMD_MSG_MISMATCH_ARGS, \"flow ls\");\n-\t\t\treturn;\n-\t\t}\n-\n-\t\tstatus = app_pipeline_fc_ls(app, results->pipeline_id);\n-\t\tif (status)\n-\t\t\tprintf(CMD_MSG_FAIL, \"flow ls\");\n-\n-\t\treturn;\n-\t} /* flow ls */\n-\n-\tprintf(CMD_MSG_MISMATCH_ARGS, \"flow\");\n-}\n-\n-static cmdline_parse_token_string_t cmd_flow_p_string =\n-\tTOKEN_STRING_INITIALIZER(struct cmd_flow_result, p_string, \"p\");\n-\n-static cmdline_parse_token_num_t cmd_flow_pipeline_id =\n-\tTOKEN_NUM_INITIALIZER(struct cmd_flow_result, pipeline_id, UINT32);\n-\n-static cmdline_parse_token_string_t cmd_flow_flow_string =\n-\tTOKEN_STRING_INITIALIZER(struct cmd_flow_result, flow_string, \"flow\");\n-\n-static cmdline_parse_token_string_t cmd_flow_multi_string =\n-\tTOKEN_STRING_INITIALIZER(struct cmd_flow_result, multi_string,\n-\t\tTOKEN_STRING_MULTI);\n-\n-static cmdline_parse_inst_t cmd_flow = {\n-\t.f = cmd_flow_parsed,\n-\t.data = NULL,\n-\t.help_str = \"flow add / add bulk / add default / del / del default / ls\",\n-\t.tokens = {\n-\t\t(void *) &cmd_flow_p_string,\n-\t\t(void *) &cmd_flow_pipeline_id,\n-\t\t(void *) &cmd_flow_flow_string,\n-\t\t(void *) &cmd_flow_multi_string,\n-\t\tNULL,\n-\t},\n-};\n-\n-static cmdline_parse_ctx_t pipeline_cmds[] = {\n-\t(cmdline_parse_inst_t *) &cmd_flow,\n-\tNULL,\n-};\n-\n-static struct pipeline_fe_ops pipeline_flow_classification_fe_ops = {\n-\t.f_init = app_pipeline_fc_init,\n-\t.f_post_init = NULL,\n-\t.f_free = app_pipeline_fc_free,\n-\t.f_track = app_pipeline_track_default,\n-\t.cmds = pipeline_cmds,\n-};\n-\n-struct pipeline_type pipeline_flow_classification = {\n-\t.name = \"FLOW_CLASSIFICATION\",\n-\t.be_ops = &pipeline_flow_classification_be_ops,\n-\t.fe_ops = &pipeline_flow_classification_fe_ops,\n-};\ndiff --git a/examples/ip_pipeline/pipeline/pipeline_flow_classification.h b/examples/ip_pipeline/pipeline/pipeline_flow_classification.h\ndeleted file mode 100644\nindex 8c35498..0000000\n--- a/examples/ip_pipeline/pipeline/pipeline_flow_classification.h\n+++ /dev/null\n@@ -1,106 +0,0 @@\n-/* SPDX-License-Identifier: BSD-3-Clause\n- * Copyright(c) 2010-2015 Intel Corporation\n- */\n-\n-#ifndef __INCLUDE_PIPELINE_FLOW_CLASSIFICATION_H__\n-#define __INCLUDE_PIPELINE_FLOW_CLASSIFICATION_H__\n-\n-#include \"pipeline.h\"\n-#include \"pipeline_flow_classification_be.h\"\n-\n-enum flow_key_type {\n-\tFLOW_KEY_QINQ,\n-\tFLOW_KEY_IPV4_5TUPLE,\n-\tFLOW_KEY_IPV6_5TUPLE,\n-};\n-\n-struct flow_key_qinq {\n-\tuint16_t svlan;\n-\tuint16_t cvlan;\n-};\n-\n-struct flow_key_ipv4_5tuple {\n-\tuint32_t ip_src;\n-\tuint32_t ip_dst;\n-\tuint16_t port_src;\n-\tuint16_t port_dst;\n-\tuint32_t proto;\n-};\n-\n-struct flow_key_ipv6_5tuple {\n-\tuint8_t ip_src[16];\n-\tuint8_t ip_dst[16];\n-\tuint16_t port_src;\n-\tuint16_t port_dst;\n-\tuint32_t proto;\n-};\n-\n-struct pipeline_fc_key {\n-\tenum flow_key_type type;\n-\tunion {\n-\t\tstruct flow_key_qinq qinq;\n-\t\tstruct flow_key_ipv4_5tuple ipv4_5tuple;\n-\t\tstruct flow_key_ipv6_5tuple ipv6_5tuple;\n-\t} key;\n-};\n-\n-int\n-app_pipeline_fc_add(struct app_params *app,\n-\tuint32_t pipeline_id,\n-\tstruct pipeline_fc_key *key,\n-\tuint32_t port_id,\n-\tuint32_t flow_id);\n-\n-int\n-app_pipeline_fc_add_bulk(struct app_params *app,\n-\tuint32_t pipeline_id,\n-\tstruct pipeline_fc_key *key,\n-\tuint32_t *port_id,\n-\tuint32_t *flow_id,\n-\tuint32_t n_keys);\n-\n-int\n-app_pipeline_fc_del(struct app_params *app,\n-\tuint32_t pipeline_id,\n-\tstruct pipeline_fc_key *key);\n-\n-int\n-app_pipeline_fc_add_default(struct app_params *app,\n-\tuint32_t pipeline_id,\n-\tuint32_t port_id);\n-\n-int\n-app_pipeline_fc_del_default(struct app_params *app,\n-\tuint32_t pipeline_id);\n-\n-#ifndef APP_PIPELINE_FC_MAX_FLOWS_IN_FILE\n-#define APP_PIPELINE_FC_MAX_FLOWS_IN_FILE\t(16 * 1024 * 1024)\n-#endif\n-\n-int\n-app_pipeline_fc_load_file_qinq(char *filename,\n-\tstruct pipeline_fc_key *keys,\n-\tuint32_t *port_ids,\n-\tuint32_t *flow_ids,\n-\tuint32_t *n_keys,\n-\tuint32_t *line);\n-\n-int\n-app_pipeline_fc_load_file_ipv4(char *filename,\n-\tstruct pipeline_fc_key *keys,\n-\tuint32_t *port_ids,\n-\tuint32_t *flow_ids,\n-\tuint32_t *n_keys,\n-\tuint32_t *line);\n-\n-int\n-app_pipeline_fc_load_file_ipv6(char *filename,\n-\tstruct pipeline_fc_key *keys,\n-\tuint32_t *port_ids,\n-\tuint32_t *flow_ids,\n-\tuint32_t *n_keys,\n-\tuint32_t *line);\n-\n-extern struct pipeline_type pipeline_flow_classification;\n-\n-#endif\ndiff --git a/examples/ip_pipeline/pipeline/pipeline_flow_classification_be.c b/examples/ip_pipeline/pipeline/pipeline_flow_classification_be.c\ndeleted file mode 100644\nindex 097ec34..0000000\n--- a/examples/ip_pipeline/pipeline/pipeline_flow_classification_be.c\n+++ /dev/null\n@@ -1,723 +0,0 @@\n-/* SPDX-License-Identifier: BSD-3-Clause\n- * Copyright(c) 2010-2016 Intel Corporation\n- */\n-\n-#include <string.h>\n-\n-#include <rte_common.h>\n-#include <rte_malloc.h>\n-#include <rte_table_hash.h>\n-#include <rte_byteorder.h>\n-#include <pipeline.h>\n-\n-#include \"pipeline_flow_classification_be.h\"\n-#include \"pipeline_actions_common.h\"\n-#include \"parser.h\"\n-#include \"hash_func.h\"\n-\n-struct pipeline_flow_classification {\n-\tstruct pipeline p;\n-\tpipeline_msg_req_handler custom_handlers[PIPELINE_FC_MSG_REQS];\n-\n-\tuint32_t n_flows;\n-\tuint32_t key_size;\n-\tuint32_t flow_id;\n-\n-\tuint32_t key_offset;\n-\tuint32_t hash_offset;\n-\tuint8_t key_mask[PIPELINE_FC_FLOW_KEY_MAX_SIZE];\n-\tuint32_t key_mask_present;\n-\tuint32_t flow_id_offset;\n-\n-} __rte_cache_aligned;\n-\n-static void *\n-pipeline_fc_msg_req_custom_handler(struct pipeline *p, void *msg);\n-\n-static pipeline_msg_req_handler handlers[] = {\n-\t[PIPELINE_MSG_REQ_PING] =\n-\t\tpipeline_msg_req_ping_handler,\n-\t[PIPELINE_MSG_REQ_STATS_PORT_IN] =\n-\t\tpipeline_msg_req_stats_port_in_handler,\n-\t[PIPELINE_MSG_REQ_STATS_PORT_OUT] =\n-\t\tpipeline_msg_req_stats_port_out_handler,\n-\t[PIPELINE_MSG_REQ_STATS_TABLE] =\n-\t\tpipeline_msg_req_stats_table_handler,\n-\t[PIPELINE_MSG_REQ_PORT_IN_ENABLE] =\n-\t\tpipeline_msg_req_port_in_enable_handler,\n-\t[PIPELINE_MSG_REQ_PORT_IN_DISABLE] =\n-\t\tpipeline_msg_req_port_in_disable_handler,\n-\t[PIPELINE_MSG_REQ_CUSTOM] =\n-\t\tpipeline_fc_msg_req_custom_handler,\n-};\n-\n-static void *\n-pipeline_fc_msg_req_add_handler(struct pipeline *p, void *msg);\n-\n-static void *\n-pipeline_fc_msg_req_add_bulk_handler(struct pipeline *p, void *msg);\n-\n-static void *\n-pipeline_fc_msg_req_del_handler(struct pipeline *p, void *msg);\n-\n-static void *\n-pipeline_fc_msg_req_add_default_handler(struct pipeline *p, void *msg);\n-\n-static void *\n-pipeline_fc_msg_req_del_default_handler(struct pipeline *p, void *msg);\n-\n-static pipeline_msg_req_handler custom_handlers[] = {\n-\t[PIPELINE_FC_MSG_REQ_FLOW_ADD] =\n-\t\tpipeline_fc_msg_req_add_handler,\n-\t[PIPELINE_FC_MSG_REQ_FLOW_ADD_BULK] =\n-\t\tpipeline_fc_msg_req_add_bulk_handler,\n-\t[PIPELINE_FC_MSG_REQ_FLOW_DEL] =\n-\t\tpipeline_fc_msg_req_del_handler,\n-\t[PIPELINE_FC_MSG_REQ_FLOW_ADD_DEFAULT] =\n-\t\tpipeline_fc_msg_req_add_default_handler,\n-\t[PIPELINE_FC_MSG_REQ_FLOW_DEL_DEFAULT] =\n-\t\tpipeline_fc_msg_req_del_default_handler,\n-};\n-\n-/*\n- * Flow table\n- */\n-struct flow_table_entry {\n-\tstruct rte_pipeline_table_entry head;\n-\n-\tuint32_t flow_id;\n-\tuint32_t pad;\n-};\n-\n-rte_table_hash_op_hash hash_func[] = {\n-\thash_default_key8,\n-\thash_default_key16,\n-\thash_default_key24,\n-\thash_default_key32,\n-\thash_default_key40,\n-\thash_default_key48,\n-\thash_default_key56,\n-\thash_default_key64\n-};\n-\n-/*\n- * Flow table AH - Write flow_id to packet meta-data\n- */\n-static inline void\n-pkt_work_flow_id(\n-\tstruct rte_mbuf *pkt,\n-\tstruct rte_pipeline_table_entry *table_entry,\n-\tvoid *arg)\n-{\n-\tstruct pipeline_flow_classification *p_fc = arg;\n-\tuint32_t *flow_id_ptr =\n-\t\tRTE_MBUF_METADATA_UINT32_PTR(pkt, p_fc->flow_id_offset);\n-\tstruct flow_table_entry *entry =\n-\t\t(struct flow_table_entry *) table_entry;\n-\n-\t/* Read */\n-\tuint32_t flow_id = entry->flow_id;\n-\n-\t/* Compute */\n-\n-\t/* Write */\n-\t*flow_id_ptr = flow_id;\n-}\n-\n-static inline void\n-pkt4_work_flow_id(\n-\tstruct rte_mbuf **pkts,\n-\tstruct rte_pipeline_table_entry **table_entries,\n-\tvoid *arg)\n-{\n-\tstruct pipeline_flow_classification *p_fc = arg;\n-\n-\tuint32_t *flow_id_ptr0 =\n-\t\tRTE_MBUF_METADATA_UINT32_PTR(pkts[0], p_fc->flow_id_offset);\n-\tuint32_t *flow_id_ptr1 =\n-\t\tRTE_MBUF_METADATA_UINT32_PTR(pkts[1], p_fc->flow_id_offset);\n-\tuint32_t *flow_id_ptr2 =\n-\t\tRTE_MBUF_METADATA_UINT32_PTR(pkts[2], p_fc->flow_id_offset);\n-\tuint32_t *flow_id_ptr3 =\n-\t\tRTE_MBUF_METADATA_UINT32_PTR(pkts[3], p_fc->flow_id_offset);\n-\n-\tstruct flow_table_entry *entry0 =\n-\t\t(struct flow_table_entry *) table_entries[0];\n-\tstruct flow_table_entry *entry1 =\n-\t\t(struct flow_table_entry *) table_entries[1];\n-\tstruct flow_table_entry *entry2 =\n-\t\t(struct flow_table_entry *) table_entries[2];\n-\tstruct flow_table_entry *entry3 =\n-\t\t(struct flow_table_entry *) table_entries[3];\n-\n-\t/* Read */\n-\tuint32_t flow_id0 = entry0->flow_id;\n-\tuint32_t flow_id1 = entry1->flow_id;\n-\tuint32_t flow_id2 = entry2->flow_id;\n-\tuint32_t flow_id3 = entry3->flow_id;\n-\n-\t/* Compute */\n-\n-\t/* Write */\n-\t*flow_id_ptr0 = flow_id0;\n-\t*flow_id_ptr1 = flow_id1;\n-\t*flow_id_ptr2 = flow_id2;\n-\t*flow_id_ptr3 = flow_id3;\n-}\n-\n-PIPELINE_TABLE_AH_HIT(fc_table_ah_hit,\n-\t\tpkt_work_flow_id, pkt4_work_flow_id);\n-\n-static rte_pipeline_table_action_handler_hit\n-get_fc_table_ah_hit(struct pipeline_flow_classification *p)\n-{\n-\tif (p->flow_id)\n-\t\treturn fc_table_ah_hit;\n-\n-\treturn NULL;\n-}\n-\n-/*\n- * Argument parsing\n- */\n-static int\n-pipeline_fc_parse_args(struct pipeline_flow_classification *p,\n-\tstruct pipeline_params *params)\n-{\n-\tuint32_t n_flows_present = 0;\n-\tuint32_t key_offset_present = 0;\n-\tuint32_t key_size_present = 0;\n-\tuint32_t hash_offset_present = 0;\n-\tuint32_t key_mask_present = 0;\n-\tuint32_t flow_id_offset_present = 0;\n-\n-\tuint32_t i;\n-\tchar key_mask_str[PIPELINE_FC_FLOW_KEY_MAX_SIZE * 2 + 1];\n-\n-\tp->hash_offset = 0;\n-\n-\t/* default values */\n-\tp->flow_id = 0;\n-\n-\tfor (i = 0; i < params->n_args; i++) {\n-\t\tchar *arg_name = params->args_name[i];\n-\t\tchar *arg_value = params->args_value[i];\n-\n-\t\t/* n_flows */\n-\t\tif (strcmp(arg_name, \"n_flows\") == 0) {\n-\t\t\tint status;\n-\n-\t\t\tPIPELINE_PARSE_ERR_DUPLICATE(\n-\t\t\t\tn_flows_present == 0, params->name,\n-\t\t\t\targ_name);\n-\t\t\tn_flows_present = 1;\n-\n-\t\t\tstatus = parser_read_uint32(&p->n_flows,\n-\t\t\t\targ_value);\n-\t\t\tPIPELINE_PARSE_ERR_INV_VAL(((status != -EINVAL) &&\n-\t\t\t\t(p->n_flows != 0)), params->name,\n-\t\t\t\targ_name, arg_value);\n-\t\t\tPIPELINE_PARSE_ERR_OUT_RNG((status != -ERANGE),\n-\t\t\t\tparams->name, arg_name, arg_value);\n-\n-\t\t\tcontinue;\n-\t\t}\n-\n-\t\t/* key_offset */\n-\t\tif (strcmp(arg_name, \"key_offset\") == 0) {\n-\t\t\tint status;\n-\n-\t\t\tPIPELINE_PARSE_ERR_DUPLICATE(\n-\t\t\t\tkey_offset_present == 0, params->name,\n-\t\t\t\targ_name);\n-\t\t\tkey_offset_present = 1;\n-\n-\t\t\tstatus = parser_read_uint32(&p->key_offset,\n-\t\t\t\targ_value);\n-\t\t\tPIPELINE_PARSE_ERR_INV_VAL((status != -EINVAL),\n-\t\t\t\tparams->name, arg_name, arg_value);\n-\t\t\tPIPELINE_PARSE_ERR_OUT_RNG((status != -ERANGE),\n-\t\t\t\tparams->name, arg_name, arg_value);\n-\n-\t\t\tcontinue;\n-\t\t}\n-\n-\t\t/* key_size */\n-\t\tif (strcmp(arg_name, \"key_size\") == 0) {\n-\t\t\tint status;\n-\n-\t\t\tPIPELINE_PARSE_ERR_DUPLICATE(\n-\t\t\t\tkey_size_present == 0, params->name,\n-\t\t\t\targ_name);\n-\t\t\tkey_size_present = 1;\n-\n-\t\t\tstatus = parser_read_uint32(&p->key_size,\n-\t\t\t\targ_value);\n-\t\t\tPIPELINE_PARSE_ERR_INV_VAL(((status != -EINVAL) &&\n-\t\t\t\t(p->key_size != 0) &&\n-\t\t\t\t(p->key_size % 8 == 0)),\n-\t\t\t\tparams->name, arg_name, arg_value);\n-\t\t\tPIPELINE_PARSE_ERR_OUT_RNG(((status != -ERANGE) &&\n-\t\t\t\t(p->key_size <=\n-\t\t\t\tPIPELINE_FC_FLOW_KEY_MAX_SIZE)),\n-\t\t\t\tparams->name, arg_name, arg_value);\n-\n-\t\t\tcontinue;\n-\t\t}\n-\n-\t\t/* key_mask */\n-\t\tif (strcmp(arg_name, \"key_mask\") == 0) {\n-\t\t\tint mask_str_len = strlen(arg_value);\n-\n-\t\t\tPIPELINE_PARSE_ERR_DUPLICATE(\n-\t\t\t\tkey_mask_present == 0,\n-\t\t\t\tparams->name, arg_name);\n-\t\t\tkey_mask_present = 1;\n-\n-\t\t\tPIPELINE_ARG_CHECK((mask_str_len <=\n-\t\t\t\t(PIPELINE_FC_FLOW_KEY_MAX_SIZE * 2)),\n-\t\t\t\t\"Parse error in section \\\"%s\\\": entry \"\n-\t\t\t\t\"\\\"%s\\\" is too long\", params->name,\n-\t\t\t\targ_name);\n-\n-\t\t\tsnprintf(key_mask_str, mask_str_len + 1, \"%s\",\n-\t\t\t\targ_value);\n-\n-\t\t\tcontinue;\n-\t\t}\n-\n-\t\t/* hash_offset */\n-\t\tif (strcmp(arg_name, \"hash_offset\") == 0) {\n-\t\t\tint status;\n-\n-\t\t\tPIPELINE_PARSE_ERR_DUPLICATE(\n-\t\t\t\thash_offset_present == 0, params->name,\n-\t\t\t\targ_name);\n-\t\t\thash_offset_present = 1;\n-\n-\t\t\tstatus = parser_read_uint32(&p->hash_offset,\n-\t\t\t\targ_value);\n-\t\t\tPIPELINE_PARSE_ERR_INV_VAL((status != -EINVAL),\n-\t\t\t\tparams->name, arg_name, arg_value);\n-\t\t\tPIPELINE_PARSE_ERR_OUT_RNG((status != -ERANGE),\n-\t\t\t\tparams->name, arg_name, arg_value);\n-\n-\t\t\tcontinue;\n-\t\t}\n-\n-\t\t/* flow_id_offset */\n-\t\tif (strcmp(arg_name, \"flowid_offset\") == 0) {\n-\t\t\tint status;\n-\n-\t\t\tPIPELINE_PARSE_ERR_DUPLICATE(\n-\t\t\t\tflow_id_offset_present == 0, params->name,\n-\t\t\t\targ_name);\n-\t\t\tflow_id_offset_present = 1;\n-\n-\t\t\tstatus = parser_read_uint32(&p->flow_id_offset,\n-\t\t\t\targ_value);\n-\t\t\tPIPELINE_PARSE_ERR_INV_VAL((status != -EINVAL),\n-\t\t\t\tparams->name, arg_name, arg_value);\n-\t\t\tPIPELINE_PARSE_ERR_OUT_RNG((status != -ERANGE),\n-\t\t\t\tparams->name, arg_name, arg_value);\n-\n-\t\t\tp->flow_id = 1;\n-\n-\t\t\tcontinue;\n-\t\t}\n-\n-\t\t/* Unknown argument */\n-\t\tPIPELINE_PARSE_ERR_INV_ENT(0, params->name, arg_name);\n-\t}\n-\n-\t/* Check that mandatory arguments are present */\n-\tPIPELINE_PARSE_ERR_MANDATORY((n_flows_present), params->name,\n-\t\t\"n_flows\");\n-\tPIPELINE_PARSE_ERR_MANDATORY((key_offset_present), params->name,\n-\t\t\"key_offset\");\n-\tPIPELINE_PARSE_ERR_MANDATORY((key_size_present), params->name,\n-\t\t\"key_size\");\n-\n-\tif (key_mask_present) {\n-\t\tuint32_t key_size = p->key_size;\n-\t\tint status;\n-\n-\t\tPIPELINE_ARG_CHECK(((key_size == 8) || (key_size == 16)),\n-\t\t\t\"Parse error in section \\\"%s\\\": entry key_mask \"\n-\t\t\t\"only allowed for key_size of 8 or 16 bytes\",\n-\t\t\tparams->name);\n-\n-\t\tPIPELINE_ARG_CHECK((strlen(key_mask_str) ==\n-\t\t\t(key_size * 2)), \"Parse error in section \"\n-\t\t\t\"\\\"%s\\\": key_mask should have exactly %u hex \"\n-\t\t\t\"digits\", params->name, (key_size * 2));\n-\n-\t\tPIPELINE_ARG_CHECK((hash_offset_present == 0), \"Parse \"\n-\t\t\t\"error in section \\\"%s\\\": entry hash_offset only \"\n-\t\t\t\"allowed when key_mask is not present\",\n-\t\t\tparams->name);\n-\n-\t\tstatus = parse_hex_string(key_mask_str, p->key_mask,\n-\t\t\t&p->key_size);\n-\n-\t\tPIPELINE_PARSE_ERR_INV_VAL(((status == 0) &&\n-\t\t\t(key_size == p->key_size)), params->name,\n-\t\t\t\"key_mask\", key_mask_str);\n-\t}\n-\n-\tp->key_mask_present = key_mask_present;\n-\n-\treturn 0;\n-}\n-\n-static void *pipeline_fc_init(struct pipeline_params *params,\n-\t__rte_unused void *arg)\n-{\n-\tstruct pipeline *p;\n-\tstruct pipeline_flow_classification *p_fc;\n-\tuint32_t size, i;\n-\n-\t/* Check input arguments */\n-\tif (params == NULL)\n-\t\treturn NULL;\n-\n-\t/* Memory allocation */\n-\tsize = RTE_CACHE_LINE_ROUNDUP(\n-\t\tsizeof(struct pipeline_flow_classification));\n-\tp = rte_zmalloc(NULL, size, RTE_CACHE_LINE_SIZE);\n-\tif (p == NULL)\n-\t\treturn NULL;\n-\tp_fc = (struct pipeline_flow_classification *) p;\n-\n-\tstrcpy(p->name, params->name);\n-\tp->log_level = params->log_level;\n-\n-\tPLOG(p, HIGH, \"Flow classification\");\n-\n-\t/* Parse arguments */\n-\tif (pipeline_fc_parse_args(p_fc, params))\n-\t\treturn NULL;\n-\n-\t/* Pipeline */\n-\t{\n-\t\tstruct rte_pipeline_params pipeline_params = {\n-\t\t\t.name = params->name,\n-\t\t\t.socket_id = params->socket_id,\n-\t\t\t.offset_port_id = 0,\n-\t\t};\n-\n-\t\tp->p = rte_pipeline_create(&pipeline_params);\n-\t\tif (p->p == NULL) {\n-\t\t\trte_free(p);\n-\t\t\treturn NULL;\n-\t\t}\n-\t}\n-\n-\t/* Input ports */\n-\tp->n_ports_in = params->n_ports_in;\n-\tfor (i = 0; i < p->n_ports_in; i++) {\n-\t\tstruct rte_pipeline_port_in_params port_params = {\n-\t\t\t.ops = pipeline_port_in_params_get_ops(\n-\t\t\t\t&params->port_in[i]),\n-\t\t\t.arg_create = pipeline_port_in_params_convert(\n-\t\t\t\t&params->port_in[i]),\n-\t\t\t.f_action = NULL,\n-\t\t\t.arg_ah = NULL,\n-\t\t\t.burst_size = params->port_in[i].burst_size,\n-\t\t};\n-\n-\t\tint status = rte_pipeline_port_in_create(p->p,\n-\t\t\t&port_params,\n-\t\t\t&p->port_in_id[i]);\n-\n-\t\tif (status) {\n-\t\t\trte_pipeline_free(p->p);\n-\t\t\trte_free(p);\n-\t\t\treturn NULL;\n-\t\t}\n-\t}\n-\n-\t/* Output ports */\n-\tp->n_ports_out = params->n_ports_out;\n-\tfor (i = 0; i < p->n_ports_out; i++) {\n-\t\tstruct rte_pipeline_port_out_params port_params = {\n-\t\t\t.ops = pipeline_port_out_params_get_ops(\n-\t\t\t\t&params->port_out[i]),\n-\t\t\t.arg_create = pipeline_port_out_params_convert(\n-\t\t\t\t&params->port_out[i]),\n-\t\t\t.f_action = NULL,\n-\t\t\t.arg_ah = NULL,\n-\t\t};\n-\n-\t\tint status = rte_pipeline_port_out_create(p->p,\n-\t\t\t&port_params,\n-\t\t\t&p->port_out_id[i]);\n-\n-\t\tif (status) {\n-\t\t\trte_pipeline_free(p->p);\n-\t\t\trte_free(p);\n-\t\t\treturn NULL;\n-\t\t}\n-\t}\n-\n-\t/* Tables */\n-\tp->n_tables = 1;\n-\t{\n-\t\tstruct rte_table_hash_params table_hash_params = {\n-\t\t\t.name = p->name,\n-\t\t\t.key_size = p_fc->key_size,\n-\t\t\t.key_offset = p_fc->key_offset,\n-\t\t\t.key_mask = (p_fc->key_mask_present) ?\n-\t\t\t\tp_fc->key_mask : NULL,\n-\t\t\t.n_keys = p_fc->n_flows,\n-\t\t\t.n_buckets = rte_align32pow2(p_fc->n_flows / 4),\n-\t\t\t.f_hash = hash_func[(p_fc->key_size / 8) - 1],\n-\t\t\t.seed = 0,\n-\t\t};\n-\n-\t\tstruct rte_pipeline_table_params table_params = {\n-\t\t\t.ops = NULL, /* set below */\n-\t\t\t.arg_create = NULL, /* set below */\n-\t\t\t.f_action_hit = get_fc_table_ah_hit(p_fc),\n-\t\t\t.f_action_miss = NULL,\n-\t\t\t.arg_ah = p_fc,\n-\t\t\t.action_data_size = sizeof(struct flow_table_entry) -\n-\t\t\t\tsizeof(struct rte_pipeline_table_entry),\n-\t\t};\n-\n-\t\tint status;\n-\n-\t\tswitch (p_fc->key_size) {\n-\t\tcase 8:\n-\t\t\ttable_params.ops = &rte_table_hash_key8_ext_ops;\n-\t\t\tbreak;\n-\n-\t\tcase 16:\n-\t\t\ttable_params.ops = &rte_table_hash_key16_ext_ops;\n-\t\t\tbreak;\n-\n-\t\tdefault:\n-\t\t\ttable_params.ops = &rte_table_hash_ext_ops;\n-\t\t}\n-\n-\t\ttable_params.arg_create = &table_hash_params;\n-\n-\t\tstatus = rte_pipeline_table_create(p->p,\n-\t\t\t&table_params,\n-\t\t\t&p->table_id[0]);\n-\n-\t\tif (status) {\n-\t\t\trte_pipeline_free(p->p);\n-\t\t\trte_free(p);\n-\t\t\treturn NULL;\n-\t\t}\n-\t}\n-\n-\t/* Connecting input ports to tables */\n-\tfor (i = 0; i < p->n_ports_in; i++) {\n-\t\tint status = rte_pipeline_port_in_connect_to_table(p->p,\n-\t\t\tp->port_in_id[i],\n-\t\t\tp->table_id[0]);\n-\n-\t\tif (status) {\n-\t\t\trte_pipeline_free(p->p);\n-\t\t\trte_free(p);\n-\t\t\treturn NULL;\n-\t\t}\n-\t}\n-\n-\t/* Enable input ports */\n-\tfor (i = 0; i < p->n_ports_in; i++) {\n-\t\tint status = rte_pipeline_port_in_enable(p->p,\n-\t\t\tp->port_in_id[i]);\n-\n-\t\tif (status) {\n-\t\t\trte_pipeline_free(p->p);\n-\t\t\trte_free(p);\n-\t\t\treturn NULL;\n-\t\t}\n-\t}\n-\n-\t/* Check pipeline consistency */\n-\tif (rte_pipeline_check(p->p) < 0) {\n-\t\trte_pipeline_free(p->p);\n-\t\trte_free(p);\n-\t\treturn NULL;\n-\t}\n-\n-\t/* Message queues */\n-\tp->n_msgq = params->n_msgq;\n-\tfor (i = 0; i < p->n_msgq; i++)\n-\t\tp->msgq_in[i] = params->msgq_in[i];\n-\tfor (i = 0; i < p->n_msgq; i++)\n-\t\tp->msgq_out[i] = params->msgq_out[i];\n-\n-\t/* Message handlers */\n-\tmemcpy(p->handlers, handlers, sizeof(p->handlers));\n-\tmemcpy(p_fc->custom_handlers,\n-\t\tcustom_handlers,\n-\t\tsizeof(p_fc->custom_handlers));\n-\n-\treturn p;\n-}\n-\n-static int\n-pipeline_fc_free(void *pipeline)\n-{\n-\tstruct pipeline *p = (struct pipeline *) pipeline;\n-\n-\t/* Check input arguments */\n-\tif (p == NULL)\n-\t\treturn -1;\n-\n-\t/* Free resources */\n-\trte_pipeline_free(p->p);\n-\trte_free(p);\n-\treturn 0;\n-}\n-\n-static int\n-pipeline_fc_timer(void *pipeline)\n-{\n-\tstruct pipeline *p = (struct pipeline *) pipeline;\n-\n-\tpipeline_msg_req_handle(p);\n-\trte_pipeline_flush(p->p);\n-\n-\treturn 0;\n-}\n-\n-static void *\n-pipeline_fc_msg_req_custom_handler(struct pipeline *p, void *msg)\n-{\n-\tstruct pipeline_flow_classification *p_fc =\n-\t\t\t(struct pipeline_flow_classification *) p;\n-\tstruct pipeline_custom_msg_req *req = msg;\n-\tpipeline_msg_req_handler f_handle;\n-\n-\tf_handle = (req->subtype < PIPELINE_FC_MSG_REQS) ?\n-\t\tp_fc->custom_handlers[req->subtype] :\n-\t\tpipeline_msg_req_invalid_handler;\n-\n-\tif (f_handle == NULL)\n-\t\tf_handle = pipeline_msg_req_invalid_handler;\n-\n-\treturn f_handle(p, req);\n-}\n-\n-static void *\n-pipeline_fc_msg_req_add_handler(struct pipeline *p, void *msg)\n-{\n-\tstruct pipeline_fc_add_msg_req *req = msg;\n-\tstruct pipeline_fc_add_msg_rsp *rsp = msg;\n-\n-\tstruct flow_table_entry entry = {\n-\t\t.head = {\n-\t\t\t.action = RTE_PIPELINE_ACTION_PORT,\n-\t\t\t{.port_id = p->port_out_id[req->port_id]},\n-\t\t},\n-\t\t.flow_id = req->flow_id,\n-\t};\n-\n-\trsp->status = rte_pipeline_table_entry_add(p->p,\n-\t\tp->table_id[0],\n-\t\t&req->key,\n-\t\t(struct rte_pipeline_table_entry *) &entry,\n-\t\t&rsp->key_found,\n-\t\t(struct rte_pipeline_table_entry **) &rsp->entry_ptr);\n-\n-\treturn rsp;\n-}\n-\n-static void *\n-pipeline_fc_msg_req_add_bulk_handler(struct pipeline *p, void *msg)\n-{\n-\tstruct pipeline_fc_add_bulk_msg_req *req = msg;\n-\tstruct pipeline_fc_add_bulk_msg_rsp *rsp = msg;\n-\tuint32_t i;\n-\n-\tfor (i = 0; i < req->n_keys; i++) {\n-\t\tstruct pipeline_fc_add_bulk_flow_req *flow_req = &req->req[i];\n-\t\tstruct pipeline_fc_add_bulk_flow_rsp *flow_rsp = &req->rsp[i];\n-\n-\t\tstruct flow_table_entry entry = {\n-\t\t\t.head = {\n-\t\t\t\t.action = RTE_PIPELINE_ACTION_PORT,\n-\t\t\t\t{.port_id = p->port_out_id[flow_req->port_id]},\n-\t\t\t},\n-\t\t\t.flow_id = flow_req->flow_id,\n-\t\t};\n-\n-\t\tint status = rte_pipeline_table_entry_add(p->p,\n-\t\t\tp->table_id[0],\n-\t\t\t&flow_req->key,\n-\t\t\t(struct rte_pipeline_table_entry *) &entry,\n-\t\t\t&flow_rsp->key_found,\n-\t\t\t(struct rte_pipeline_table_entry **)\n-\t\t\t\t&flow_rsp->entry_ptr);\n-\n-\t\tif (status)\n-\t\t\tbreak;\n-\t}\n-\n-\trsp->n_keys = i;\n-\n-\treturn rsp;\n-}\n-\n-static void *\n-pipeline_fc_msg_req_del_handler(struct pipeline *p, void *msg)\n-{\n-\tstruct pipeline_fc_del_msg_req *req = msg;\n-\tstruct pipeline_fc_del_msg_rsp *rsp = msg;\n-\n-\trsp->status = rte_pipeline_table_entry_delete(p->p,\n-\t\tp->table_id[0],\n-\t\t&req->key,\n-\t\t&rsp->key_found,\n-\t\tNULL);\n-\n-\treturn rsp;\n-}\n-\n-static void *\n-pipeline_fc_msg_req_add_default_handler(struct pipeline *p, void *msg)\n-{\n-\tstruct pipeline_fc_add_default_msg_req *req = msg;\n-\tstruct pipeline_fc_add_default_msg_rsp *rsp = msg;\n-\n-\tstruct flow_table_entry default_entry = {\n-\t\t.head = {\n-\t\t\t.action = RTE_PIPELINE_ACTION_PORT,\n-\t\t\t{.port_id = p->port_out_id[req->port_id]},\n-\t\t},\n-\n-\t\t.flow_id = 0,\n-\t};\n-\n-\trsp->status = rte_pipeline_table_default_entry_add(p->p,\n-\t\tp->table_id[0],\n-\t\t(struct rte_pipeline_table_entry *) &default_entry,\n-\t\t(struct rte_pipeline_table_entry **) &rsp->entry_ptr);\n-\n-\treturn rsp;\n-}\n-\n-static void *\n-pipeline_fc_msg_req_del_default_handler(struct pipeline *p, void *msg)\n-{\n-\tstruct pipeline_fc_del_default_msg_rsp *rsp = msg;\n-\n-\trsp->status = rte_pipeline_table_default_entry_delete(p->p,\n-\t\tp->table_id[0],\n-\t\tNULL);\n-\n-\treturn rsp;\n-}\n-\n-struct pipeline_be_ops pipeline_flow_classification_be_ops = {\n-\t.f_init = pipeline_fc_init,\n-\t.f_free = pipeline_fc_free,\n-\t.f_run = NULL,\n-\t.f_timer = pipeline_fc_timer,\n-};\ndiff --git a/examples/ip_pipeline/pipeline/pipeline_flow_classification_be.h b/examples/ip_pipeline/pipeline/pipeline_flow_classification_be.h\ndeleted file mode 100644\nindex 18f5bb4..0000000\n--- a/examples/ip_pipeline/pipeline/pipeline_flow_classification_be.h\n+++ /dev/null\n@@ -1,113 +0,0 @@\n-/* SPDX-License-Identifier: BSD-3-Clause\n- * Copyright(c) 2010-2015 Intel Corporation\n- */\n-\n-#ifndef __INCLUDE_PIPELINE_FLOW_CLASSIFICATION_BE_H__\n-#define __INCLUDE_PIPELINE_FLOW_CLASSIFICATION_BE_H__\n-\n-#include \"pipeline_common_be.h\"\n-\n-enum pipeline_fc_msg_req_type {\n-\tPIPELINE_FC_MSG_REQ_FLOW_ADD = 0,\n-\tPIPELINE_FC_MSG_REQ_FLOW_ADD_BULK,\n-\tPIPELINE_FC_MSG_REQ_FLOW_DEL,\n-\tPIPELINE_FC_MSG_REQ_FLOW_ADD_DEFAULT,\n-\tPIPELINE_FC_MSG_REQ_FLOW_DEL_DEFAULT,\n-\tPIPELINE_FC_MSG_REQS,\n-};\n-\n-#ifndef PIPELINE_FC_FLOW_KEY_MAX_SIZE\n-#define PIPELINE_FC_FLOW_KEY_MAX_SIZE            64\n-#endif\n-\n-/*\n- * MSG ADD\n- */\n-struct pipeline_fc_add_msg_req {\n-\tenum pipeline_msg_req_type type;\n-\tenum pipeline_fc_msg_req_type subtype;\n-\n-\tuint8_t key[PIPELINE_FC_FLOW_KEY_MAX_SIZE];\n-\n-\tuint32_t port_id;\n-\tuint32_t flow_id;\n-};\n-\n-struct pipeline_fc_add_msg_rsp {\n-\tint status;\n-\tint key_found;\n-\tvoid *entry_ptr;\n-};\n-\n-/*\n- * MSG ADD BULK\n- */\n-struct pipeline_fc_add_bulk_flow_req {\n-\tuint8_t key[PIPELINE_FC_FLOW_KEY_MAX_SIZE];\n-\tuint32_t port_id;\n-\tuint32_t flow_id;\n-};\n-\n-struct pipeline_fc_add_bulk_flow_rsp {\n-\tint key_found;\n-\tvoid *entry_ptr;\n-};\n-\n-struct pipeline_fc_add_bulk_msg_req {\n-\tenum pipeline_msg_req_type type;\n-\tenum pipeline_fc_msg_req_type subtype;\n-\n-\tstruct pipeline_fc_add_bulk_flow_req *req;\n-\tstruct pipeline_fc_add_bulk_flow_rsp *rsp;\n-\tuint32_t n_keys;\n-};\n-\n-struct pipeline_fc_add_bulk_msg_rsp {\n-\tuint32_t n_keys;\n-};\n-\n-/*\n- * MSG DEL\n- */\n-struct pipeline_fc_del_msg_req {\n-\tenum pipeline_msg_req_type type;\n-\tenum pipeline_fc_msg_req_type subtype;\n-\n-\tuint8_t key[PIPELINE_FC_FLOW_KEY_MAX_SIZE];\n-};\n-\n-struct pipeline_fc_del_msg_rsp {\n-\tint status;\n-\tint key_found;\n-};\n-\n-/*\n- * MSG ADD DEFAULT\n- */\n-struct pipeline_fc_add_default_msg_req {\n-\tenum pipeline_msg_req_type type;\n-\tenum pipeline_fc_msg_req_type subtype;\n-\n-\tuint32_t port_id;\n-};\n-\n-struct pipeline_fc_add_default_msg_rsp {\n-\tint status;\n-\tvoid *entry_ptr;\n-};\n-\n-/*\n- * MSG DEL DEFAULT\n- */\n-struct pipeline_fc_del_default_msg_req {\n-\tenum pipeline_msg_req_type type;\n-\tenum pipeline_fc_msg_req_type subtype;\n-};\n-\n-struct pipeline_fc_del_default_msg_rsp {\n-\tint status;\n-};\n-\n-extern struct pipeline_be_ops pipeline_flow_classification_be_ops;\n-\n-#endif\n",
    "prefixes": [
        "dpdk-dev",
        "v2",
        "12/44"
    ]
}