get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 64463,
    "url": "http://patches.dpdk.org/api/patches/64463/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/8abacc3b4e7f150e708241adf7611f1bc9ee3fc8.1578787797.git.sowmini.varadhan@microsoft.com/",
    "project": {
        "id": 1,
        "url": "http://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": "<8abacc3b4e7f150e708241adf7611f1bc9ee3fc8.1578787797.git.sowmini.varadhan@microsoft.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/8abacc3b4e7f150e708241adf7611f1bc9ee3fc8.1578787797.git.sowmini.varadhan@microsoft.com",
    "date": "2020-01-12T23:08:39",
    "name": "[RFC,2/2] Allow the flow_classify example to add an ACL table for tcp.",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "c40b12c9e560c137685dcf595a82c073880be2b9",
    "submitter": {
        "id": 1568,
        "url": "http://patches.dpdk.org/api/people/1568/?format=api",
        "name": "Sowmini Varadhan",
        "email": "sowmini05@gmail.com"
    },
    "delegate": null,
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/8abacc3b4e7f150e708241adf7611f1bc9ee3fc8.1578787797.git.sowmini.varadhan@microsoft.com/mbox/",
    "series": [
        {
            "id": 8063,
            "url": "http://patches.dpdk.org/api/series/8063/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=8063",
            "date": "2020-01-12T23:08:37",
            "name": "TCP flow classification using 4-tuple and flags",
            "version": 1,
            "mbox": "http://patches.dpdk.org/series/8063/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/64463/comments/",
    "check": "warning",
    "checks": "http://patches.dpdk.org/api/patches/64463/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@inbox.dpdk.org",
        "Delivered-To": "patchwork@inbox.dpdk.org",
        "Received": [
            "from dpdk.org (dpdk.org [92.243.14.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id 587D2A04F0;\n\tMon, 13 Jan 2020 00:09:12 +0100 (CET)",
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id 4D9701D586;\n\tMon, 13 Jan 2020 00:08:58 +0100 (CET)",
            "from mail-qv1-f65.google.com (mail-qv1-f65.google.com\n [209.85.219.65]) by dpdk.org (Postfix) with ESMTP id D37C81D57F\n for <dev@dpdk.org>; Mon, 13 Jan 2020 00:08:54 +0100 (CET)",
            "by mail-qv1-f65.google.com with SMTP id m14so3276213qvl.3\n for <dev@dpdk.org>; Sun, 12 Jan 2020 15:08:54 -0800 (PST)",
            "from sovaradhvm.ojp4suxva1celnnpiyhedynfde.bx.internal.cloudapp.net\n ([104.211.12.148])\n by smtp.gmail.com with ESMTPSA id i23sm4174549qka.113.2020.01.12.15.08.53\n (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n Sun, 12 Jan 2020 15:08:53 -0800 (PST)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025;\n h=from:to:subject:date:message-id:in-reply-to:references:in-reply-to\n :references; bh=gg3uw75PJepj8prQuQmlpE9NDoTnhiOviXagjGlJxAo=;\n b=ekgvlAoJjSvMf9PhcaVczHrlNf+VPRhUbxpZZeoq6VbmzHni6a33pHETWXODwijKdh\n QCXp91sla2vWAylzVroWNhKuMgXiihIRJrFCCOx8YOzWSAvAPNyjyCySnX97tmWPQgNq\n gq5eKQnReomWSDn/1lHNpz2PkMLsC7MUHNUHG74T2Ll2Hlet9LSxvHktu1V3TzwjQyX1\n r2+XbvW3TuAynwuRHSCHh0qqqKHmCxFGwoEZP6k17PTBGyoqN9/n7KI7IL/VP23FVXlc\n xt+seTlVioiZslB1YMUiQ0XE2folBKos1hhCCjaYBbOmNB1us7pckolG3a8qWTxPKyqV\n 66Aw==",
        "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20161025;\n h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to\n :references:in-reply-to:references;\n bh=gg3uw75PJepj8prQuQmlpE9NDoTnhiOviXagjGlJxAo=;\n b=kzmiKLsCfs62cL2iR3bYrv4shkGD8rim701aYxAjJCOKtpodiT2fGUllryNLICWl+W\n C5brxuDxGimqneNsZZunocsrncIL1MCC5DTtMcAE2jpruWA5pX0uzKRcIVtvAROjFECc\n OQMWLNRy7aAbZAocLxZQU30xWb+2owy9gELO0MAa0vkzfLJhWCZ5q0drD9G9Gb92hmRm\n od8nUCAqNh5rrIXjluQsfp+iE5Z3Jopn30eswieciYpiqGH0f6+gmuxNgx3rsAG+5HGT\n K5mxSQgY/6S2t9Mb4ABpt7SWpR7iXmQsbFLEP5CTJnSNJTIVR4Esv6Dt3b/drYkQHXSz\n zrgw==",
        "X-Gm-Message-State": "APjAAAX5BUZhkxFW0HiwnHY26B+F1SKuyftkLCe7k9j6rG8pO5rcvw14\n Dy8LtPrtT70aGaDX5UJyzMc=",
        "X-Google-Smtp-Source": "\n APXvYqxvSCEMLtwU6vU/+HNWdBqHG0luLpJrQJ+wYS0qPFYV+vkdaP9Z/IbmSFSBQYroejBC4PvCTg==",
        "X-Received": "by 2002:a0c:ebcf:: with SMTP id k15mr9187557qvq.217.1578870534120;\n Sun, 12 Jan 2020 15:08:54 -0800 (PST)",
        "From": "Sowmini Varadhan <sowmini05@gmail.com>",
        "To": "sowmini05@gmail.com,\n\tdev@dpdk.org",
        "Date": "Sun, 12 Jan 2020 23:08:39 +0000",
        "Message-Id": "\n <8abacc3b4e7f150e708241adf7611f1bc9ee3fc8.1578787797.git.sowmini.varadhan@microsoft.com>",
        "X-Mailer": "git-send-email 2.17.1",
        "In-Reply-To": [
            "<cover.1578787797.git.sowmini.varadhan@microsoft.com>",
            "<cover.1578787797.git.sowmini.varadhan@microsoft.com>"
        ],
        "References": [
            "<cover.1578787797.git.sowmini.varadhan@microsoft.com>",
            "<cover.1578787797.git.sowmini.varadhan@microsoft.com>"
        ],
        "Subject": "[dpdk-dev] [PATCH RFC 2/2] Allow the flow_classify example to add\n\tan ACL table for tcp.",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n <mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n <mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "The struct rte_flow_classifier can have upto RTE_FLOW_CLASSIFY_TABLE_MAX (32)\nclassifier tables, but the existing flow_classify examples only adds a single\ntable for the L4 5-tuple.\n\nWhen dealing with tcp flows, we frequently want to add add ACLs and filters\nto filter based on the state of the TCP connection, e.g., by looking at\nthe tcp flags field.\n\nSo we enhance flow_classify to add an additional acl table for\ntcp 5-typles. If the input-file-parser detects a filter for a tcp flow with\na non-wildcard argument for tcp_flags, the IP4_TCP_5TUPLE table is used\nby flow_classify.\n\nSigned-off-by: Sowmini Varadhan <sowmini05@gmail.com>\n---\n examples/flow_classify/flow_classify.c        | 33 ++++++--\n lib/librte_flow_classify/rte_flow_classify.c  | 84 +++++++++++++++++++\n lib/librte_flow_classify/rte_flow_classify.h  | 19 +++++\n .../rte_flow_classify_parse.c                 |  8 +-\n 4 files changed, 134 insertions(+), 10 deletions(-)",
    "diff": "diff --git a/examples/flow_classify/flow_classify.c b/examples/flow_classify/flow_classify.c\nindex e74a53be7..54ae65d46 100644\n--- a/examples/flow_classify/flow_classify.c\n+++ b/examples/flow_classify/flow_classify.c\n@@ -708,10 +708,6 @@ add_classify_rule(struct rte_eth_ntuple_filter *ntuple_filter,\n \t\treturn ret;\n \t}\n \n-\t/* XXX but this only adds table_type of  RTE_FLOW_CLASSIFY_TABLE_ACL_IP4_5TUPLE\n-\t * i.e., it only ever does allocate_acl_ipv4_5tuple_rule() so the tcp_flags is\n-\t * ignored! \n-\t */\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@@ -838,7 +834,8 @@ main(int argc, char *argv[])\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 rte_table_acl_params table_acl_tcp_params;\n+\tstruct rte_flow_classify_table_params cls_table_params[2];\n \tstruct flow_classifier *cls_app;\n \tstruct rte_flow_classifier_params cls_params;\n \tuint32_t size;\n@@ -901,16 +898,34 @@ main(int argc, char *argv[])\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+\tcls_table_params[0].ops = &rte_table_acl_ops;\n+\tcls_table_params[0].arg_create = &table_acl_params;\n+\tcls_table_params[0].type = RTE_FLOW_CLASSIFY_TABLE_ACL_IP4_5TUPLE;\n+\n+\t/* initialise ACL table params */\n+\ttable_acl_tcp_params.name = \"table_acl_ipv4_tcp_5tuple\";\n+\ttable_acl_tcp_params.n_rules = FLOW_CLASSIFY_MAX_RULE_NUM;\n+\ttable_acl_tcp_params.n_rule_fields = RTE_DIM(ipv4_defs);\n+\tmemcpy(table_acl_tcp_params.field_format, ipv4_defs, sizeof(ipv4_defs));\n+\n+\t/* initialise table create params */\n+\tcls_table_params[1].ops = &rte_table_acl_ops;\n+\tcls_table_params[1].arg_create = &table_acl_tcp_params;\n+\tcls_table_params[1].type = RTE_FLOW_CLASSIFY_TABLE_ACL_IP4_TCP_5TUPLE;\n \n-\tret = rte_flow_classify_table_create(cls_app->cls, &cls_table_params);\n+\tret = rte_flow_classify_table_create(cls_app->cls, &cls_table_params[0]);\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+\tret = rte_flow_classify_table_create(cls_app->cls, &cls_table_params[1]);\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+\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\ndiff --git a/lib/librte_flow_classify/rte_flow_classify.c b/lib/librte_flow_classify/rte_flow_classify.c\nindex 5ff585803..4ec36a397 100644\n--- a/lib/librte_flow_classify/rte_flow_classify.c\n+++ b/lib/librte_flow_classify/rte_flow_classify.c\n@@ -62,6 +62,7 @@ enum {\n \tDST_FIELD_IPV4,\n \tSRCP_FIELD_IPV4,\n \tDSTP_FIELD_IPV4,\n+\tTCP_FLAGS_FIELD,\n \tNUM_FIELDS_IPV4\n };\n \n@@ -74,6 +75,7 @@ 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\tstruct rte_flow_classify_ipv4_tcp_5tuple ipv4_tcp_5tuple;\n \t} u;\n };\n \n@@ -482,6 +484,81 @@ allocate_acl_ipv4_5tuple_rule(struct rte_flow_classifier *cls)\n \treturn rule;\n }\n \n+static struct rte_flow_classify_rule *\n+allocate_acl_ipv4_tcp_5tuple_rule(struct rte_flow_classifier *cls)\n+{\n+\tstruct rte_flow_classify_rule *rule;\n+\tint log_level;\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_TCP_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_tcp_5tuple.proto = cls->ntuple_filter.proto;\n+\trule->rules.u.ipv4_tcp_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_tcp_5tuple.src_ip_mask = cls->ntuple_filter.src_ip_mask;\n+\trule->rules.u.ipv4_tcp_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_tcp_5tuple.dst_ip_mask = cls->ntuple_filter.dst_ip_mask;\n+\trule->rules.u.ipv4_tcp_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_tcp_5tuple.src_port_mask =\n+\t\t\tcls->ntuple_filter.src_port_mask;\n+\trule->rules.u.ipv4_tcp_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_tcp_5tuple.dst_port_mask =\n+\t\t\tcls->ntuple_filter.dst_port_mask;\n+\trule->rules.u.ipv4_tcp_5tuple.dst_port = cls->ntuple_filter.dst_port;\n+\n+\trule->u.key.key_add.field_value[TCP_FLAGS_FIELD].mask_range.u32 =\n+\t\t\trte_be_to_cpu_32(0xff);\n+\trule->u.key.key_add.field_value[TCP_FLAGS_FIELD].value.u32 =\n+\t\t\trte_be_to_cpu_32(cls->ntuple_filter.tcp_flags);\n+\trule->rules.u.ipv4_tcp_5tuple.tcp_flags = cls->ntuple_filter.tcp_flags;\n+\n+\tlog_level = rte_log_get_level(librte_flow_classify_logtype);\n+\n+\tif (log_level == 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 (log_level == 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@@ -519,6 +596,13 @@ rte_flow_classify_table_entry_add(struct rte_flow_classifier *cls,\n \t\trule->tbl_type = table_type;\n \t\tcls->table_mask |= table_type;\n \t\tbreak;\n+\tcase RTE_FLOW_CLASSIFY_TABLE_ACL_IP4_TCP_5TUPLE:\n+\t\trule = allocate_acl_ipv4_tcp_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}\ndiff --git a/lib/librte_flow_classify/rte_flow_classify.h b/lib/librte_flow_classify/rte_flow_classify.h\nindex 74d1ecaf5..921277f90 100644\n--- a/lib/librte_flow_classify/rte_flow_classify.h\n+++ b/lib/librte_flow_classify/rte_flow_classify.h\n@@ -78,6 +78,8 @@ enum rte_flow_classify_rule_type {\n \tRTE_FLOW_CLASSIFY_RULE_TYPE_NONE,\n \t/** IPv4 5tuple type */\n \tRTE_FLOW_CLASSIFY_RULE_TYPE_IPV4_5TUPLE,\n+\t/** IPv4 TCP 5tuple type */\n+\tRTE_FLOW_CLASSIFY_RULE_TYPE_IPV4_TCP_5TUPLE,\n };\n \n /** Flow classify table type */\n@@ -90,6 +92,8 @@ enum rte_flow_classify_table_type {\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+\t/** ACL IP4 5TUPLE with tcp_flags */\n+\tRTE_FLOW_CLASSIFY_TABLE_ACL_IP4_TCP_5TUPLE = 1 << 4,\n \n };\n \n@@ -129,6 +133,21 @@ struct rte_flow_classify_ipv4_5tuple {\n \tuint8_t proto_mask;      /**< Mask of L4 protocol. */\n };\n \n+/** IPv4 5-tuple data with tcp flags*/\n+struct rte_flow_classify_ipv4_tcp_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+\tuint8_t tcp_flags;       /**< Tcp only */\n+};\n+\n /**\n  * Flow stats\n  *\ndiff --git a/lib/librte_flow_classify/rte_flow_classify_parse.c b/lib/librte_flow_classify/rte_flow_classify_parse.c\nindex 465330291..fe4ee05b6 100644\n--- a/lib/librte_flow_classify/rte_flow_classify_parse.c\n+++ b/lib/librte_flow_classify/rte_flow_classify_parse.c\n@@ -216,6 +216,7 @@ classify_parse_ntuple_filter(const struct rte_flow_attr *attr,\n \tconst struct rte_flow_action_count *count;\n \tconst struct rte_flow_action_mark *mark_spec;\n \tuint32_t index;\n+\tbool have_tcp = false;\n \n \t/* parse pattern */\n \tindex = 0;\n@@ -375,6 +376,8 @@ classify_parse_ntuple_filter(const struct rte_flow_attr *attr,\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\tif (filter->tcp_flags != 0)\n+\t\t\thave_tcp = true;\n \t} else if (item->type == RTE_FLOW_ITEM_TYPE_UDP) {\n \t\tudp_mask = item->mask;\n \n@@ -434,7 +437,10 @@ classify_parse_ntuple_filter(const struct rte_flow_attr *attr,\n \t\treturn -EINVAL;\n \t}\n \n-\ttable_type = RTE_FLOW_CLASSIFY_TABLE_ACL_IP4_5TUPLE;\n+\tif (have_tcp)\n+\t\ttable_type = RTE_FLOW_CLASSIFY_TABLE_ACL_IP4_TCP_5TUPLE;\n+\telse\n+\t\ttable_type = RTE_FLOW_CLASSIFY_TABLE_ACL_IP4_5TUPLE;\n \n \t/* parse attr */\n \t/* must be input direction */\n",
    "prefixes": [
        "RFC",
        "2/2"
    ]
}