get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 139247,
    "url": "http://patchwork.dpdk.org/api/patches/139247/?format=api",
    "web_url": "http://patchwork.dpdk.org/project/dpdk/patch/20240412122006.101673-1-vojanec@cesnet.cz/",
    "project": {
        "id": 1,
        "url": "http://patchwork.dpdk.org/api/projects/1/?format=api",
        "name": "DPDK",
        "link_name": "dpdk",
        "list_id": "dev.dpdk.org",
        "list_email": "dev@dpdk.org",
        "web_url": "http://core.dpdk.org",
        "scm_url": "git://dpdk.org/dpdk",
        "webscm_url": "http://git.dpdk.org/dpdk",
        "list_archive_url": "https://inbox.dpdk.org/dev",
        "list_archive_url_format": "https://inbox.dpdk.org/dev/{}",
        "commit_url_format": ""
    },
    "msgid": "<20240412122006.101673-1-vojanec@cesnet.cz>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20240412122006.101673-1-vojanec@cesnet.cz",
    "date": "2024-04-12T12:20:05",
    "name": "[1/2] net/bonding: introduce direct link bonding mode",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": false,
    "hash": "0302ce59e47a7cc837987ba81fbe0e0312d073ff",
    "submitter": {
        "id": 2811,
        "url": "http://patchwork.dpdk.org/api/people/2811/?format=api",
        "name": "Kamil Vojanec",
        "email": "vojanec@cesnet.cz"
    },
    "delegate": {
        "id": 319,
        "url": "http://patchwork.dpdk.org/api/users/319/?format=api",
        "username": "fyigit",
        "first_name": "Ferruh",
        "last_name": "Yigit",
        "email": "ferruh.yigit@amd.com"
    },
    "mbox": "http://patchwork.dpdk.org/project/dpdk/patch/20240412122006.101673-1-vojanec@cesnet.cz/mbox/",
    "series": [
        {
            "id": 31732,
            "url": "http://patchwork.dpdk.org/api/series/31732/?format=api",
            "web_url": "http://patchwork.dpdk.org/project/dpdk/list/?series=31732",
            "date": "2024-04-12T12:20:05",
            "name": "[1/2] net/bonding: introduce direct link bonding mode",
            "version": 1,
            "mbox": "http://patchwork.dpdk.org/series/31732/mbox/"
        }
    ],
    "comments": "http://patchwork.dpdk.org/api/patches/139247/comments/",
    "check": "warning",
    "checks": "http://patchwork.dpdk.org/api/patches/139247/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 57D8A43E52;\n\tFri, 12 Apr 2024 14:20:26 +0200 (CEST)",
            "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 2F922402A8;\n\tFri, 12 Apr 2024 14:20:26 +0200 (CEST)",
            "from office2.cesnet.cz (office2.cesnet.cz [78.128.248.237])\n by mails.dpdk.org (Postfix) with ESMTP id 3E5A5402A2\n for <dev@dpdk.org>; Fri, 12 Apr 2024 14:20:24 +0200 (CEST)",
            "from dpdk-test6.liberouter.org (rt-tmc-kou.liberouter.org\n [195.113.172.126])\n (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest\n SHA256)\n (No client certificate requested)\n by office2.cesnet.cz (Postfix) with ESMTPSA id 7130C118007D;\n Fri, 12 Apr 2024 14:20:20 +0200 (CEST)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=cesnet.cz;\n s=office2-2020; t=1712924423;\n bh=QogO9VDUF4X3sq1QbeTDIypP0jMJtEUbLwo6y4TNRBw=;\n h=From:To:Cc:Subject:Date;\n b=UQ06Su2SE8/FWdQfTcOgIxDTib2M9w8AHzI3RZNrYBj138+gBz5aO3qfgpDrzKabM\n u6SgHEpeubOv+d3Yw9bpRTJwh8or8XcOoNOcy7IGZgyKBuL83dfMcGYQQv6QT7+E+0\n ptatrbM7Xvj5Wu833IlQuAcdXwhd2uolHIgqwlL/jzy/I0xMLfBAHsrYmEXrCTyA9H\n Wtdt2bU+UCe84/qHpgr3NV58L4qVYrY1K49J+CAMre6puFYGnRUE+NZG8mqCowI3XT\n 4diT4D/yudvwWdpqVySxbGUoEI2Q7twKflf4VxHc+Aku3mByah1SG+/8WuRa5WCuI3\n hG3zxxO7AXnfQ==",
        "From": "Kamil Vojanec <vojanec@cesnet.cz>",
        "To": "dev@dpdk.org",
        "Cc": "Kamil Vojanec <vojanec@cesnet.cz>, Chas Williams <chas3@att.com>,\n \"Min Hu (Connor)\" <humin29@huawei.com>",
        "Subject": "[PATCH 1/2] net/bonding: introduce direct link bonding mode",
        "Date": "Fri, 12 Apr 2024 14:20:05 +0200",
        "Message-Id": "<20240412122006.101673-1-vojanec@cesnet.cz>",
        "X-Mailer": "git-send-email 2.39.3",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.29",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n <mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n <mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org"
    },
    "content": "This patch adds a new bonding mode: 'direct'. The purpose of this mode\nis to redirect output packets to the same member port on which they were\nreceived. In case the requested port is not among the member ports,\nround robin TX mode is used as a fallback.\n\nSigned-off-by: Kamil Vojanec <vojanec@cesnet.cz>\n---\n app/test/test_link_bonding.c            | 208 ++++++++++++++++++++++++\n drivers/net/bonding/rte_eth_bond.h      |   5 +\n drivers/net/bonding/rte_eth_bond_args.c |   1 +\n drivers/net/bonding/rte_eth_bond_pmd.c  |  50 +++++-\n 4 files changed, 261 insertions(+), 3 deletions(-)",
    "diff": "diff --git a/app/test/test_link_bonding.c b/app/test/test_link_bonding.c\nindex 4d54706c21..2f47bb0d8d 100644\n--- a/app/test/test_link_bonding.c\n+++ b/app/test/test_link_bonding.c\n@@ -2134,6 +2134,211 @@ test_roundrobin_verify_polling_member_link_status_change(void)\n \treturn remove_members_and_stop_bonding_device();\n }\n \n+/** Direct mode Tests */\n+\n+static int\n+test_direct_tx_burst_single_member(void)\n+{\n+\tunsigned int i;\n+\tint member_port_id;\n+\tstruct rte_eth_stats port_stats;\n+\tstruct rte_mbuf *pkts[MAX_PKT_BURST];\n+\tconst unsigned int burst_size = 20;\n+\n+\tTEST_ASSERT(burst_size <= MAX_PKT_BURST,\n+\t\t\t\"Burst size specified is greater than supported.\");\n+\n+\tTEST_ASSERT_SUCCESS(initialize_bonding_device_with_members(\n+\t\t\tBONDING_MODE_DIRECT, 0, 1, 1),\n+\t\t\t\"Failed to initialize bonding device with single member\");\n+\n+\t/* Generate burst of test packets */\n+\tTEST_ASSERT_EQUAL(generate_test_burst(pkts, burst_size, 0, 1, 0, 0, 0),\n+\t\t\t(int) burst_size, \"Failed to generate test burst\");\n+\n+\tmember_port_id = test_params->member_port_ids[0];\n+\n+\t/* Set the 'port' mbuf attribute to the appropriate value */\n+\tfor (i = 0; i < burst_size; i++) {\n+\t\tpkts[i]->port = member_port_id;\n+\t}\n+\n+\t/* Send burst on bonding port */\n+\tTEST_ASSERT_EQUAL(rte_eth_tx_burst(\n+\t\t\ttest_params->bonding_port_id, 0, pkts, burst_size),\n+\t\t\tburst_size,\n+\t\t\t\"TX burst failed\");\n+\n+\t/* Verify stats on bonding port */\n+\trte_eth_stats_get(test_params->bonding_port_id, &port_stats);\n+\tTEST_ASSERT_EQUAL(port_stats.opackets, burst_size,\n+\t\t\t\"Bonding port (%d) opackets value (%u) not as expeected (%u)\\n\",\n+\t\t\ttest_params->bonding_port_id, (unsigned int) port_stats.opackets,\n+\t\t\tburst_size);\n+\n+\t/* Verify stats on member port */\n+\trte_eth_stats_get(member_port_id, &port_stats);\n+\tTEST_ASSERT_EQUAL(port_stats.opackets, burst_size,\n+\t\t\t\"Member port (%d) opackets value (%u) not as expeected (%u)\\n\",\n+\t\t\tmember_port_id, (unsigned int) port_stats.opackets,\n+\t\t\tburst_size);\n+\n+\t/* Put all members down and try to transmit */\n+\tvirtual_ethdev_simulate_link_status_interrupt(member_port_id, 0);\n+\n+\t/* Try to send burst on bonding port */\n+\tTEST_ASSERT_EQUAL(rte_eth_tx_burst(test_params->bonding_port_id, 0,\n+\t\t\tpkts, burst_size), 0,\n+\t\t\t\"TX burst returned unexpected value\");\n+\n+\t/* Clean up and remove members from bonding device */\n+\treturn remove_members_and_stop_bonding_device();\n+}\n+\n+static int\n+test_direct_tx_burst_multiple_members_single_tx(void)\n+{\n+\tunsigned int i;\n+\tstruct rte_eth_stats port_stats;\n+\tstruct rte_mbuf *pkts[MAX_PKT_BURST];\n+\tconst unsigned int num_members = 4;\n+\tconst unsigned int burst_size = 20;\n+\tconst int exp_member_port_id = test_params->member_port_ids[0];\n+\tint cmember_port_id;\n+\tunsigned int expected_pkts;\n+\n+\n+\tTEST_ASSERT(burst_size <= MAX_PKT_BURST,\n+\t\t\t\"Burst size specified is greater than supported.\");\n+\n+\tTEST_ASSERT_SUCCESS(initialize_bonding_device_with_members(\n+\t\t\tBONDING_MODE_DIRECT, 0, num_members, 1),\n+\t\t\t\"Failed to initialize bonding device with single member\");\n+\n+\t/* Generate burst of test packets */\n+\tTEST_ASSERT_EQUAL(generate_test_burst(\n+\t\t\tpkts, burst_size, 0, 1, 0, 0, 0),\n+\t\t\t(int) burst_size,\n+\t\t\t\"Failed to generate test burst\");\n+\n+\n+\t/* Set the 'port' mbuf attribute to the appropriate value */\n+\tfor (i = 0; i < burst_size; i++) {\n+\t\tpkts[i]->port = exp_member_port_id;\n+\t}\n+\n+\t/* Send burst on bonding port */\n+\tTEST_ASSERT_EQUAL(rte_eth_tx_burst(\n+\t\t\ttest_params->bonding_port_id, 0, pkts, burst_size),\n+\t\t\tburst_size,\n+\t\t\t\"TX burst failed\");\n+\n+\t/* Verify stats on bonding port */\n+\trte_eth_stats_get(test_params->bonding_port_id, &port_stats);\n+\tTEST_ASSERT_EQUAL(port_stats.opackets, burst_size,\n+\t\t\t\"Bonding port (%d) opackets value (%u) not as expeected (%u)\\n\",\n+\t\t\ttest_params->bonding_port_id, (unsigned int) port_stats.opackets,\n+\t\t\tburst_size);\n+\n+\t/* Verify member ports tx stats */\n+\tfor (i = 0; i < test_params->bonding_member_count; i++) {\n+\t\tcmember_port_id = test_params->member_port_ids[i];\n+\n+\t\tif (cmember_port_id == exp_member_port_id)\n+\t\t\texpected_pkts = burst_size;\n+\t\telse\n+\t\t\texpected_pkts = 0;\n+\n+\t\trte_eth_stats_get(cmember_port_id, &port_stats);\n+\t\tTEST_ASSERT_EQUAL(port_stats.opackets,\n+\t\t\t\t(uint64_t)expected_pkts,\n+\t\t\t\t\"Member Port (%d) opackets value (%u) not as expected (%u)\\n\",\n+\t\t\t\ttest_params->bonding_port_id, (unsigned int)port_stats.opackets,\n+\t\t\t\texpected_pkts);\n+\t}\n+\n+\t/* Put all members down and try and transmit */\n+\tfor (i = 0; i < test_params->bonding_member_count; i++) {\n+\t\tvirtual_ethdev_simulate_link_status_interrupt(\n+\t\t\t\ttest_params->member_port_ids[i], 0);\n+\t}\n+\n+\t/* Try to send burst on bonding port */\n+\tTEST_ASSERT_EQUAL(rte_eth_tx_burst(test_params->bonding_port_id, 0,\n+\t\t\tpkts, burst_size), 0,\n+\t\t\t\"TX burst returned unexpected value\");\n+\n+\t/* Clean up and remove members from bonding device */\n+\treturn remove_members_and_stop_bonding_device();\n+}\n+\n+static int\n+test_direct_tx_burst_multiple_members_rr_fallback(void)\n+{\n+\tunsigned int i;\n+\tstruct rte_eth_stats port_stats;\n+\tstruct rte_mbuf *pkts[MAX_PKT_BURST];\n+\tconst unsigned int num_members = 4;\n+\tconst unsigned int pkts_per_member = 20;\n+\tconst unsigned int burst_size = num_members * pkts_per_member;\n+\n+\n+\tTEST_ASSERT(burst_size <= MAX_PKT_BURST,\n+\t\t\t\"Burst size specified is greater than supported.\");\n+\n+\tTEST_ASSERT_SUCCESS(initialize_bonding_device_with_members(\n+\t\t\tBONDING_MODE_DIRECT, 0, num_members, 1),\n+\t\t\t\"Failed to initialize bonding device with single member\");\n+\n+\t/* Generate burst of test packets */\n+\tTEST_ASSERT_EQUAL(generate_test_burst(\n+\t\t\tpkts, burst_size, 0, 1, 0, 0, 0),\n+\t\t\t(int) burst_size,\n+\t\t\t\"Failed to generate test burst\");\n+\n+\n+\t/* Set the 'port' mbuf attribute to the appropriate value */\n+\tfor (i = 0; i < burst_size; i++) {\n+\t\tpkts[i]->port = RTE_MAX_ETHPORTS;\n+\t}\n+\n+\t/* Send burst on bonding port */\n+\tTEST_ASSERT_EQUAL(rte_eth_tx_burst(\n+\t\t\ttest_params->bonding_port_id, 0, pkts, burst_size),\n+\t\t\tburst_size,\n+\t\t\t\"TX burst failed\");\n+\n+\t/* Verify stats on bonding port */\n+\trte_eth_stats_get(test_params->bonding_port_id, &port_stats);\n+\tTEST_ASSERT_EQUAL(port_stats.opackets, burst_size,\n+\t\t\t\"Bonding port (%d) opackets value (%u) not as expeected (%u)\\n\",\n+\t\t\ttest_params->bonding_port_id, (unsigned int) port_stats.opackets,\n+\t\t\tburst_size);\n+\n+\t/* Verify member ports tx stats */\n+\tfor (i = 0; i < test_params->bonding_member_count; i++) {\n+\t\trte_eth_stats_get(test_params->member_port_ids[i], &port_stats);\n+\t\tTEST_ASSERT_EQUAL(port_stats.opackets,\n+\t\t\t\t(uint64_t)pkts_per_member,\n+\t\t\t\t\"Member Port (%d) opackets value (%u) not as expected (%u)\\n\",\n+\t\t\t\ttest_params->bonding_port_id, (unsigned int)port_stats.opackets,\n+\t\t\t\tpkts_per_member);\n+\t}\n+\n+\t/* Put all members down and try and transmit */\n+\tfor (i = 0; i < test_params->bonding_member_count; i++) {\n+\t\tvirtual_ethdev_simulate_link_status_interrupt(\n+\t\t\t\ttest_params->member_port_ids[i], 0);\n+\t}\n+\n+\t/* Try to send burst on bonding port */\n+\tTEST_ASSERT_EQUAL(rte_eth_tx_burst(test_params->bonding_port_id, 0,\n+\t\t\tpkts, burst_size), 0,\n+\t\t\t\"TX burst returned unexpected value\");\n+\n+\t/* Clean up and remove members from bonding device */\n+\treturn remove_members_and_stop_bonding_device();\n+}\n \n /** Active Backup Mode Tests */\n \n@@ -5174,6 +5379,9 @@ static struct unit_test_suite link_bonding_test_suite  = {\n \t\tTEST_CASE(test_roundrobin_verify_mac_assignment),\n \t\tTEST_CASE(test_roundrobin_verify_member_link_status_change_behaviour),\n \t\tTEST_CASE(test_roundrobin_verify_polling_member_link_status_change),\n+\t\tTEST_CASE(test_direct_tx_burst_single_member),\n+\t\tTEST_CASE(test_direct_tx_burst_multiple_members_single_tx),\n+\t\tTEST_CASE(test_direct_tx_burst_multiple_members_rr_fallback),\n \t\tTEST_CASE(test_activebackup_tx_burst),\n \t\tTEST_CASE(test_activebackup_rx_burst),\n \t\tTEST_CASE(test_activebackup_verify_promiscuous_enable_disable),\ndiff --git a/drivers/net/bonding/rte_eth_bond.h b/drivers/net/bonding/rte_eth_bond.h\nindex f10165f2c6..82d6644500 100644\n--- a/drivers/net/bonding/rte_eth_bond.h\n+++ b/drivers/net/bonding/rte_eth_bond.h\n@@ -83,6 +83,11 @@ extern \"C\" {\n  * information from it. When ARP reply from that peer is received, its MAC is\n  * stored, one of member MACs assigned and ARP reply send to that peer.\n  */\n+#define BONDING_MODE_DIRECT\t(7)\n+/**< Direct bonding mode (Mode 7)\n+ * In this mode, all packets are transmitted using the same member port on which\n+ * it was received. This is decided based on the 'port' field of 'rte_mbuf'.\n+ */\n \n /* Balance Mode Transmit Policies */\n #define BALANCE_XMIT_POLICY_LAYER2\t\t(0)\ndiff --git a/drivers/net/bonding/rte_eth_bond_args.c b/drivers/net/bonding/rte_eth_bond_args.c\nindex bdec5d61d4..44e20568db 100644\n--- a/drivers/net/bonding/rte_eth_bond_args.c\n+++ b/drivers/net/bonding/rte_eth_bond_args.c\n@@ -158,6 +158,7 @@ bond_ethdev_parse_member_mode_kvarg(const char *key __rte_unused,\n \tcase BONDING_MODE_8023AD:\n \tcase BONDING_MODE_TLB:\n \tcase BONDING_MODE_ALB:\n+\tcase BONDING_MODE_DIRECT:\n \t\treturn 0;\n \tdefault:\n \t\tRTE_BOND_LOG(ERR, \"Invalid member mode value (%s) specified\", value);\ndiff --git a/drivers/net/bonding/rte_eth_bond_pmd.c b/drivers/net/bonding/rte_eth_bond_pmd.c\nindex c40d18d128..57ac5879c4 100644\n--- a/drivers/net/bonding/rte_eth_bond_pmd.c\n+++ b/drivers/net/bonding/rte_eth_bond_pmd.c\n@@ -578,9 +578,14 @@ bond_ethdev_rx_burst_alb(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts)\n \treturn nb_recv_pkts;\n }\n \n+enum tx_member_populate_mode {\n+\tRR_ONLY,\n+\tDIRECT_WITH_RR_FALLBACK,\n+};\n+\n static uint16_t\n-bond_ethdev_tx_burst_round_robin(void *queue, struct rte_mbuf **bufs,\n-\t\tuint16_t nb_pkts)\n+bond_ethdev_tx_burst_rr_generic(void *queue, struct rte_mbuf **bufs,\n+\t\tuint16_t nb_pkts, enum tx_member_populate_mode pop_mode)\n {\n \tstruct bond_dev_private *internals;\n \tstruct bond_tx_queue *bd_tx_q;\n@@ -594,7 +599,7 @@ bond_ethdev_tx_burst_round_robin(void *queue, struct rte_mbuf **bufs,\n \tuint16_t num_tx_total = 0, num_tx_member;\n \n \tstatic int member_idx;\n-\tint i, cmember_idx = 0, tx_fail_total = 0;\n+\tint i, j, cmember_idx = 0, tx_fail_total = 0;\n \n \tbd_tx_q = (struct bond_tx_queue *)queue;\n \tinternals = bd_tx_q->dev_private;\n@@ -611,6 +616,17 @@ bond_ethdev_tx_burst_round_robin(void *queue, struct rte_mbuf **bufs,\n \t/* Populate members mbuf with which packets are to be sent on it  */\n \tfor (i = 0; i < nb_pkts; i++) {\n \t\tcmember_idx = (member_idx + i) % num_of_members;\n+\n+\t\tif (pop_mode == DIRECT_WITH_RR_FALLBACK) {\n+\t\t\t/* Try to find correct member index */\n+\t\t\tfor (j = 0; j < num_of_members; j++) {\n+\t\t\t\tif (bufs[i]->port == members[j]) {\n+\t\t\t\t\tcmember_idx = j;\n+\t\t\t\t\tbreak;\n+\t\t\t\t}\n+\t\t\t}\n+\t\t}\n+\n \t\tmember_bufs[cmember_idx][(member_nb_pkts[cmember_idx])++] = bufs[i];\n \t}\n \n@@ -646,6 +662,20 @@ bond_ethdev_tx_burst_round_robin(void *queue, struct rte_mbuf **bufs,\n \treturn num_tx_total;\n }\n \n+static uint16_t\n+bond_ethdev_tx_burst_round_robin(void *queue, struct rte_mbuf **bufs,\n+\t\tuint16_t nb_pkts)\n+{\n+\treturn bond_ethdev_tx_burst_rr_generic(queue, bufs, nb_pkts, RR_ONLY);\n+}\n+\n+static uint16_t\n+bond_ethdev_tx_burst_direct(void *queue, struct rte_mbuf **bufs,\n+\t\tuint16_t nb_pkts)\n+{\n+\treturn bond_ethdev_tx_burst_rr_generic(queue, bufs, nb_pkts, DIRECT_WITH_RR_FALLBACK);\n+}\n+\n static uint16_t\n bond_ethdev_tx_burst_active_backup(void *queue,\n \t\tstruct rte_mbuf **bufs, uint16_t nb_pkts)\n@@ -1551,6 +1581,7 @@ mac_address_members_update(struct rte_eth_dev *bonding_eth_dev)\n \tcase BONDING_MODE_ROUND_ROBIN:\n \tcase BONDING_MODE_BALANCE:\n \tcase BONDING_MODE_BROADCAST:\n+\tcase BONDING_MODE_DIRECT:\n \t\tfor (i = 0; i < internals->member_count; i++) {\n \t\t\tif (rte_eth_dev_default_mac_addr_set(\n \t\t\t\t\tinternals->members[i].port_id,\n@@ -1648,6 +1679,10 @@ bond_ethdev_mode_set(struct rte_eth_dev *eth_dev, uint8_t mode)\n \t\teth_dev->tx_pkt_burst = bond_ethdev_tx_burst_alb;\n \t\teth_dev->rx_pkt_burst = bond_ethdev_rx_burst_alb;\n \t\tbreak;\n+\tcase BONDING_MODE_DIRECT:\n+\t\teth_dev->tx_pkt_burst = bond_ethdev_tx_burst_direct;\n+\t\teth_dev->rx_pkt_burst = bond_ethdev_rx_burst;\n+\t\tbreak;\n \tdefault:\n \t\treturn -1;\n \t}\n@@ -2581,6 +2616,7 @@ bond_ethdev_link_update(struct rte_eth_dev *ethdev, int wait_to_complete)\n \tcase BONDING_MODE_BALANCE:\n \tcase BONDING_MODE_TLB:\n \tcase BONDING_MODE_ALB:\n+\tcase BONDING_MODE_DIRECT:\n \tdefault:\n \t\t/**\n \t\t * In theses mode the maximum theoretical link speed is the sum\n@@ -2678,6 +2714,7 @@ bond_ethdev_promiscuous_enable(struct rte_eth_dev *eth_dev)\n \tcase BONDING_MODE_ROUND_ROBIN:\n \tcase BONDING_MODE_BALANCE:\n \tcase BONDING_MODE_BROADCAST:\n+\tcase BONDING_MODE_DIRECT:\n \tcase BONDING_MODE_8023AD: {\n \t\tunsigned int member_ok = 0;\n \n@@ -2732,6 +2769,7 @@ bond_ethdev_promiscuous_disable(struct rte_eth_dev *dev)\n \tcase BONDING_MODE_ROUND_ROBIN:\n \tcase BONDING_MODE_BALANCE:\n \tcase BONDING_MODE_BROADCAST:\n+\tcase BONDING_MODE_DIRECT:\n \tcase BONDING_MODE_8023AD: {\n \t\tunsigned int member_ok = 0;\n \n@@ -2790,6 +2828,7 @@ bond_ethdev_promiscuous_update(struct rte_eth_dev *dev)\n \tcase BONDING_MODE_BALANCE:\n \tcase BONDING_MODE_BROADCAST:\n \tcase BONDING_MODE_8023AD:\n+\tcase BONDING_MODE_DIRECT:\n \t\t/* As promiscuous mode is propagated to all members for these\n \t\t * mode, no need to update for bonding device.\n \t\t */\n@@ -2825,6 +2864,7 @@ bond_ethdev_allmulticast_enable(struct rte_eth_dev *eth_dev)\n \tcase BONDING_MODE_ROUND_ROBIN:\n \tcase BONDING_MODE_BALANCE:\n \tcase BONDING_MODE_BROADCAST:\n+\tcase BONDING_MODE_DIRECT:\n \tcase BONDING_MODE_8023AD: {\n \t\tunsigned int member_ok = 0;\n \n@@ -2879,6 +2919,7 @@ bond_ethdev_allmulticast_disable(struct rte_eth_dev *eth_dev)\n \tcase BONDING_MODE_ROUND_ROBIN:\n \tcase BONDING_MODE_BALANCE:\n \tcase BONDING_MODE_BROADCAST:\n+\tcase BONDING_MODE_DIRECT:\n \tcase BONDING_MODE_8023AD: {\n \t\tunsigned int member_ok = 0;\n \n@@ -2936,6 +2977,7 @@ bond_ethdev_allmulticast_update(struct rte_eth_dev *dev)\n \tcase BONDING_MODE_BALANCE:\n \tcase BONDING_MODE_BROADCAST:\n \tcase BONDING_MODE_8023AD:\n+\tcase BONDING_MODE_DIRECT:\n \t\t/* As allmulticast mode is propagated to all members for these\n \t\t * mode, no need to update for bonding device.\n \t\t */\n@@ -3365,6 +3407,8 @@ bond_mode_name(uint8_t mode)\n \t\treturn \"TLB\";\n \tcase BONDING_MODE_ALB:\n \t\treturn \"ALB\";\n+\tcase BONDING_MODE_DIRECT:\n+\t\treturn \"DIRECT\";\n \tdefault:\n \t\treturn \"Unknown\";\n \t}\n",
    "prefixes": [
        "1/2"
    ]
}