get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 101139,
    "url": "https://patches.dpdk.org/api/patches/101139/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/20211012034238.386505-1-xiazhang@nvidia.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": "<20211012034238.386505-1-xiazhang@nvidia.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20211012034238.386505-1-xiazhang@nvidia.com",
    "date": "2021-10-12T03:42:38",
    "name": "app/flow-perf: add destination ports parameter",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "9df5240d07d9ffada78ba50f57445d058d82c158",
    "submitter": {
        "id": 2383,
        "url": "https://patches.dpdk.org/api/people/2383/?format=api",
        "name": "Sean Zhang",
        "email": "xiazhang@nvidia.com"
    },
    "delegate": {
        "id": 1,
        "url": "https://patches.dpdk.org/api/users/1/?format=api",
        "username": "tmonjalo",
        "first_name": "Thomas",
        "last_name": "Monjalon",
        "email": "thomas@monjalon.net"
    },
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/20211012034238.386505-1-xiazhang@nvidia.com/mbox/",
    "series": [
        {
            "id": 19541,
            "url": "https://patches.dpdk.org/api/series/19541/?format=api",
            "web_url": "https://patches.dpdk.org/project/dpdk/list/?series=19541",
            "date": "2021-10-12T03:42:38",
            "name": "app/flow-perf: add destination ports parameter",
            "version": 1,
            "mbox": "https://patches.dpdk.org/series/19541/mbox/"
        }
    ],
    "comments": "https://patches.dpdk.org/api/patches/101139/comments/",
    "check": "warning",
    "checks": "https://patches.dpdk.org/api/patches/101139/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@inbox.dpdk.org",
        "Delivered-To": "patchwork@inbox.dpdk.org",
        "Received": [
            "from mails.dpdk.org (mails.dpdk.org [217.70.189.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id BFC62A034F;\n\tTue, 12 Oct 2021 05:43:07 +0200 (CEST)",
            "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 4FE9E410DC;\n\tTue, 12 Oct 2021 05:43:07 +0200 (CEST)",
            "from NAM11-BN8-obe.outbound.protection.outlook.com\n (mail-bn8nam11on2056.outbound.protection.outlook.com [40.107.236.56])\n by mails.dpdk.org (Postfix) with ESMTP id 78D8D40142\n for <dev@dpdk.org>; Tue, 12 Oct 2021 05:43:05 +0200 (CEST)",
            "from DM3PR12CA0118.namprd12.prod.outlook.com (2603:10b6:0:51::14) by\n MN2PR12MB3040.namprd12.prod.outlook.com (2603:10b6:208:ce::17) with\n Microsoft\n SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id\n 15.20.4587.22; Tue, 12 Oct 2021 03:43:01 +0000",
            "from DM6NAM11FT016.eop-nam11.prod.protection.outlook.com\n (2603:10b6:0:51:cafe::e5) by DM3PR12CA0118.outlook.office365.com\n (2603:10b6:0:51::14) with Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4587.18 via Frontend\n Transport; Tue, 12 Oct 2021 03:43:01 +0000",
            "from mail.nvidia.com (216.228.112.34) by\n DM6NAM11FT016.mail.protection.outlook.com (10.13.173.139) with Microsoft SMTP\n Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id\n 15.20.4587.18 via Frontend Transport; Tue, 12 Oct 2021 03:43:00 +0000",
            "from nvidia.com (172.20.187.6) by HQMAIL107.nvidia.com\n (172.20.187.13) with Microsoft SMTP Server (TLS) id 15.0.1497.18; Tue, 12 Oct\n 2021 03:42:58 +0000"
        ],
        "ARC-Seal": "i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none;\n b=PqW5D3VeLH/jZMwno8Hh43cJZgSnJT63CqUusMFfA9lBUZY0QIxgkkAw5n51jJTncioF//tyWDqa7WzLlXZtHtuhV24N/yv0RSD9ccDD0aqH8aLbBVqYv4yrD+K1ZiwzPesM7FyiTNtZ8fEZI72SopJs+UKfADcj+LH8DF5HvKy4Ab3YZ5gtscQN9LOuVPfdrF3vOKfxZ8UhYX0TH8DFFPfmwYxuwaDi5j/BksMyAbLHrKa2D6CUHDS4o5n98Kqj/lPT3rHnWUGPnu063LvblFndg5dCLPOHrytDRYWSf7CW4NECVT2QucXi5vmZ6fXrutTHEnolhZd9x+mAP9u/dQ==",
        "ARC-Message-Signature": "i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com;\n s=arcselector9901;\n h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1;\n bh=3ChH7g5qLl2q+Tdr3WLEQjUHShtZWvj+9idxJ7T5Jbw=;\n b=UHTcIhR5UzfNA9V/X1gF1rTHohUbJUeapHoSWf88fZFVxkBO1bw4urIo1O4+XRnDwfMPP5NpEvyaTGUctDtRZgkL5BcmUwOm3S7mbmSS7E+8EWFcAhz6LJL35tisacG7FkMfRDCZKBGbYdUsWTYiGb8fIid/Jg/kvwpmOWTArtl9HbMarVQ7rYhyAXELoVUCrVP+BBoe2JPG8LlewSNcQUD8RPsNqTqYJ1t1ZF2Frzjet5RBoqlbe641yyabBmxGIW6UdYXjL3Nx6HaZs6w0VYMd+jHSWEnixtSp3I1zNi+Xra0vpIb/gzmyTxtr6yJYnztoz3B5LW5sst4xLqy2Xg==",
        "ARC-Authentication-Results": "i=1; mx.microsoft.com 1; spf=pass (sender ip is\n 216.228.112.34) smtp.rcpttodomain=dpdk.org smtp.mailfrom=nvidia.com;\n dmarc=pass (p=quarantine sp=quarantine pct=100) action=none\n header.from=nvidia.com; dkim=none (message not signed); arc=none",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com;\n s=selector2;\n h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;\n bh=3ChH7g5qLl2q+Tdr3WLEQjUHShtZWvj+9idxJ7T5Jbw=;\n b=QV+rdEq/9c3XNUxFhkQDWNu/NgnxBrx2ro0lTlKPoBKchyBem9E/j2o+NSjcd9IO+isZAX+WGRrVzEKJb2ISKgVDlxZUl92Qu2UwR+PtqLTFOftXjsfGmJvYrOD3jUzQ69EqXeLuW2Ouh8xKUUievrEehqQwnv3Nir3rNw8fLrwnhP4yumtFqdLLSff6u4n3N5p4glpqntzPyu/OT5aXasFOxp2a1ZZCMVc7Siibf9yI5UBlZlPgy+ZUmH8M51pkBrZO/sRTGlRKbStcJsSSRqiLlH0OLzS2lxwaqXpmzF0uCXoTcCAeGv+76qZe4mkYhAD8wqrDkdnzB5mbP3v1AA==",
        "X-MS-Exchange-Authentication-Results": "spf=pass (sender IP is 216.228.112.34)\n smtp.mailfrom=nvidia.com; dpdk.org; dkim=none (message not signed)\n header.d=none;dpdk.org; dmarc=pass action=none header.from=nvidia.com;",
        "Received-SPF": "Pass (protection.outlook.com: domain of nvidia.com designates\n 216.228.112.34 as permitted sender) receiver=protection.outlook.com;\n client-ip=216.228.112.34; helo=mail.nvidia.com;",
        "From": "Sean Zhang <xiazhang@nvidia.com>",
        "To": "<thomas@monjalon.net>, Wisam Jaddo <wisamm@nvidia.com>",
        "CC": "<dev@dpdk.org>, <rasland@nvidia.com>",
        "Date": "Tue, 12 Oct 2021 06:42:38 +0300",
        "Message-ID": "<20211012034238.386505-1-xiazhang@nvidia.com>",
        "X-Mailer": "git-send-email 2.33.0",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "Content-Type": "text/plain",
        "X-Originating-IP": "[172.20.187.6]",
        "X-ClientProxiedBy": "HQMAIL101.nvidia.com (172.20.187.10) To\n HQMAIL107.nvidia.com (172.20.187.13)",
        "X-EOPAttributedMessage": "0",
        "X-MS-PublicTrafficType": "Email",
        "X-MS-Office365-Filtering-Correlation-Id": "f63a5925-b48d-4bff-91be-08d98d3263b2",
        "X-MS-TrafficTypeDiagnostic": "MN2PR12MB3040:",
        "X-LD-Processed": "43083d15-7273-40c1-b7db-39efd9ccc17a,ExtAddr",
        "X-Microsoft-Antispam-PRVS": "\n <MN2PR12MB30403436821FA21C0302C5B0A2B69@MN2PR12MB3040.namprd12.prod.outlook.com>",
        "X-MS-Oob-TLC-OOBClassifiers": "OLM:4714;",
        "X-MS-Exchange-SenderADCheck": "1",
        "X-MS-Exchange-AntiSpam-Relay": "0",
        "X-Microsoft-Antispam": "BCL:0;",
        "X-Microsoft-Antispam-Message-Info": "\n xsX3CDdSOT4Q/80Q9oW0H/AnCeTHuXqzETEySQ2Y1DBGT6xZUnFvtvMKsNBMmH/IE1cO6zq/PcnRvdYMCBV0oVg+ZJnl5yZQqt929C0xbhoteBNAmGqCoYQ24I3cudu1NLeSgmsvogopEmB2Q0nbW2xBujTdfLfOO3omMGw2Wuyo7N6vmKcCccQkgTdqMVIgBJ4QDEa9Yy6Qi+FplmddFVGHtongJXNxZE45E76Oz5qPyQOOJSpWeF3CYQOZoTK7LQZxmf3zWr3tQLPBBJuuZi1RW9mqeylnbtd9zGD222Jn1Xyun3j/SSu7hwgMyq+QNHZibWSOULLWYWobTBHBWCuV5xFwNprU8RoQlEccyxJe6yhB5NQjePtKbhOpxxyyrtel67aqhtLl3v2BElBRQDvyXrEIENeUWKJp7AFxVxiEdhuh8MyGIM/i5aEOX6TCyo1sKGCPuw7wE8jHEg8p7bKqF8hvzQFv1wxK+5S3BiJ1YQG7cV7smuHqAq3yfiCqX8/Y3r72hFv3pDjQihvEluWpS8SrU59kdcDcOkQWdZ5fTj186LWMuIUgMEUDOvIhfzQPxbyviwY98EtG8r+iJ64qjPGmCM1kYKFC0377eF9vq5Y/MaBZdP7tS/HpBUiyrRb3NT5JS3GYvGW7vDmTshdbOh7OtGH1pHLOtM/rbSjXjO2VeX04AiNlv98VqtCYXnuP1MYuG4ammmrlyNPSLw==",
        "X-Forefront-Antispam-Report": "CIP:216.228.112.34; CTRY:US; LANG:en; SCL:1;\n SRV:;\n IPV:NLI; SFV:NSPM; H:mail.nvidia.com; PTR:schybrid03.nvidia.com; CAT:NONE;\n SFS:(4636009)(36840700001)(46966006)(8676002)(186003)(16526019)(47076005)(316002)(6636002)(4326008)(82310400003)(26005)(83380400001)(110136005)(1076003)(36756003)(426003)(54906003)(7636003)(356005)(8936002)(70206006)(70586007)(508600001)(2906002)(55016002)(2616005)(6666004)(5660300002)(6286002)(107886003)(7696005)(36860700001)(336012)(86362001);\n DIR:OUT; SFP:1101;",
        "X-OriginatorOrg": "Nvidia.com",
        "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "12 Oct 2021 03:43:00.8665 (UTC)",
        "X-MS-Exchange-CrossTenant-Network-Message-Id": "\n f63a5925-b48d-4bff-91be-08d98d3263b2",
        "X-MS-Exchange-CrossTenant-Id": "43083d15-7273-40c1-b7db-39efd9ccc17a",
        "X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp": "\n TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a; Ip=[216.228.112.34];\n Helo=[mail.nvidia.com]",
        "X-MS-Exchange-CrossTenant-AuthSource": "\n DM6NAM11FT016.eop-nam11.prod.protection.outlook.com",
        "X-MS-Exchange-CrossTenant-AuthAs": "Anonymous",
        "X-MS-Exchange-CrossTenant-FromEntityHeader": "HybridOnPrem",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "MN2PR12MB3040",
        "Subject": "[dpdk-dev] [PATCH] app/flow-perf: add destination ports parameter",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.29",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n <mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n <mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "Add destination ports(dst-ports) parameter for port-id action,\nthe parameter is only valid for port-id action. The parameter is not\nMust, and the value is 1 by default as before if not provided.\n\nFor example:\n\n$ dpdk-test-flow-perf -w 08:00.0,representor=[0,1] -- --transfer \\\n> --ingress --transfer --ether --portmask=0x2 --vxlan-encap \\\n> --port-id --dst-ports=0\n\nThis command means the rule created on representor 0 with port 0\nas destination, since the portmask is 0x2 and dst-ports is 0:\n\n$ dpdk-test-flow-perf -w 08:00.0,representor=[0,1] \\\n> -w 08:00.1,representor=[0,1]-- --transfer --ingress --transfer \\\n> --ether --portmask=0x12 --vxlan-encap --port-id --dst-ports=0,3\n\nThis command means the rules created on both representor 0 of PF 0\nand PF 1, the destination port for the first represontor is PF 0,\nand the destination port for the other one it PF 1.\n\nSigned-off-by: Sean Zhang <xiazhang@nvidia.com>\n---\n app/test-flow-perf/actions_gen.c |  7 +++--\n app/test-flow-perf/actions_gen.h |  2 +-\n app/test-flow-perf/flow_gen.c    |  3 +-\n app/test-flow-perf/flow_gen.h    |  1 +\n app/test-flow-perf/main.c        | 48 ++++++++++++++++++++++++++++----\n doc/guides/tools/flow-perf.rst   |  6 ++++\n 6 files changed, 58 insertions(+), 9 deletions(-)",
    "diff": "diff --git a/app/test-flow-perf/actions_gen.c b/app/test-flow-perf/actions_gen.c\nindex 82cddfc676..8786dc967c 100644\n--- a/app/test-flow-perf/actions_gen.c\n+++ b/app/test-flow-perf/actions_gen.c\n@@ -29,6 +29,7 @@ struct additional_para {\n \tuint32_t counter;\n \tuint64_t encap_data;\n \tuint64_t decap_data;\n+\tuint16_t dst_port;\n \tuint8_t core_idx;\n \tbool unique_data;\n };\n@@ -171,12 +172,13 @@ add_set_tag(struct rte_flow_action *actions,\n static void\n add_port_id(struct rte_flow_action *actions,\n \tuint8_t actions_counter,\n-\t__rte_unused struct additional_para para)\n+\tstruct additional_para para)\n {\n \tstatic struct rte_flow_action_port_id port_id = {\n \t\t.id = PORT_ID_DST,\n \t};\n \n+\tport_id.id = para.dst_port;\n \tactions[actions_counter].type = RTE_FLOW_ACTION_TYPE_PORT_ID;\n \tactions[actions_counter].conf = &port_id;\n }\n@@ -909,7 +911,7 @@ void\n fill_actions(struct rte_flow_action *actions, uint64_t *flow_actions,\n \tuint32_t counter, uint16_t next_table, uint16_t hairpinq,\n \tuint64_t encap_data, uint64_t decap_data, uint8_t core_idx,\n-\tbool unique_data)\n+\tbool unique_data, uint16_t dst_port)\n {\n \tstruct additional_para additional_para_data;\n \tuint8_t actions_counter = 0;\n@@ -933,6 +935,7 @@ fill_actions(struct rte_flow_action *actions, uint64_t *flow_actions,\n \t\t.decap_data = decap_data,\n \t\t.core_idx = core_idx,\n \t\t.unique_data = unique_data,\n+\t\t.dst_port = dst_port,\n \t};\n \n \tif (hairpinq != 0) {\ndiff --git a/app/test-flow-perf/actions_gen.h b/app/test-flow-perf/actions_gen.h\nindex 6f2f833496..f3bb6fec41 100644\n--- a/app/test-flow-perf/actions_gen.h\n+++ b/app/test-flow-perf/actions_gen.h\n@@ -20,6 +20,6 @@\n void fill_actions(struct rte_flow_action *actions, uint64_t *flow_actions,\n \tuint32_t counter, uint16_t next_table, uint16_t hairpinq,\n \tuint64_t encap_data, uint64_t decap_data, uint8_t core_idx,\n-\tbool unique_data);\n+\tbool unique_data, uint16_t dst_port);\n \n #endif /* FLOW_PERF_ACTION_GEN */\ndiff --git a/app/test-flow-perf/flow_gen.c b/app/test-flow-perf/flow_gen.c\nindex 8f87fac5f6..890387bffa 100644\n--- a/app/test-flow-perf/flow_gen.c\n+++ b/app/test-flow-perf/flow_gen.c\n@@ -45,6 +45,7 @@ generate_flow(uint16_t port_id,\n \tuint16_t hairpinq,\n \tuint64_t encap_data,\n \tuint64_t decap_data,\n+\tuint16_t dst_port,\n \tuint8_t core_idx,\n \tbool unique_data,\n \tstruct rte_flow_error *error)\n@@ -63,7 +64,7 @@ generate_flow(uint16_t port_id,\n \tfill_actions(actions, flow_actions,\n \t\touter_ip_src, next_table, hairpinq,\n \t\tencap_data, decap_data, core_idx,\n-\t\tunique_data);\n+\t\tunique_data, dst_port);\n \n \tfill_items(items, flow_items, outer_ip_src, core_idx);\n \ndiff --git a/app/test-flow-perf/flow_gen.h b/app/test-flow-perf/flow_gen.h\nindex dc887fceae..2daebbe493 100644\n--- a/app/test-flow-perf/flow_gen.h\n+++ b/app/test-flow-perf/flow_gen.h\n@@ -34,6 +34,7 @@ generate_flow(uint16_t port_id,\n \tuint16_t hairpinq,\n \tuint64_t encap_data,\n \tuint64_t decap_data,\n+\tuint16_t dst_port,\n \tuint8_t core_idx,\n \tbool unique_data,\n \tstruct rte_flow_error *error);\ndiff --git a/app/test-flow-perf/main.c b/app/test-flow-perf/main.c\nindex 9be8edc31d..3a1eed3bcc 100644\n--- a/app/test-flow-perf/main.c\n+++ b/app/test-flow-perf/main.c\n@@ -56,6 +56,7 @@ static uint64_t flow_attrs[MAX_ATTRS_NUM];\n static uint8_t items_idx, actions_idx, attrs_idx;\n \n static uint64_t ports_mask;\n+static uint16_t dst_ports[RTE_MAX_ETHPORTS];\n static volatile bool force_quit;\n static bool dump_iterations;\n static bool delete_flag;\n@@ -163,6 +164,7 @@ usage(char *progname)\n \n \tprintf(\"To set flow actions:\\n\");\n \tprintf(\"  --port-id: add port-id action in flow actions\\n\");\n+\tprintf(\"  --dst-ports=N,M: add destination ports in port-id action\\n\");\n \tprintf(\"  --rss: add rss action in flow actions\\n\");\n \tprintf(\"  --queue: add queue action in flow actions\\n\");\n \tprintf(\"  --jump: add jump action in flow actions\\n\");\n@@ -219,6 +221,21 @@ usage(char *progname)\n \tprintf(\"  --vxlan-decap: add vxlan_decap action to flow actions\\n\");\n }\n \n+static inline int\n+has_port_id(void)\n+{\n+\tint i;\n+\n+\tfor (i = 0; i < MAX_ACTIONS_NUM; ++i) {\n+\t\tif (flow_actions[i] == 0)\n+\t\t\tbreak;\n+\t\tif (flow_actions[i]\n+\t\t\t& FLOW_ACTION_MASK(RTE_FLOW_ACTION_TYPE_PORT_ID))\n+\t\t\treturn 1;\n+\t}\n+\treturn 0;\n+}\n+\n static void\n args_parse(int argc, char **argv)\n {\n@@ -572,6 +589,7 @@ args_parse(int argc, char **argv)\n \t\t{ \"enable-fwd\",                 0, 0, 0 },\n \t\t{ \"unique-data\",                0, 0, 0 },\n \t\t{ \"portmask\",                   1, 0, 0 },\n+\t\t{ \"dst-ports\",                  1, 0, 0 },\n \t\t{ \"cores\",                      1, 0, 0 },\n \t\t/* Attributes */\n \t\t{ \"ingress\",                    0, 0, 0 },\n@@ -633,6 +651,9 @@ args_parse(int argc, char **argv)\n \tRTE_ETH_FOREACH_DEV(i)\n \t\tports_mask |= 1 << i;\n \n+\tfor (i = 0; i < RTE_MAX_ETHPORTS; i++)\n+\t\tdst_ports[i] = PORT_ID_DST;\n+\n \thairpin_queues_num = 0;\n \targvopt = argv;\n \n@@ -787,6 +808,22 @@ args_parse(int argc, char **argv)\n \t\t\t\t\trte_exit(EXIT_FAILURE, \"Invalid fwd port mask\\n\");\n \t\t\t\tports_mask = pm;\n \t\t\t}\n+\t\t\tif (strcmp(lgopts[opt_idx].name,\n+\t\t\t\t\t\"dst-ports\") == 0) {\n+\t\t\t\tuint16_t port_idx = 0;\n+\t\t\t\tchar *token;\n+\n+\t\t\t\tif (!has_port_id())\n+\t\t\t\t\trte_exit(EXIT_FAILURE,\n+\t\t\t\t\t\t\t\"Error: need add port-id action first\\n\"\n+\t\t\t\t\t\t\t\"dst-ports only can be used for port-id action\\n\");\n+\n+\t\t\t\ttoken = strtok(optarg, \",\");\n+\t\t\t\twhile (token != NULL) {\n+\t\t\t\t\tdst_ports[port_idx++] = atoi(token);\n+\t\t\t\t\ttoken = strtok(NULL, \",\");\n+\t\t\t\t}\n+\t\t\t}\n \t\t\tif (strcmp(lgopts[opt_idx].name, \"cores\") == 0) {\n \t\t\t\tn = atoi(optarg);\n \t\t\t\tif ((int) rte_lcore_count() <= n) {\n@@ -1128,7 +1165,7 @@ destroy_flows(int port_id, uint8_t core_id, struct rte_flow **flows_list)\n }\n \n static struct rte_flow **\n-insert_flows(int port_id, uint8_t core_id)\n+insert_flows(int port_id, uint8_t core_id, uint16_t dst_port_id)\n {\n \tstruct rte_flow **flows_list;\n \tstruct rte_flow_error error;\n@@ -1173,8 +1210,8 @@ insert_flows(int port_id, uint8_t core_id)\n \t\t * group 0 eth / end actions jump group <flow_group>\n \t\t */\n \t\tflow = generate_flow(port_id, 0, flow_attrs,\n-\t\t\tglobal_items, global_actions,\n-\t\t\tflow_group, 0, 0, 0, 0, core_id, unique_data, &error);\n+\t\t\tglobal_items, global_actions, flow_group, 0, 0, 0, 0,\n+\t\t\tdst_port_id, core_id, unique_data, &error);\n \n \t\tif (flow == NULL) {\n \t\t\tprint_flow_error(error);\n@@ -1189,7 +1226,7 @@ insert_flows(int port_id, uint8_t core_id)\n \t\t\tflow_attrs, flow_items, flow_actions,\n \t\t\tJUMP_ACTION_TABLE, counter,\n \t\t\thairpin_queues_num,\n-\t\t\tencap_data, decap_data,\n+\t\t\tencap_data, decap_data, dst_port_id,\n \t\t\tcore_id, unique_data, &error);\n \n \t\tif (!counter) {\n@@ -1250,6 +1287,7 @@ static void\n flows_handler(uint8_t core_id)\n {\n \tstruct rte_flow **flows_list;\n+\tuint16_t port_idx = 0;\n \tuint16_t nr_ports;\n \tint port_id;\n \n@@ -1269,7 +1307,7 @@ flows_handler(uint8_t core_id)\n \t\tmc_pool.last_alloc[core_id] = (int64_t)dump_socket_mem(stdout);\n \t\tif (has_meter())\n \t\t\tmeters_handler(port_id, core_id, METER_CREATE);\n-\t\tflows_list = insert_flows(port_id, core_id);\n+\t\tflows_list = insert_flows(port_id, core_id, dst_ports[port_idx++]);\n \t\tif (flows_list == NULL)\n \t\t\trte_exit(EXIT_FAILURE, \"Error: Insertion Failed!\\n\");\n \t\tmc_pool.current_alloc[core_id] = (int64_t)dump_socket_mem(stdout);\ndiff --git a/doc/guides/tools/flow-perf.rst b/doc/guides/tools/flow-perf.rst\nindex 280bf7e0e0..23047b4bdf 100644\n--- a/doc/guides/tools/flow-perf.rst\n+++ b/doc/guides/tools/flow-perf.rst\n@@ -96,6 +96,12 @@ The command line options are:\n *\t``--portmask=N``\n \thexadecimal bitmask of ports to be used.\n \n+*      ``--dst-ports=N,M``\n+       Destination ports for ports with port-id action, the number of values\n+       must be the same with number of set bits in portmask, and the parameter\n+       is only valid for port-id action. The parameter is not MUST, the value\n+       is by default 1 as before if not provided.\n+\n *\t``--cores=N``\n \tSet the number of needed cores to insert/delete rte_flow rules.\n \tDefault cores count is 1.\n",
    "prefixes": []
}