From: David Marchand <david.marchand@redhat.com>
To: dev@dpdk.org
Cc: thomas@monjalon.net, Xiaoyun Li <xiaoyun.li@intel.com>,
Aman Singh <aman.deep.singh@intel.com>,
Yuying Zhang <yuying.zhang@intel.com>,
Chas Williams <chas3@att.com>,
"Min Hu (Connor)" <humin29@huawei.com>
Subject: [RFC PATCH v2 3/5] net/bonding: move testpmd commands
Date: Wed, 18 May 2022 21:46:47 +0200 [thread overview]
Message-ID: <20220518194649.1868574-4-david.marchand@redhat.com> (raw)
In-Reply-To: <20220518194649.1868574-1-david.marchand@redhat.com>
Move related specific testpmd commands into this driver directory.
While at it, fix checkpatch warnings.
Signed-off-by: David Marchand <david.marchand@redhat.com>
---
app/test-pmd/cmdline.c | 1035 -------------------
app/test-pmd/meson.build | 3 -
drivers/net/bonding/meson.build | 1 +
drivers/net/bonding/rte_eth_bond_testpmd.c | 1037 ++++++++++++++++++++
4 files changed, 1038 insertions(+), 1038 deletions(-)
create mode 100644 drivers/net/bonding/rte_eth_bond_testpmd.c
diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index 9de7ecdab7..58bdf206d7 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -47,10 +47,6 @@
#include <cmdline_parse_etheraddr.h>
#include <cmdline_socket.h>
#include <cmdline.h>
-#ifdef RTE_NET_BOND
-#include <rte_eth_bond.h>
-#include <rte_eth_bond_8023ad.h>
-#endif
#if defined RTE_BUS_DPAA && defined RTE_NET_DPAA
#include <rte_pmd_dpaa.h>
#endif
@@ -614,44 +610,6 @@ static void cmd_help_long_parsed(void *parsed_result,
" Show the bypass configuration for a bypass enabled NIC"
" using the lowest port on the NIC.\n\n"
-#ifdef RTE_NET_BOND
- "create bonded device (mode) (socket)\n"
- " Create a new bonded device with specific bonding mode and socket.\n\n"
-
- "add bonding slave (slave_id) (port_id)\n"
- " Add a slave device to a bonded device.\n\n"
-
- "remove bonding slave (slave_id) (port_id)\n"
- " Remove a slave device from a bonded device.\n\n"
-
- "set bonding mode (value) (port_id)\n"
- " Set the bonding mode on a bonded device.\n\n"
-
- "set bonding primary (slave_id) (port_id)\n"
- " Set the primary slave for a bonded device.\n\n"
-
- "show bonding config (port_id)\n"
- " Show the bonding config for port_id.\n\n"
-
- "show bonding lacp info (port_id)\n"
- " Show the bonding lacp information for port_id.\n\n"
-
- "set bonding mac_addr (port_id) (address)\n"
- " Set the MAC address of a bonded device.\n\n"
-
- "set bonding mode IEEE802.3AD aggregator policy (port_id) (agg_name)"
- " Set Aggregation mode for IEEE802.3AD (mode 4)"
-
- "set bonding balance_xmit_policy (port_id) (l2|l23|l34)\n"
- " Set the transmit balance policy for bonded device running in balance mode.\n\n"
-
- "set bonding mon_period (port_id) (value)\n"
- " Set the bonding link status monitoring polling period in ms.\n\n"
-
- "set bonding lacp dedicated_queues <port_id> (enable|disable)\n"
- " Enable/disable dedicated queues for LACP control traffic.\n\n"
-
-#endif
"set link-up port (port_id)\n"
" Set link up for a port.\n\n"
@@ -5921,985 +5879,6 @@ static cmdline_parse_inst_t cmd_show_bypass_config = {
},
};
-#ifdef RTE_NET_BOND
-/* *** SET BONDING MODE *** */
-struct cmd_set_bonding_mode_result {
- cmdline_fixed_string_t set;
- cmdline_fixed_string_t bonding;
- cmdline_fixed_string_t mode;
- uint8_t value;
- portid_t port_id;
-};
-
-static void cmd_set_bonding_mode_parsed(void *parsed_result,
- __rte_unused struct cmdline *cl,
- __rte_unused void *data)
-{
- struct cmd_set_bonding_mode_result *res = parsed_result;
- portid_t port_id = res->port_id;
- struct rte_port *port = &ports[port_id];
-
- /*
- * Bonding mode changed means resources of device changed, like whether
- * started rte timer or not. Device should be restarted when resources
- * of device changed.
- */
- if (port->port_status != RTE_PORT_STOPPED) {
- fprintf(stderr,
- "\t Error: Can't set bonding mode when port %d is not stopped\n",
- port_id);
- return;
- }
-
- /* Set the bonding mode for the relevant port. */
- if (0 != rte_eth_bond_mode_set(port_id, res->value))
- fprintf(stderr, "\t Failed to set bonding mode for port = %d.\n",
- port_id);
-}
-
-static cmdline_parse_token_string_t cmd_setbonding_mode_set =
-TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_mode_result,
- set, "set");
-static cmdline_parse_token_string_t cmd_setbonding_mode_bonding =
-TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_mode_result,
- bonding, "bonding");
-static cmdline_parse_token_string_t cmd_setbonding_mode_mode =
-TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_mode_result,
- mode, "mode");
-static cmdline_parse_token_num_t cmd_setbonding_mode_value =
-TOKEN_NUM_INITIALIZER(struct cmd_set_bonding_mode_result,
- value, RTE_UINT8);
-static cmdline_parse_token_num_t cmd_setbonding_mode_port =
-TOKEN_NUM_INITIALIZER(struct cmd_set_bonding_mode_result,
- port_id, RTE_UINT16);
-
-static cmdline_parse_inst_t cmd_set_bonding_mode = {
- .f = cmd_set_bonding_mode_parsed,
- .help_str = "set bonding mode <mode_value> <port_id>: "
- "Set the bonding mode for port_id",
- .data = NULL,
- .tokens = {
- (void *) &cmd_setbonding_mode_set,
- (void *) &cmd_setbonding_mode_bonding,
- (void *) &cmd_setbonding_mode_mode,
- (void *) &cmd_setbonding_mode_value,
- (void *) &cmd_setbonding_mode_port,
- NULL
- }
-};
-
-/* *** SET BONDING SLOW_QUEUE SW/HW *** */
-struct cmd_set_bonding_lacp_dedicated_queues_result {
- cmdline_fixed_string_t set;
- cmdline_fixed_string_t bonding;
- cmdline_fixed_string_t lacp;
- cmdline_fixed_string_t dedicated_queues;
- portid_t port_id;
- cmdline_fixed_string_t mode;
-};
-
-static void cmd_set_bonding_lacp_dedicated_queues_parsed(void *parsed_result,
- __rte_unused struct cmdline *cl,
- __rte_unused void *data)
-{
- struct cmd_set_bonding_lacp_dedicated_queues_result *res = parsed_result;
- portid_t port_id = res->port_id;
- struct rte_port *port;
-
- port = &ports[port_id];
-
- /** Check if the port is not started **/
- if (port->port_status != RTE_PORT_STOPPED) {
- fprintf(stderr, "Please stop port %d first\n", port_id);
- return;
- }
-
- if (!strcmp(res->mode, "enable")) {
- if (rte_eth_bond_8023ad_dedicated_queues_enable(port_id) == 0)
- printf("Dedicate queues for LACP control packets"
- " enabled\n");
- else
- printf("Enabling dedicate queues for LACP control "
- "packets on port %d failed\n", port_id);
- } else if (!strcmp(res->mode, "disable")) {
- if (rte_eth_bond_8023ad_dedicated_queues_disable(port_id) == 0)
- printf("Dedicated queues for LACP control packets "
- "disabled\n");
- else
- printf("Disabling dedicated queues for LACP control "
- "traffic on port %d failed\n", port_id);
- }
-}
-
-static cmdline_parse_token_string_t cmd_setbonding_lacp_dedicated_queues_set =
-TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_lacp_dedicated_queues_result,
- set, "set");
-static cmdline_parse_token_string_t cmd_setbonding_lacp_dedicated_queues_bonding =
-TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_lacp_dedicated_queues_result,
- bonding, "bonding");
-static cmdline_parse_token_string_t cmd_setbonding_lacp_dedicated_queues_lacp =
-TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_lacp_dedicated_queues_result,
- lacp, "lacp");
-static cmdline_parse_token_string_t cmd_setbonding_lacp_dedicated_queues_dedicated_queues =
-TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_lacp_dedicated_queues_result,
- dedicated_queues, "dedicated_queues");
-static cmdline_parse_token_num_t cmd_setbonding_lacp_dedicated_queues_port_id =
-TOKEN_NUM_INITIALIZER(struct cmd_set_bonding_lacp_dedicated_queues_result,
- port_id, RTE_UINT16);
-static cmdline_parse_token_string_t cmd_setbonding_lacp_dedicated_queues_mode =
-TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_lacp_dedicated_queues_result,
- mode, "enable#disable");
-
-static cmdline_parse_inst_t cmd_set_lacp_dedicated_queues = {
- .f = cmd_set_bonding_lacp_dedicated_queues_parsed,
- .help_str = "set bonding lacp dedicated_queues <port_id> "
- "enable|disable: "
- "Enable/disable dedicated queues for LACP control traffic for port_id",
- .data = NULL,
- .tokens = {
- (void *)&cmd_setbonding_lacp_dedicated_queues_set,
- (void *)&cmd_setbonding_lacp_dedicated_queues_bonding,
- (void *)&cmd_setbonding_lacp_dedicated_queues_lacp,
- (void *)&cmd_setbonding_lacp_dedicated_queues_dedicated_queues,
- (void *)&cmd_setbonding_lacp_dedicated_queues_port_id,
- (void *)&cmd_setbonding_lacp_dedicated_queues_mode,
- NULL
- }
-};
-
-/* *** SET BALANCE XMIT POLICY *** */
-struct cmd_set_bonding_balance_xmit_policy_result {
- cmdline_fixed_string_t set;
- cmdline_fixed_string_t bonding;
- cmdline_fixed_string_t balance_xmit_policy;
- portid_t port_id;
- cmdline_fixed_string_t policy;
-};
-
-static void cmd_set_bonding_balance_xmit_policy_parsed(void *parsed_result,
- __rte_unused struct cmdline *cl,
- __rte_unused void *data)
-{
- struct cmd_set_bonding_balance_xmit_policy_result *res = parsed_result;
- portid_t port_id = res->port_id;
- uint8_t policy;
-
- if (!strcmp(res->policy, "l2")) {
- policy = BALANCE_XMIT_POLICY_LAYER2;
- } else if (!strcmp(res->policy, "l23")) {
- policy = BALANCE_XMIT_POLICY_LAYER23;
- } else if (!strcmp(res->policy, "l34")) {
- policy = BALANCE_XMIT_POLICY_LAYER34;
- } else {
- fprintf(stderr, "\t Invalid xmit policy selection");
- return;
- }
-
- /* Set the bonding mode for the relevant port. */
- if (0 != rte_eth_bond_xmit_policy_set(port_id, policy)) {
- fprintf(stderr,
- "\t Failed to set bonding balance xmit policy for port = %d.\n",
- port_id);
- }
-}
-
-static cmdline_parse_token_string_t cmd_setbonding_balance_xmit_policy_set =
-TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_balance_xmit_policy_result,
- set, "set");
-static cmdline_parse_token_string_t cmd_setbonding_balance_xmit_policy_bonding =
-TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_balance_xmit_policy_result,
- bonding, "bonding");
-static cmdline_parse_token_string_t cmd_setbonding_balance_xmit_policy_balance_xmit_policy =
-TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_balance_xmit_policy_result,
- balance_xmit_policy, "balance_xmit_policy");
-static cmdline_parse_token_num_t cmd_setbonding_balance_xmit_policy_port =
-TOKEN_NUM_INITIALIZER(struct cmd_set_bonding_balance_xmit_policy_result,
- port_id, RTE_UINT16);
-static cmdline_parse_token_string_t cmd_setbonding_balance_xmit_policy_policy =
-TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_balance_xmit_policy_result,
- policy, "l2#l23#l34");
-
-static cmdline_parse_inst_t cmd_set_balance_xmit_policy = {
- .f = cmd_set_bonding_balance_xmit_policy_parsed,
- .help_str = "set bonding balance_xmit_policy <port_id> "
- "l2|l23|l34: "
- "Set the bonding balance_xmit_policy for port_id",
- .data = NULL,
- .tokens = {
- (void *)&cmd_setbonding_balance_xmit_policy_set,
- (void *)&cmd_setbonding_balance_xmit_policy_bonding,
- (void *)&cmd_setbonding_balance_xmit_policy_balance_xmit_policy,
- (void *)&cmd_setbonding_balance_xmit_policy_port,
- (void *)&cmd_setbonding_balance_xmit_policy_policy,
- NULL
- }
-};
-
-/* *** SHOW IEEE802.3 BONDING INFORMATION *** */
-struct cmd_show_bonding_lacp_info_result {
- cmdline_fixed_string_t show;
- cmdline_fixed_string_t bonding;
- cmdline_fixed_string_t lacp;
- cmdline_fixed_string_t info;
- portid_t port_id;
-};
-
-static void port_param_show(struct port_params *params)
-{
- char buf[RTE_ETHER_ADDR_FMT_SIZE];
-
- printf("\t\tsystem priority: %u\n", params->system_priority);
- rte_ether_format_addr(buf, RTE_ETHER_ADDR_FMT_SIZE, ¶ms->system);
- printf("\t\tsystem mac address: %s\n", buf);
- printf("\t\tport key: %u\n", params->key);
- printf("\t\tport priority: %u\n", params->port_priority);
- printf("\t\tport number: %u\n", params->port_number);
-}
-
-static void lacp_slave_info_show(struct rte_eth_bond_8023ad_slave_info *info)
-{
- char a_state[256] = { 0 };
- char p_state[256] = { 0 };
- int a_len = 0;
- int p_len = 0;
- uint32_t i;
-
- static const char * const state[] = {
- "ACTIVE",
- "TIMEOUT",
- "AGGREGATION",
- "SYNCHRONIZATION",
- "COLLECTING",
- "DISTRIBUTING",
- "DEFAULTED",
- "EXPIRED"
- };
- static const char * const selection[] = {
- "UNSELECTED",
- "STANDBY",
- "SELECTED"
- };
-
- for (i = 0; i < RTE_DIM(state); i++) {
- if ((info->actor_state >> i) & 1)
- a_len += snprintf(&a_state[a_len],
- RTE_DIM(a_state) - a_len, "%s ",
- state[i]);
-
- if ((info->partner_state >> i) & 1)
- p_len += snprintf(&p_state[p_len],
- RTE_DIM(p_state) - p_len, "%s ",
- state[i]);
- }
- printf("\tAggregator port id: %u\n", info->agg_port_id);
- printf("\tselection: %s\n", selection[info->selected]);
- printf("\tActor detail info:\n");
- port_param_show(&info->actor);
- printf("\t\tport state: %s\n", a_state);
- printf("\tPartner detail info:\n");
- port_param_show(&info->partner);
- printf("\t\tport state: %s\n", p_state);
- printf("\n");
-}
-
-static void lacp_conf_show(struct rte_eth_bond_8023ad_conf *conf)
-{
- printf("\tfast period: %u ms\n", conf->fast_periodic_ms);
- printf("\tslow period: %u ms\n", conf->slow_periodic_ms);
- printf("\tshort timeout: %u ms\n", conf->short_timeout_ms);
- printf("\tlong timeout: %u ms\n", conf->long_timeout_ms);
- printf("\taggregate wait timeout: %u ms\n",
- conf->aggregate_wait_timeout_ms);
- printf("\ttx period: %u ms\n", conf->tx_period_ms);
- printf("\trx marker period: %u ms\n", conf->rx_marker_period_ms);
- printf("\tupdate timeout: %u ms\n", conf->update_timeout_ms);
- switch (conf->agg_selection) {
- case AGG_BANDWIDTH:
- printf("\taggregation mode: bandwidth\n");
- break;
- case AGG_STABLE:
- printf("\taggregation mode: stable\n");
- break;
- case AGG_COUNT:
- printf("\taggregation mode: count\n");
- break;
- default:
- printf("\taggregation mode: invalid\n");
- break;
- }
-
- printf("\n");
-}
-
-static void cmd_show_bonding_lacp_info_parsed(void *parsed_result,
- __rte_unused struct cmdline *cl,
- __rte_unused void *data)
-{
- struct cmd_show_bonding_lacp_info_result *res = parsed_result;
- struct rte_eth_bond_8023ad_slave_info slave_info;
- struct rte_eth_bond_8023ad_conf port_conf;
- portid_t slaves[RTE_MAX_ETHPORTS];
- portid_t port_id = res->port_id;
- int num_active_slaves;
- int bonding_mode;
- int i;
- int ret;
-
- bonding_mode = rte_eth_bond_mode_get(port_id);
- if (bonding_mode != BONDING_MODE_8023AD) {
- fprintf(stderr, "\tBonding mode is not mode 4\n");
- return;
- }
-
- num_active_slaves = rte_eth_bond_active_slaves_get(port_id, slaves,
- RTE_MAX_ETHPORTS);
- if (num_active_slaves < 0) {
- fprintf(stderr, "\tFailed to get active slave list for port = %u\n",
- port_id);
- return;
- }
- if (num_active_slaves == 0)
- fprintf(stderr, "\tIEEE802.3 port %u has no active slave\n",
- port_id);
-
- printf("\tIEEE802.3 port: %u\n", port_id);
- ret = rte_eth_bond_8023ad_conf_get(port_id, &port_conf);
- if (ret) {
- fprintf(stderr, "\tGet bonded device %u info failed\n",
- port_id);
- return;
- }
- lacp_conf_show(&port_conf);
-
- for (i = 0; i < num_active_slaves; i++) {
- ret = rte_eth_bond_8023ad_slave_info(port_id, slaves[i],
- &slave_info);
- if (ret) {
- fprintf(stderr, "\tGet slave device %u info failed\n",
- slaves[i]);
- return;
- }
- printf("\tSlave Port: %u\n", slaves[i]);
- lacp_slave_info_show(&slave_info);
- }
-}
-
-static cmdline_parse_token_string_t cmd_show_bonding_lacp_info_show =
-TOKEN_STRING_INITIALIZER(struct cmd_show_bonding_lacp_info_result,
- show, "show");
-static cmdline_parse_token_string_t cmd_show_bonding_lacp_info_bonding =
-TOKEN_STRING_INITIALIZER(struct cmd_show_bonding_lacp_info_result,
- bonding, "bonding");
-static cmdline_parse_token_string_t cmd_show_bonding_lacp_info_lacp =
-TOKEN_STRING_INITIALIZER(struct cmd_show_bonding_lacp_info_result,
- bonding, "lacp");
-static cmdline_parse_token_string_t cmd_show_bonding_lacp_info_info =
-TOKEN_STRING_INITIALIZER(struct cmd_show_bonding_lacp_info_result,
- info, "info");
-static cmdline_parse_token_num_t cmd_show_bonding_lacp_info_port_id =
-TOKEN_NUM_INITIALIZER(struct cmd_show_bonding_lacp_info_result,
- port_id, RTE_UINT16);
-
-static cmdline_parse_inst_t cmd_show_bonding_lacp_info = {
- .f = cmd_show_bonding_lacp_info_parsed,
- .help_str = "show bonding lacp info <port_id> : "
- "Show bonding IEEE802.3 information for port_id",
- .data = NULL,
- .tokens = {
- (void *)&cmd_show_bonding_lacp_info_show,
- (void *)&cmd_show_bonding_lacp_info_bonding,
- (void *)&cmd_show_bonding_lacp_info_lacp,
- (void *)&cmd_show_bonding_lacp_info_info,
- (void *)&cmd_show_bonding_lacp_info_port_id,
- NULL
- }
-};
-
-/* *** SHOW NIC BONDING CONFIGURATION *** */
-struct cmd_show_bonding_config_result {
- cmdline_fixed_string_t show;
- cmdline_fixed_string_t bonding;
- cmdline_fixed_string_t config;
- portid_t port_id;
-};
-
-static void cmd_show_bonding_config_parsed(void *parsed_result,
- __rte_unused struct cmdline *cl,
- __rte_unused void *data)
-{
- struct cmd_show_bonding_config_result *res = parsed_result;
- int bonding_mode, agg_mode;
- portid_t slaves[RTE_MAX_ETHPORTS];
- int num_slaves, num_active_slaves;
- int primary_id;
- int i;
- portid_t port_id = res->port_id;
-
- /* Display the bonding mode.*/
- bonding_mode = rte_eth_bond_mode_get(port_id);
- if (bonding_mode < 0) {
- fprintf(stderr, "\tFailed to get bonding mode for port = %d\n",
- port_id);
- return;
- } else
- printf("\tBonding mode: %d\n", bonding_mode);
-
- if (bonding_mode == BONDING_MODE_BALANCE ||
- bonding_mode == BONDING_MODE_8023AD) {
- int balance_xmit_policy;
-
- balance_xmit_policy = rte_eth_bond_xmit_policy_get(port_id);
- if (balance_xmit_policy < 0) {
- fprintf(stderr,
- "\tFailed to get balance xmit policy for port = %d\n",
- port_id);
- return;
- } else {
- printf("\tBalance Xmit Policy: ");
-
- switch (balance_xmit_policy) {
- case BALANCE_XMIT_POLICY_LAYER2:
- printf("BALANCE_XMIT_POLICY_LAYER2");
- break;
- case BALANCE_XMIT_POLICY_LAYER23:
- printf("BALANCE_XMIT_POLICY_LAYER23");
- break;
- case BALANCE_XMIT_POLICY_LAYER34:
- printf("BALANCE_XMIT_POLICY_LAYER34");
- break;
- }
- printf("\n");
- }
- }
-
- if (bonding_mode == BONDING_MODE_8023AD) {
- agg_mode = rte_eth_bond_8023ad_agg_selection_get(port_id);
- printf("\tIEEE802.3AD Aggregator Mode: ");
- switch (agg_mode) {
- case AGG_BANDWIDTH:
- printf("bandwidth");
- break;
- case AGG_STABLE:
- printf("stable");
- break;
- case AGG_COUNT:
- printf("count");
- break;
- }
- printf("\n");
- }
-
- num_slaves = rte_eth_bond_slaves_get(port_id, slaves, RTE_MAX_ETHPORTS);
-
- if (num_slaves < 0) {
- fprintf(stderr, "\tFailed to get slave list for port = %d\n",
- port_id);
- return;
- }
- if (num_slaves > 0) {
- printf("\tSlaves (%d): [", num_slaves);
- for (i = 0; i < num_slaves - 1; i++)
- printf("%d ", slaves[i]);
-
- printf("%d]\n", slaves[num_slaves - 1]);
- } else {
- printf("\tSlaves: []\n");
-
- }
-
- num_active_slaves = rte_eth_bond_active_slaves_get(port_id, slaves,
- RTE_MAX_ETHPORTS);
-
- if (num_active_slaves < 0) {
- fprintf(stderr,
- "\tFailed to get active slave list for port = %d\n",
- port_id);
- return;
- }
- if (num_active_slaves > 0) {
- printf("\tActive Slaves (%d): [", num_active_slaves);
- for (i = 0; i < num_active_slaves - 1; i++)
- printf("%d ", slaves[i]);
-
- printf("%d]\n", slaves[num_active_slaves - 1]);
-
- } else {
- printf("\tActive Slaves: []\n");
-
- }
-
- primary_id = rte_eth_bond_primary_get(port_id);
- if (primary_id < 0) {
- fprintf(stderr, "\tFailed to get primary slave for port = %d\n",
- port_id);
- return;
- } else
- printf("\tPrimary: [%d]\n", primary_id);
-
-}
-
-static cmdline_parse_token_string_t cmd_showbonding_config_show =
-TOKEN_STRING_INITIALIZER(struct cmd_show_bonding_config_result,
- show, "show");
-static cmdline_parse_token_string_t cmd_showbonding_config_bonding =
-TOKEN_STRING_INITIALIZER(struct cmd_show_bonding_config_result,
- bonding, "bonding");
-static cmdline_parse_token_string_t cmd_showbonding_config_config =
-TOKEN_STRING_INITIALIZER(struct cmd_show_bonding_config_result,
- config, "config");
-static cmdline_parse_token_num_t cmd_showbonding_config_port =
-TOKEN_NUM_INITIALIZER(struct cmd_show_bonding_config_result,
- port_id, RTE_UINT16);
-
-static cmdline_parse_inst_t cmd_show_bonding_config = {
- .f = cmd_show_bonding_config_parsed,
- .help_str = "show bonding config <port_id>: "
- "Show the bonding config for port_id",
- .data = NULL,
- .tokens = {
- (void *)&cmd_showbonding_config_show,
- (void *)&cmd_showbonding_config_bonding,
- (void *)&cmd_showbonding_config_config,
- (void *)&cmd_showbonding_config_port,
- NULL
- }
-};
-
-/* *** SET BONDING PRIMARY *** */
-struct cmd_set_bonding_primary_result {
- cmdline_fixed_string_t set;
- cmdline_fixed_string_t bonding;
- cmdline_fixed_string_t primary;
- portid_t slave_id;
- portid_t port_id;
-};
-
-static void cmd_set_bonding_primary_parsed(void *parsed_result,
- __rte_unused struct cmdline *cl,
- __rte_unused void *data)
-{
- struct cmd_set_bonding_primary_result *res = parsed_result;
- portid_t master_port_id = res->port_id;
- portid_t slave_port_id = res->slave_id;
-
- /* Set the primary slave for a bonded device. */
- if (0 != rte_eth_bond_primary_set(master_port_id, slave_port_id)) {
- fprintf(stderr, "\t Failed to set primary slave for port = %d.\n",
- master_port_id);
- return;
- }
- init_port_config();
-}
-
-static cmdline_parse_token_string_t cmd_setbonding_primary_set =
-TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_primary_result,
- set, "set");
-static cmdline_parse_token_string_t cmd_setbonding_primary_bonding =
-TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_primary_result,
- bonding, "bonding");
-static cmdline_parse_token_string_t cmd_setbonding_primary_primary =
-TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_primary_result,
- primary, "primary");
-static cmdline_parse_token_num_t cmd_setbonding_primary_slave =
-TOKEN_NUM_INITIALIZER(struct cmd_set_bonding_primary_result,
- slave_id, RTE_UINT16);
-static cmdline_parse_token_num_t cmd_setbonding_primary_port =
-TOKEN_NUM_INITIALIZER(struct cmd_set_bonding_primary_result,
- port_id, RTE_UINT16);
-
-static cmdline_parse_inst_t cmd_set_bonding_primary = {
- .f = cmd_set_bonding_primary_parsed,
- .help_str = "set bonding primary <slave_id> <port_id>: "
- "Set the primary slave for port_id",
- .data = NULL,
- .tokens = {
- (void *)&cmd_setbonding_primary_set,
- (void *)&cmd_setbonding_primary_bonding,
- (void *)&cmd_setbonding_primary_primary,
- (void *)&cmd_setbonding_primary_slave,
- (void *)&cmd_setbonding_primary_port,
- NULL
- }
-};
-
-/* *** ADD SLAVE *** */
-struct cmd_add_bonding_slave_result {
- cmdline_fixed_string_t add;
- cmdline_fixed_string_t bonding;
- cmdline_fixed_string_t slave;
- portid_t slave_id;
- portid_t port_id;
-};
-
-static void cmd_add_bonding_slave_parsed(void *parsed_result,
- __rte_unused struct cmdline *cl,
- __rte_unused void *data)
-{
- struct cmd_add_bonding_slave_result *res = parsed_result;
- portid_t master_port_id = res->port_id;
- portid_t slave_port_id = res->slave_id;
-
- /* add the slave for a bonded device. */
- if (0 != rte_eth_bond_slave_add(master_port_id, slave_port_id)) {
- fprintf(stderr,
- "\t Failed to add slave %d to master port = %d.\n",
- slave_port_id, master_port_id);
- return;
- }
- init_port_config();
- set_port_slave_flag(slave_port_id);
-}
-
-static cmdline_parse_token_string_t cmd_addbonding_slave_add =
-TOKEN_STRING_INITIALIZER(struct cmd_add_bonding_slave_result,
- add, "add");
-static cmdline_parse_token_string_t cmd_addbonding_slave_bonding =
-TOKEN_STRING_INITIALIZER(struct cmd_add_bonding_slave_result,
- bonding, "bonding");
-static cmdline_parse_token_string_t cmd_addbonding_slave_slave =
-TOKEN_STRING_INITIALIZER(struct cmd_add_bonding_slave_result,
- slave, "slave");
-static cmdline_parse_token_num_t cmd_addbonding_slave_slaveid =
-TOKEN_NUM_INITIALIZER(struct cmd_add_bonding_slave_result,
- slave_id, RTE_UINT16);
-static cmdline_parse_token_num_t cmd_addbonding_slave_port =
-TOKEN_NUM_INITIALIZER(struct cmd_add_bonding_slave_result,
- port_id, RTE_UINT16);
-
-static cmdline_parse_inst_t cmd_add_bonding_slave = {
- .f = cmd_add_bonding_slave_parsed,
- .help_str = "add bonding slave <slave_id> <port_id>: "
- "Add a slave device to a bonded device",
- .data = NULL,
- .tokens = {
- (void *)&cmd_addbonding_slave_add,
- (void *)&cmd_addbonding_slave_bonding,
- (void *)&cmd_addbonding_slave_slave,
- (void *)&cmd_addbonding_slave_slaveid,
- (void *)&cmd_addbonding_slave_port,
- NULL
- }
-};
-
-/* *** REMOVE SLAVE *** */
-struct cmd_remove_bonding_slave_result {
- cmdline_fixed_string_t remove;
- cmdline_fixed_string_t bonding;
- cmdline_fixed_string_t slave;
- portid_t slave_id;
- portid_t port_id;
-};
-
-static void cmd_remove_bonding_slave_parsed(void *parsed_result,
- __rte_unused struct cmdline *cl,
- __rte_unused void *data)
-{
- struct cmd_remove_bonding_slave_result *res = parsed_result;
- portid_t master_port_id = res->port_id;
- portid_t slave_port_id = res->slave_id;
-
- /* remove the slave from a bonded device. */
- if (0 != rte_eth_bond_slave_remove(master_port_id, slave_port_id)) {
- fprintf(stderr,
- "\t Failed to remove slave %d from master port = %d.\n",
- slave_port_id, master_port_id);
- return;
- }
- init_port_config();
- clear_port_slave_flag(slave_port_id);
-}
-
-static cmdline_parse_token_string_t cmd_removebonding_slave_remove =
- TOKEN_STRING_INITIALIZER(struct cmd_remove_bonding_slave_result,
- remove, "remove");
-static cmdline_parse_token_string_t cmd_removebonding_slave_bonding =
- TOKEN_STRING_INITIALIZER(struct cmd_remove_bonding_slave_result,
- bonding, "bonding");
-static cmdline_parse_token_string_t cmd_removebonding_slave_slave =
- TOKEN_STRING_INITIALIZER(struct cmd_remove_bonding_slave_result,
- slave, "slave");
-static cmdline_parse_token_num_t cmd_removebonding_slave_slaveid =
- TOKEN_NUM_INITIALIZER(struct cmd_remove_bonding_slave_result,
- slave_id, RTE_UINT16);
-static cmdline_parse_token_num_t cmd_removebonding_slave_port =
- TOKEN_NUM_INITIALIZER(struct cmd_remove_bonding_slave_result,
- port_id, RTE_UINT16);
-
-static cmdline_parse_inst_t cmd_remove_bonding_slave = {
- .f = cmd_remove_bonding_slave_parsed,
- .help_str = "remove bonding slave <slave_id> <port_id>: "
- "Remove a slave device from a bonded device",
- .data = NULL,
- .tokens = {
- (void *)&cmd_removebonding_slave_remove,
- (void *)&cmd_removebonding_slave_bonding,
- (void *)&cmd_removebonding_slave_slave,
- (void *)&cmd_removebonding_slave_slaveid,
- (void *)&cmd_removebonding_slave_port,
- NULL
- }
-};
-
-/* *** CREATE BONDED DEVICE *** */
-struct cmd_create_bonded_device_result {
- cmdline_fixed_string_t create;
- cmdline_fixed_string_t bonded;
- cmdline_fixed_string_t device;
- uint8_t mode;
- uint8_t socket;
-};
-
-static int bond_dev_num = 0;
-
-static void cmd_create_bonded_device_parsed(void *parsed_result,
- __rte_unused struct cmdline *cl,
- __rte_unused void *data)
-{
- struct cmd_create_bonded_device_result *res = parsed_result;
- char ethdev_name[RTE_ETH_NAME_MAX_LEN];
- int port_id;
- int ret;
-
- if (test_done == 0) {
- fprintf(stderr, "Please stop forwarding first\n");
- return;
- }
-
- snprintf(ethdev_name, RTE_ETH_NAME_MAX_LEN, "net_bonding_testpmd_%d",
- bond_dev_num++);
-
- /* Create a new bonded device. */
- port_id = rte_eth_bond_create(ethdev_name, res->mode, res->socket);
- if (port_id < 0) {
- fprintf(stderr, "\t Failed to create bonded device.\n");
- return;
- } else {
- printf("Created new bonded device %s on (port %d).\n", ethdev_name,
- port_id);
-
- /* Update number of ports */
- nb_ports = rte_eth_dev_count_avail();
- reconfig(port_id, res->socket);
- ret = rte_eth_promiscuous_enable(port_id);
- if (ret != 0)
- fprintf(stderr,
- "Failed to enable promiscuous mode for port %u: %s - ignore\n",
- port_id, rte_strerror(-ret));
-
- ports[port_id].need_setup = 0;
- ports[port_id].port_status = RTE_PORT_STOPPED;
- }
-
-}
-
-static cmdline_parse_token_string_t cmd_createbonded_device_create =
- TOKEN_STRING_INITIALIZER(struct cmd_create_bonded_device_result,
- create, "create");
-static cmdline_parse_token_string_t cmd_createbonded_device_bonded =
- TOKEN_STRING_INITIALIZER(struct cmd_create_bonded_device_result,
- bonded, "bonded");
-static cmdline_parse_token_string_t cmd_createbonded_device_device =
- TOKEN_STRING_INITIALIZER(struct cmd_create_bonded_device_result,
- device, "device");
-static cmdline_parse_token_num_t cmd_createbonded_device_mode =
- TOKEN_NUM_INITIALIZER(struct cmd_create_bonded_device_result,
- mode, RTE_UINT8);
-static cmdline_parse_token_num_t cmd_createbonded_device_socket =
- TOKEN_NUM_INITIALIZER(struct cmd_create_bonded_device_result,
- socket, RTE_UINT8);
-
-static cmdline_parse_inst_t cmd_create_bonded_device = {
- .f = cmd_create_bonded_device_parsed,
- .help_str = "create bonded device <mode> <socket>: "
- "Create a new bonded device with specific bonding mode and socket",
- .data = NULL,
- .tokens = {
- (void *)&cmd_createbonded_device_create,
- (void *)&cmd_createbonded_device_bonded,
- (void *)&cmd_createbonded_device_device,
- (void *)&cmd_createbonded_device_mode,
- (void *)&cmd_createbonded_device_socket,
- NULL
- }
-};
-
-/* *** SET MAC ADDRESS IN BONDED DEVICE *** */
-struct cmd_set_bond_mac_addr_result {
- cmdline_fixed_string_t set;
- cmdline_fixed_string_t bonding;
- cmdline_fixed_string_t mac_addr;
- uint16_t port_num;
- struct rte_ether_addr address;
-};
-
-static void cmd_set_bond_mac_addr_parsed(void *parsed_result,
- __rte_unused struct cmdline *cl,
- __rte_unused void *data)
-{
- struct cmd_set_bond_mac_addr_result *res = parsed_result;
- int ret;
-
- if (port_id_is_invalid(res->port_num, ENABLED_WARN))
- return;
-
- ret = rte_eth_bond_mac_address_set(res->port_num, &res->address);
-
- /* check the return value and print it if is < 0 */
- if (ret < 0)
- fprintf(stderr, "set_bond_mac_addr error: (%s)\n",
- strerror(-ret));
-}
-
-static cmdline_parse_token_string_t cmd_set_bond_mac_addr_set =
- TOKEN_STRING_INITIALIZER(struct cmd_set_bond_mac_addr_result, set, "set");
-static cmdline_parse_token_string_t cmd_set_bond_mac_addr_bonding =
- TOKEN_STRING_INITIALIZER(struct cmd_set_bond_mac_addr_result, bonding,
- "bonding");
-static cmdline_parse_token_string_t cmd_set_bond_mac_addr_mac =
- TOKEN_STRING_INITIALIZER(struct cmd_set_bond_mac_addr_result, mac_addr,
- "mac_addr");
-static cmdline_parse_token_num_t cmd_set_bond_mac_addr_portnum =
- TOKEN_NUM_INITIALIZER(struct cmd_set_bond_mac_addr_result,
- port_num, RTE_UINT16);
-static cmdline_parse_token_etheraddr_t cmd_set_bond_mac_addr_addr =
- TOKEN_ETHERADDR_INITIALIZER(struct cmd_set_bond_mac_addr_result, address);
-
-static cmdline_parse_inst_t cmd_set_bond_mac_addr = {
- .f = cmd_set_bond_mac_addr_parsed,
- .data = (void *) 0,
- .help_str = "set bonding mac_addr <port_id> <mac_addr>",
- .tokens = {
- (void *)&cmd_set_bond_mac_addr_set,
- (void *)&cmd_set_bond_mac_addr_bonding,
- (void *)&cmd_set_bond_mac_addr_mac,
- (void *)&cmd_set_bond_mac_addr_portnum,
- (void *)&cmd_set_bond_mac_addr_addr,
- NULL
- }
-};
-
-
-/* *** SET LINK STATUS MONITORING POLLING PERIOD ON BONDED DEVICE *** */
-struct cmd_set_bond_mon_period_result {
- cmdline_fixed_string_t set;
- cmdline_fixed_string_t bonding;
- cmdline_fixed_string_t mon_period;
- uint16_t port_num;
- uint32_t period_ms;
-};
-
-static void cmd_set_bond_mon_period_parsed(void *parsed_result,
- __rte_unused struct cmdline *cl,
- __rte_unused void *data)
-{
- struct cmd_set_bond_mon_period_result *res = parsed_result;
- int ret;
-
- ret = rte_eth_bond_link_monitoring_set(res->port_num, res->period_ms);
-
- /* check the return value and print it if is < 0 */
- if (ret < 0)
- fprintf(stderr, "set_bond_mac_addr error: (%s)\n",
- strerror(-ret));
-}
-
-static cmdline_parse_token_string_t cmd_set_bond_mon_period_set =
- TOKEN_STRING_INITIALIZER(struct cmd_set_bond_mon_period_result,
- set, "set");
-static cmdline_parse_token_string_t cmd_set_bond_mon_period_bonding =
- TOKEN_STRING_INITIALIZER(struct cmd_set_bond_mon_period_result,
- bonding, "bonding");
-static cmdline_parse_token_string_t cmd_set_bond_mon_period_mon_period =
- TOKEN_STRING_INITIALIZER(struct cmd_set_bond_mon_period_result,
- mon_period, "mon_period");
-static cmdline_parse_token_num_t cmd_set_bond_mon_period_portnum =
- TOKEN_NUM_INITIALIZER(struct cmd_set_bond_mon_period_result,
- port_num, RTE_UINT16);
-static cmdline_parse_token_num_t cmd_set_bond_mon_period_period_ms =
- TOKEN_NUM_INITIALIZER(struct cmd_set_bond_mon_period_result,
- period_ms, RTE_UINT32);
-
-static cmdline_parse_inst_t cmd_set_bond_mon_period = {
- .f = cmd_set_bond_mon_period_parsed,
- .data = (void *) 0,
- .help_str = "set bonding mon_period <port_id> <period_ms>",
- .tokens = {
- (void *)&cmd_set_bond_mon_period_set,
- (void *)&cmd_set_bond_mon_period_bonding,
- (void *)&cmd_set_bond_mon_period_mon_period,
- (void *)&cmd_set_bond_mon_period_portnum,
- (void *)&cmd_set_bond_mon_period_period_ms,
- NULL
- }
-};
-
-
-
-struct cmd_set_bonding_agg_mode_policy_result {
- cmdline_fixed_string_t set;
- cmdline_fixed_string_t bonding;
- cmdline_fixed_string_t agg_mode;
- uint16_t port_num;
- cmdline_fixed_string_t policy;
-};
-
-
-static void
-cmd_set_bonding_agg_mode(void *parsed_result,
- __rte_unused struct cmdline *cl,
- __rte_unused void *data)
-{
- struct cmd_set_bonding_agg_mode_policy_result *res = parsed_result;
- uint8_t policy = AGG_BANDWIDTH;
-
- if (!strcmp(res->policy, "bandwidth"))
- policy = AGG_BANDWIDTH;
- else if (!strcmp(res->policy, "stable"))
- policy = AGG_STABLE;
- else if (!strcmp(res->policy, "count"))
- policy = AGG_COUNT;
-
- rte_eth_bond_8023ad_agg_selection_set(res->port_num, policy);
-}
-
-
-static cmdline_parse_token_string_t cmd_set_bonding_agg_mode_set =
- TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_agg_mode_policy_result,
- set, "set");
-static cmdline_parse_token_string_t cmd_set_bonding_agg_mode_bonding =
- TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_agg_mode_policy_result,
- bonding, "bonding");
-
-static cmdline_parse_token_string_t cmd_set_bonding_agg_mode_agg_mode =
- TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_agg_mode_policy_result,
- agg_mode, "agg_mode");
-
-static cmdline_parse_token_num_t cmd_set_bonding_agg_mode_portnum =
- TOKEN_NUM_INITIALIZER(struct cmd_set_bonding_agg_mode_policy_result,
- port_num, RTE_UINT16);
-
-static cmdline_parse_token_string_t cmd_set_bonding_agg_mode_policy_string =
- TOKEN_STRING_INITIALIZER(
- struct cmd_set_bonding_balance_xmit_policy_result,
- policy, "stable#bandwidth#count");
-
-static cmdline_parse_inst_t cmd_set_bonding_agg_mode_policy = {
- .f = cmd_set_bonding_agg_mode,
- .data = (void *) 0,
- .help_str = "set bonding mode IEEE802.3AD aggregator policy <port_id> <agg_name>",
- .tokens = {
- (void *)&cmd_set_bonding_agg_mode_set,
- (void *)&cmd_set_bonding_agg_mode_bonding,
- (void *)&cmd_set_bonding_agg_mode_agg_mode,
- (void *)&cmd_set_bonding_agg_mode_portnum,
- (void *)&cmd_set_bonding_agg_mode_policy_string,
- NULL
- }
-};
-
-
-#endif /* RTE_NET_BOND */
-
/* *** SET FORWARDING MODE *** */
struct cmd_set_fwd_mode_result {
cmdline_fixed_string_t set;
@@ -17860,20 +16839,6 @@ static cmdline_parse_ctx_t builtin_ctx[] = {
(cmdline_parse_inst_t *)&cmd_set_bypass_event,
(cmdline_parse_inst_t *)&cmd_set_bypass_timeout,
(cmdline_parse_inst_t *)&cmd_show_bypass_config,
-#ifdef RTE_NET_BOND
- (cmdline_parse_inst_t *) &cmd_set_bonding_mode,
- (cmdline_parse_inst_t *) &cmd_show_bonding_config,
- (cmdline_parse_inst_t *) &cmd_show_bonding_lacp_info,
- (cmdline_parse_inst_t *) &cmd_set_bonding_primary,
- (cmdline_parse_inst_t *) &cmd_add_bonding_slave,
- (cmdline_parse_inst_t *) &cmd_remove_bonding_slave,
- (cmdline_parse_inst_t *) &cmd_create_bonded_device,
- (cmdline_parse_inst_t *) &cmd_set_bond_mac_addr,
- (cmdline_parse_inst_t *) &cmd_set_balance_xmit_policy,
- (cmdline_parse_inst_t *) &cmd_set_bond_mon_period,
- (cmdline_parse_inst_t *) &cmd_set_lacp_dedicated_queues,
- (cmdline_parse_inst_t *) &cmd_set_bonding_agg_mode_policy,
-#endif
(cmdline_parse_inst_t *)&cmd_vlan_offload,
(cmdline_parse_inst_t *)&cmd_vlan_tpid,
(cmdline_parse_inst_t *)&cmd_rx_vlan_filter_all,
diff --git a/app/test-pmd/meson.build b/app/test-pmd/meson.build
index 46a7511e9a..07634332f3 100644
--- a/app/test-pmd/meson.build
+++ b/app/test-pmd/meson.build
@@ -58,9 +58,6 @@ endif
if dpdk_conf.has('RTE_LIB_PDUMP')
deps += 'pdump'
endif
-if dpdk_conf.has('RTE_NET_BOND')
- deps += 'net_bond'
-endif
if dpdk_conf.has('RTE_NET_BNXT')
deps += 'net_bnxt'
endif
diff --git a/drivers/net/bonding/meson.build b/drivers/net/bonding/meson.build
index 402b44be1a..faea892295 100644
--- a/drivers/net/bonding/meson.build
+++ b/drivers/net/bonding/meson.build
@@ -16,6 +16,7 @@ sources = files(
'rte_eth_bond_flow.c',
'rte_eth_bond_pmd.c',
)
+testpmd_sources = files('rte_eth_bond_testpmd.c')
deps += 'sched' # needed for rte_bitmap.h
deps += ['ip_frag']
diff --git a/drivers/net/bonding/rte_eth_bond_testpmd.c b/drivers/net/bonding/rte_eth_bond_testpmd.c
new file mode 100644
index 0000000000..3949a8c3ca
--- /dev/null
+++ b/drivers/net/bonding/rte_eth_bond_testpmd.c
@@ -0,0 +1,1037 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2010-2016 Intel Corporation.
+ */
+
+#include <rte_eth_bond.h>
+#include <rte_eth_bond_8023ad.h>
+
+#include <cmdline_parse.h>
+#include <cmdline_parse_etheraddr.h>
+#include <cmdline_parse_num.h>
+#include <cmdline_parse_string.h>
+
+#include "testpmd.h"
+
+/* *** SET BONDING MODE *** */
+struct cmd_set_bonding_mode_result {
+ cmdline_fixed_string_t set;
+ cmdline_fixed_string_t bonding;
+ cmdline_fixed_string_t mode;
+ uint8_t value;
+ portid_t port_id;
+};
+
+static void cmd_set_bonding_mode_parsed(void *parsed_result,
+ __rte_unused struct cmdline *cl,
+ __rte_unused void *data)
+{
+ struct cmd_set_bonding_mode_result *res = parsed_result;
+ portid_t port_id = res->port_id;
+ struct rte_port *port = &ports[port_id];
+
+ /*
+ * Bonding mode changed means resources of device changed, like whether
+ * started rte timer or not. Device should be restarted when resources
+ * of device changed.
+ */
+ if (port->port_status != RTE_PORT_STOPPED) {
+ fprintf(stderr,
+ "\t Error: Can't set bonding mode when port %d is not stopped\n",
+ port_id);
+ return;
+ }
+
+ /* Set the bonding mode for the relevant port. */
+ if (rte_eth_bond_mode_set(port_id, res->value) != 0)
+ fprintf(stderr, "\t Failed to set bonding mode for port = %d.\n",
+ port_id);
+}
+
+static cmdline_parse_token_string_t cmd_setbonding_mode_set =
+TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_mode_result,
+ set, "set");
+static cmdline_parse_token_string_t cmd_setbonding_mode_bonding =
+TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_mode_result,
+ bonding, "bonding");
+static cmdline_parse_token_string_t cmd_setbonding_mode_mode =
+TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_mode_result,
+ mode, "mode");
+static cmdline_parse_token_num_t cmd_setbonding_mode_value =
+TOKEN_NUM_INITIALIZER(struct cmd_set_bonding_mode_result,
+ value, RTE_UINT8);
+static cmdline_parse_token_num_t cmd_setbonding_mode_port =
+TOKEN_NUM_INITIALIZER(struct cmd_set_bonding_mode_result,
+ port_id, RTE_UINT16);
+
+static cmdline_parse_inst_t cmd_set_bonding_mode = {
+ .f = cmd_set_bonding_mode_parsed,
+ .help_str = "set bonding mode <mode_value> <port_id>: "
+ "Set the bonding mode for port_id",
+ .data = NULL,
+ .tokens = {
+ (void *)&cmd_setbonding_mode_set,
+ (void *)&cmd_setbonding_mode_bonding,
+ (void *)&cmd_setbonding_mode_mode,
+ (void *)&cmd_setbonding_mode_value,
+ (void *)&cmd_setbonding_mode_port,
+ NULL
+ }
+};
+
+/* *** SET BONDING SLOW_QUEUE SW/HW *** */
+struct cmd_set_bonding_lacp_dedicated_queues_result {
+ cmdline_fixed_string_t set;
+ cmdline_fixed_string_t bonding;
+ cmdline_fixed_string_t lacp;
+ cmdline_fixed_string_t dedicated_queues;
+ portid_t port_id;
+ cmdline_fixed_string_t mode;
+};
+
+static void cmd_set_bonding_lacp_dedicated_queues_parsed(void *parsed_result,
+ __rte_unused struct cmdline *cl,
+ __rte_unused void *data)
+{
+ struct cmd_set_bonding_lacp_dedicated_queues_result *res = parsed_result;
+ portid_t port_id = res->port_id;
+ struct rte_port *port;
+
+ port = &ports[port_id];
+
+ /** Check if the port is not started **/
+ if (port->port_status != RTE_PORT_STOPPED) {
+ fprintf(stderr, "Please stop port %d first\n", port_id);
+ return;
+ }
+
+ if (!strcmp(res->mode, "enable")) {
+ if (rte_eth_bond_8023ad_dedicated_queues_enable(port_id) == 0)
+ printf("Dedicate queues for LACP control packets"
+ " enabled\n");
+ else
+ printf("Enabling dedicate queues for LACP control "
+ "packets on port %d failed\n", port_id);
+ } else if (!strcmp(res->mode, "disable")) {
+ if (rte_eth_bond_8023ad_dedicated_queues_disable(port_id) == 0)
+ printf("Dedicated queues for LACP control packets "
+ "disabled\n");
+ else
+ printf("Disabling dedicated queues for LACP control "
+ "traffic on port %d failed\n", port_id);
+ }
+}
+
+static cmdline_parse_token_string_t cmd_setbonding_lacp_dedicated_queues_set =
+TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_lacp_dedicated_queues_result,
+ set, "set");
+static cmdline_parse_token_string_t cmd_setbonding_lacp_dedicated_queues_bonding =
+TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_lacp_dedicated_queues_result,
+ bonding, "bonding");
+static cmdline_parse_token_string_t cmd_setbonding_lacp_dedicated_queues_lacp =
+TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_lacp_dedicated_queues_result,
+ lacp, "lacp");
+static cmdline_parse_token_string_t cmd_setbonding_lacp_dedicated_queues_dedicated_queues =
+TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_lacp_dedicated_queues_result,
+ dedicated_queues, "dedicated_queues");
+static cmdline_parse_token_num_t cmd_setbonding_lacp_dedicated_queues_port_id =
+TOKEN_NUM_INITIALIZER(struct cmd_set_bonding_lacp_dedicated_queues_result,
+ port_id, RTE_UINT16);
+static cmdline_parse_token_string_t cmd_setbonding_lacp_dedicated_queues_mode =
+TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_lacp_dedicated_queues_result,
+ mode, "enable#disable");
+
+static cmdline_parse_inst_t cmd_set_lacp_dedicated_queues = {
+ .f = cmd_set_bonding_lacp_dedicated_queues_parsed,
+ .help_str = "set bonding lacp dedicated_queues <port_id> "
+ "enable|disable: "
+ "Enable/disable dedicated queues for LACP control traffic for port_id",
+ .data = NULL,
+ .tokens = {
+ (void *)&cmd_setbonding_lacp_dedicated_queues_set,
+ (void *)&cmd_setbonding_lacp_dedicated_queues_bonding,
+ (void *)&cmd_setbonding_lacp_dedicated_queues_lacp,
+ (void *)&cmd_setbonding_lacp_dedicated_queues_dedicated_queues,
+ (void *)&cmd_setbonding_lacp_dedicated_queues_port_id,
+ (void *)&cmd_setbonding_lacp_dedicated_queues_mode,
+ NULL
+ }
+};
+
+/* *** SET BALANCE XMIT POLICY *** */
+struct cmd_set_bonding_balance_xmit_policy_result {
+ cmdline_fixed_string_t set;
+ cmdline_fixed_string_t bonding;
+ cmdline_fixed_string_t balance_xmit_policy;
+ portid_t port_id;
+ cmdline_fixed_string_t policy;
+};
+
+static void cmd_set_bonding_balance_xmit_policy_parsed(void *parsed_result,
+ __rte_unused struct cmdline *cl,
+ __rte_unused void *data)
+{
+ struct cmd_set_bonding_balance_xmit_policy_result *res = parsed_result;
+ portid_t port_id = res->port_id;
+ uint8_t policy;
+
+ if (!strcmp(res->policy, "l2")) {
+ policy = BALANCE_XMIT_POLICY_LAYER2;
+ } else if (!strcmp(res->policy, "l23")) {
+ policy = BALANCE_XMIT_POLICY_LAYER23;
+ } else if (!strcmp(res->policy, "l34")) {
+ policy = BALANCE_XMIT_POLICY_LAYER34;
+ } else {
+ fprintf(stderr, "\t Invalid xmit policy selection");
+ return;
+ }
+
+ /* Set the bonding mode for the relevant port. */
+ if (rte_eth_bond_xmit_policy_set(port_id, policy) != 0) {
+ fprintf(stderr,
+ "\t Failed to set bonding balance xmit policy for port = %d.\n",
+ port_id);
+ }
+}
+
+static cmdline_parse_token_string_t cmd_setbonding_balance_xmit_policy_set =
+TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_balance_xmit_policy_result,
+ set, "set");
+static cmdline_parse_token_string_t cmd_setbonding_balance_xmit_policy_bonding =
+TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_balance_xmit_policy_result,
+ bonding, "bonding");
+static cmdline_parse_token_string_t cmd_setbonding_balance_xmit_policy_balance_xmit_policy =
+TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_balance_xmit_policy_result,
+ balance_xmit_policy, "balance_xmit_policy");
+static cmdline_parse_token_num_t cmd_setbonding_balance_xmit_policy_port =
+TOKEN_NUM_INITIALIZER(struct cmd_set_bonding_balance_xmit_policy_result,
+ port_id, RTE_UINT16);
+static cmdline_parse_token_string_t cmd_setbonding_balance_xmit_policy_policy =
+TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_balance_xmit_policy_result,
+ policy, "l2#l23#l34");
+
+static cmdline_parse_inst_t cmd_set_balance_xmit_policy = {
+ .f = cmd_set_bonding_balance_xmit_policy_parsed,
+ .help_str = "set bonding balance_xmit_policy <port_id> "
+ "l2|l23|l34: "
+ "Set the bonding balance_xmit_policy for port_id",
+ .data = NULL,
+ .tokens = {
+ (void *)&cmd_setbonding_balance_xmit_policy_set,
+ (void *)&cmd_setbonding_balance_xmit_policy_bonding,
+ (void *)&cmd_setbonding_balance_xmit_policy_balance_xmit_policy,
+ (void *)&cmd_setbonding_balance_xmit_policy_port,
+ (void *)&cmd_setbonding_balance_xmit_policy_policy,
+ NULL
+ }
+};
+
+/* *** SHOW IEEE802.3 BONDING INFORMATION *** */
+struct cmd_show_bonding_lacp_info_result {
+ cmdline_fixed_string_t show;
+ cmdline_fixed_string_t bonding;
+ cmdline_fixed_string_t lacp;
+ cmdline_fixed_string_t info;
+ portid_t port_id;
+};
+
+static void port_param_show(struct port_params *params)
+{
+ char buf[RTE_ETHER_ADDR_FMT_SIZE];
+
+ printf("\t\tsystem priority: %u\n", params->system_priority);
+ rte_ether_format_addr(buf, RTE_ETHER_ADDR_FMT_SIZE, ¶ms->system);
+ printf("\t\tsystem mac address: %s\n", buf);
+ printf("\t\tport key: %u\n", params->key);
+ printf("\t\tport priority: %u\n", params->port_priority);
+ printf("\t\tport number: %u\n", params->port_number);
+}
+
+static void lacp_slave_info_show(struct rte_eth_bond_8023ad_slave_info *info)
+{
+ char a_state[256] = { 0 };
+ char p_state[256] = { 0 };
+ int a_len = 0;
+ int p_len = 0;
+ uint32_t i;
+
+ static const char * const state[] = {
+ "ACTIVE",
+ "TIMEOUT",
+ "AGGREGATION",
+ "SYNCHRONIZATION",
+ "COLLECTING",
+ "DISTRIBUTING",
+ "DEFAULTED",
+ "EXPIRED"
+ };
+ static const char * const selection[] = {
+ "UNSELECTED",
+ "STANDBY",
+ "SELECTED"
+ };
+
+ for (i = 0; i < RTE_DIM(state); i++) {
+ if ((info->actor_state >> i) & 1)
+ a_len += snprintf(&a_state[a_len],
+ RTE_DIM(a_state) - a_len, "%s ",
+ state[i]);
+
+ if ((info->partner_state >> i) & 1)
+ p_len += snprintf(&p_state[p_len],
+ RTE_DIM(p_state) - p_len, "%s ",
+ state[i]);
+ }
+ printf("\tAggregator port id: %u\n", info->agg_port_id);
+ printf("\tselection: %s\n", selection[info->selected]);
+ printf("\tActor detail info:\n");
+ port_param_show(&info->actor);
+ printf("\t\tport state: %s\n", a_state);
+ printf("\tPartner detail info:\n");
+ port_param_show(&info->partner);
+ printf("\t\tport state: %s\n", p_state);
+ printf("\n");
+}
+
+static void lacp_conf_show(struct rte_eth_bond_8023ad_conf *conf)
+{
+ printf("\tfast period: %u ms\n", conf->fast_periodic_ms);
+ printf("\tslow period: %u ms\n", conf->slow_periodic_ms);
+ printf("\tshort timeout: %u ms\n", conf->short_timeout_ms);
+ printf("\tlong timeout: %u ms\n", conf->long_timeout_ms);
+ printf("\taggregate wait timeout: %u ms\n",
+ conf->aggregate_wait_timeout_ms);
+ printf("\ttx period: %u ms\n", conf->tx_period_ms);
+ printf("\trx marker period: %u ms\n", conf->rx_marker_period_ms);
+ printf("\tupdate timeout: %u ms\n", conf->update_timeout_ms);
+ switch (conf->agg_selection) {
+ case AGG_BANDWIDTH:
+ printf("\taggregation mode: bandwidth\n");
+ break;
+ case AGG_STABLE:
+ printf("\taggregation mode: stable\n");
+ break;
+ case AGG_COUNT:
+ printf("\taggregation mode: count\n");
+ break;
+ default:
+ printf("\taggregation mode: invalid\n");
+ break;
+ }
+
+ printf("\n");
+}
+
+static void cmd_show_bonding_lacp_info_parsed(void *parsed_result,
+ __rte_unused struct cmdline *cl,
+ __rte_unused void *data)
+{
+ struct cmd_show_bonding_lacp_info_result *res = parsed_result;
+ struct rte_eth_bond_8023ad_slave_info slave_info;
+ struct rte_eth_bond_8023ad_conf port_conf;
+ portid_t slaves[RTE_MAX_ETHPORTS];
+ portid_t port_id = res->port_id;
+ int num_active_slaves;
+ int bonding_mode;
+ int i;
+ int ret;
+
+ bonding_mode = rte_eth_bond_mode_get(port_id);
+ if (bonding_mode != BONDING_MODE_8023AD) {
+ fprintf(stderr, "\tBonding mode is not mode 4\n");
+ return;
+ }
+
+ num_active_slaves = rte_eth_bond_active_slaves_get(port_id, slaves,
+ RTE_MAX_ETHPORTS);
+ if (num_active_slaves < 0) {
+ fprintf(stderr, "\tFailed to get active slave list for port = %u\n",
+ port_id);
+ return;
+ }
+ if (num_active_slaves == 0)
+ fprintf(stderr, "\tIEEE802.3 port %u has no active slave\n",
+ port_id);
+
+ printf("\tIEEE802.3 port: %u\n", port_id);
+ ret = rte_eth_bond_8023ad_conf_get(port_id, &port_conf);
+ if (ret) {
+ fprintf(stderr, "\tGet bonded device %u info failed\n",
+ port_id);
+ return;
+ }
+ lacp_conf_show(&port_conf);
+
+ for (i = 0; i < num_active_slaves; i++) {
+ ret = rte_eth_bond_8023ad_slave_info(port_id, slaves[i],
+ &slave_info);
+ if (ret) {
+ fprintf(stderr, "\tGet slave device %u info failed\n",
+ slaves[i]);
+ return;
+ }
+ printf("\tSlave Port: %u\n", slaves[i]);
+ lacp_slave_info_show(&slave_info);
+ }
+}
+
+static cmdline_parse_token_string_t cmd_show_bonding_lacp_info_show =
+TOKEN_STRING_INITIALIZER(struct cmd_show_bonding_lacp_info_result,
+ show, "show");
+static cmdline_parse_token_string_t cmd_show_bonding_lacp_info_bonding =
+TOKEN_STRING_INITIALIZER(struct cmd_show_bonding_lacp_info_result,
+ bonding, "bonding");
+static cmdline_parse_token_string_t cmd_show_bonding_lacp_info_lacp =
+TOKEN_STRING_INITIALIZER(struct cmd_show_bonding_lacp_info_result,
+ bonding, "lacp");
+static cmdline_parse_token_string_t cmd_show_bonding_lacp_info_info =
+TOKEN_STRING_INITIALIZER(struct cmd_show_bonding_lacp_info_result,
+ info, "info");
+static cmdline_parse_token_num_t cmd_show_bonding_lacp_info_port_id =
+TOKEN_NUM_INITIALIZER(struct cmd_show_bonding_lacp_info_result,
+ port_id, RTE_UINT16);
+
+static cmdline_parse_inst_t cmd_show_bonding_lacp_info = {
+ .f = cmd_show_bonding_lacp_info_parsed,
+ .help_str = "show bonding lacp info <port_id> : "
+ "Show bonding IEEE802.3 information for port_id",
+ .data = NULL,
+ .tokens = {
+ (void *)&cmd_show_bonding_lacp_info_show,
+ (void *)&cmd_show_bonding_lacp_info_bonding,
+ (void *)&cmd_show_bonding_lacp_info_lacp,
+ (void *)&cmd_show_bonding_lacp_info_info,
+ (void *)&cmd_show_bonding_lacp_info_port_id,
+ NULL
+ }
+};
+
+/* *** SHOW NIC BONDING CONFIGURATION *** */
+struct cmd_show_bonding_config_result {
+ cmdline_fixed_string_t show;
+ cmdline_fixed_string_t bonding;
+ cmdline_fixed_string_t config;
+ portid_t port_id;
+};
+
+static void cmd_show_bonding_config_parsed(void *parsed_result,
+ __rte_unused struct cmdline *cl,
+ __rte_unused void *data)
+{
+ struct cmd_show_bonding_config_result *res = parsed_result;
+ int bonding_mode, agg_mode;
+ portid_t slaves[RTE_MAX_ETHPORTS];
+ int num_slaves, num_active_slaves;
+ int primary_id;
+ int i;
+ portid_t port_id = res->port_id;
+
+ /* Display the bonding mode.*/
+ bonding_mode = rte_eth_bond_mode_get(port_id);
+ if (bonding_mode < 0) {
+ fprintf(stderr, "\tFailed to get bonding mode for port = %d\n",
+ port_id);
+ return;
+ }
+ printf("\tBonding mode: %d\n", bonding_mode);
+
+ if (bonding_mode == BONDING_MODE_BALANCE ||
+ bonding_mode == BONDING_MODE_8023AD) {
+ int balance_xmit_policy;
+
+ balance_xmit_policy = rte_eth_bond_xmit_policy_get(port_id);
+ if (balance_xmit_policy < 0) {
+ fprintf(stderr,
+ "\tFailed to get balance xmit policy for port = %d\n",
+ port_id);
+ return;
+ }
+ printf("\tBalance Xmit Policy: ");
+
+ switch (balance_xmit_policy) {
+ case BALANCE_XMIT_POLICY_LAYER2:
+ printf("BALANCE_XMIT_POLICY_LAYER2");
+ break;
+ case BALANCE_XMIT_POLICY_LAYER23:
+ printf("BALANCE_XMIT_POLICY_LAYER23");
+ break;
+ case BALANCE_XMIT_POLICY_LAYER34:
+ printf("BALANCE_XMIT_POLICY_LAYER34");
+ break;
+ }
+ printf("\n");
+ }
+
+ if (bonding_mode == BONDING_MODE_8023AD) {
+ agg_mode = rte_eth_bond_8023ad_agg_selection_get(port_id);
+ printf("\tIEEE802.3AD Aggregator Mode: ");
+ switch (agg_mode) {
+ case AGG_BANDWIDTH:
+ printf("bandwidth");
+ break;
+ case AGG_STABLE:
+ printf("stable");
+ break;
+ case AGG_COUNT:
+ printf("count");
+ break;
+ }
+ printf("\n");
+ }
+
+ num_slaves = rte_eth_bond_slaves_get(port_id, slaves, RTE_MAX_ETHPORTS);
+
+ if (num_slaves < 0) {
+ fprintf(stderr, "\tFailed to get slave list for port = %d\n",
+ port_id);
+ return;
+ }
+ if (num_slaves > 0) {
+ printf("\tSlaves (%d): [", num_slaves);
+ for (i = 0; i < num_slaves - 1; i++)
+ printf("%d ", slaves[i]);
+
+ printf("%d]\n", slaves[num_slaves - 1]);
+ } else {
+ printf("\tSlaves: []\n");
+ }
+
+ num_active_slaves = rte_eth_bond_active_slaves_get(port_id, slaves,
+ RTE_MAX_ETHPORTS);
+
+ if (num_active_slaves < 0) {
+ fprintf(stderr,
+ "\tFailed to get active slave list for port = %d\n",
+ port_id);
+ return;
+ }
+ if (num_active_slaves > 0) {
+ printf("\tActive Slaves (%d): [", num_active_slaves);
+ for (i = 0; i < num_active_slaves - 1; i++)
+ printf("%d ", slaves[i]);
+
+ printf("%d]\n", slaves[num_active_slaves - 1]);
+
+ } else {
+ printf("\tActive Slaves: []\n");
+ }
+
+ primary_id = rte_eth_bond_primary_get(port_id);
+ if (primary_id < 0) {
+ fprintf(stderr, "\tFailed to get primary slave for port = %d\n",
+ port_id);
+ return;
+ }
+ printf("\tPrimary: [%d]\n", primary_id);
+}
+
+static cmdline_parse_token_string_t cmd_showbonding_config_show =
+TOKEN_STRING_INITIALIZER(struct cmd_show_bonding_config_result,
+ show, "show");
+static cmdline_parse_token_string_t cmd_showbonding_config_bonding =
+TOKEN_STRING_INITIALIZER(struct cmd_show_bonding_config_result,
+ bonding, "bonding");
+static cmdline_parse_token_string_t cmd_showbonding_config_config =
+TOKEN_STRING_INITIALIZER(struct cmd_show_bonding_config_result,
+ config, "config");
+static cmdline_parse_token_num_t cmd_showbonding_config_port =
+TOKEN_NUM_INITIALIZER(struct cmd_show_bonding_config_result,
+ port_id, RTE_UINT16);
+
+static cmdline_parse_inst_t cmd_show_bonding_config = {
+ .f = cmd_show_bonding_config_parsed,
+ .help_str = "show bonding config <port_id>: "
+ "Show the bonding config for port_id",
+ .data = NULL,
+ .tokens = {
+ (void *)&cmd_showbonding_config_show,
+ (void *)&cmd_showbonding_config_bonding,
+ (void *)&cmd_showbonding_config_config,
+ (void *)&cmd_showbonding_config_port,
+ NULL
+ }
+};
+
+/* *** SET BONDING PRIMARY *** */
+struct cmd_set_bonding_primary_result {
+ cmdline_fixed_string_t set;
+ cmdline_fixed_string_t bonding;
+ cmdline_fixed_string_t primary;
+ portid_t slave_id;
+ portid_t port_id;
+};
+
+static void cmd_set_bonding_primary_parsed(void *parsed_result,
+ __rte_unused struct cmdline *cl,
+ __rte_unused void *data)
+{
+ struct cmd_set_bonding_primary_result *res = parsed_result;
+ portid_t master_port_id = res->port_id;
+ portid_t slave_port_id = res->slave_id;
+
+ /* Set the primary slave for a bonded device. */
+ if (rte_eth_bond_primary_set(master_port_id, slave_port_id) != 0) {
+ fprintf(stderr, "\t Failed to set primary slave for port = %d.\n",
+ master_port_id);
+ return;
+ }
+ init_port_config();
+}
+
+static cmdline_parse_token_string_t cmd_setbonding_primary_set =
+TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_primary_result,
+ set, "set");
+static cmdline_parse_token_string_t cmd_setbonding_primary_bonding =
+TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_primary_result,
+ bonding, "bonding");
+static cmdline_parse_token_string_t cmd_setbonding_primary_primary =
+TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_primary_result,
+ primary, "primary");
+static cmdline_parse_token_num_t cmd_setbonding_primary_slave =
+TOKEN_NUM_INITIALIZER(struct cmd_set_bonding_primary_result,
+ slave_id, RTE_UINT16);
+static cmdline_parse_token_num_t cmd_setbonding_primary_port =
+TOKEN_NUM_INITIALIZER(struct cmd_set_bonding_primary_result,
+ port_id, RTE_UINT16);
+
+static cmdline_parse_inst_t cmd_set_bonding_primary = {
+ .f = cmd_set_bonding_primary_parsed,
+ .help_str = "set bonding primary <slave_id> <port_id>: "
+ "Set the primary slave for port_id",
+ .data = NULL,
+ .tokens = {
+ (void *)&cmd_setbonding_primary_set,
+ (void *)&cmd_setbonding_primary_bonding,
+ (void *)&cmd_setbonding_primary_primary,
+ (void *)&cmd_setbonding_primary_slave,
+ (void *)&cmd_setbonding_primary_port,
+ NULL
+ }
+};
+
+/* *** ADD SLAVE *** */
+struct cmd_add_bonding_slave_result {
+ cmdline_fixed_string_t add;
+ cmdline_fixed_string_t bonding;
+ cmdline_fixed_string_t slave;
+ portid_t slave_id;
+ portid_t port_id;
+};
+
+static void cmd_add_bonding_slave_parsed(void *parsed_result,
+ __rte_unused struct cmdline *cl,
+ __rte_unused void *data)
+{
+ struct cmd_add_bonding_slave_result *res = parsed_result;
+ portid_t master_port_id = res->port_id;
+ portid_t slave_port_id = res->slave_id;
+
+ /* add the slave for a bonded device. */
+ if (rte_eth_bond_slave_add(master_port_id, slave_port_id) != 0) {
+ fprintf(stderr,
+ "\t Failed to add slave %d to master port = %d.\n",
+ slave_port_id, master_port_id);
+ return;
+ }
+ init_port_config();
+ set_port_slave_flag(slave_port_id);
+}
+
+static cmdline_parse_token_string_t cmd_addbonding_slave_add =
+TOKEN_STRING_INITIALIZER(struct cmd_add_bonding_slave_result,
+ add, "add");
+static cmdline_parse_token_string_t cmd_addbonding_slave_bonding =
+TOKEN_STRING_INITIALIZER(struct cmd_add_bonding_slave_result,
+ bonding, "bonding");
+static cmdline_parse_token_string_t cmd_addbonding_slave_slave =
+TOKEN_STRING_INITIALIZER(struct cmd_add_bonding_slave_result,
+ slave, "slave");
+static cmdline_parse_token_num_t cmd_addbonding_slave_slaveid =
+TOKEN_NUM_INITIALIZER(struct cmd_add_bonding_slave_result,
+ slave_id, RTE_UINT16);
+static cmdline_parse_token_num_t cmd_addbonding_slave_port =
+TOKEN_NUM_INITIALIZER(struct cmd_add_bonding_slave_result,
+ port_id, RTE_UINT16);
+
+static cmdline_parse_inst_t cmd_add_bonding_slave = {
+ .f = cmd_add_bonding_slave_parsed,
+ .help_str = "add bonding slave <slave_id> <port_id>: "
+ "Add a slave device to a bonded device",
+ .data = NULL,
+ .tokens = {
+ (void *)&cmd_addbonding_slave_add,
+ (void *)&cmd_addbonding_slave_bonding,
+ (void *)&cmd_addbonding_slave_slave,
+ (void *)&cmd_addbonding_slave_slaveid,
+ (void *)&cmd_addbonding_slave_port,
+ NULL
+ }
+};
+
+/* *** REMOVE SLAVE *** */
+struct cmd_remove_bonding_slave_result {
+ cmdline_fixed_string_t remove;
+ cmdline_fixed_string_t bonding;
+ cmdline_fixed_string_t slave;
+ portid_t slave_id;
+ portid_t port_id;
+};
+
+static void cmd_remove_bonding_slave_parsed(void *parsed_result,
+ __rte_unused struct cmdline *cl,
+ __rte_unused void *data)
+{
+ struct cmd_remove_bonding_slave_result *res = parsed_result;
+ portid_t master_port_id = res->port_id;
+ portid_t slave_port_id = res->slave_id;
+
+ /* remove the slave from a bonded device. */
+ if (rte_eth_bond_slave_remove(master_port_id, slave_port_id) != 0) {
+ fprintf(stderr,
+ "\t Failed to remove slave %d from master port = %d.\n",
+ slave_port_id, master_port_id);
+ return;
+ }
+ init_port_config();
+ clear_port_slave_flag(slave_port_id);
+}
+
+static cmdline_parse_token_string_t cmd_removebonding_slave_remove =
+ TOKEN_STRING_INITIALIZER(struct cmd_remove_bonding_slave_result,
+ remove, "remove");
+static cmdline_parse_token_string_t cmd_removebonding_slave_bonding =
+ TOKEN_STRING_INITIALIZER(struct cmd_remove_bonding_slave_result,
+ bonding, "bonding");
+static cmdline_parse_token_string_t cmd_removebonding_slave_slave =
+ TOKEN_STRING_INITIALIZER(struct cmd_remove_bonding_slave_result,
+ slave, "slave");
+static cmdline_parse_token_num_t cmd_removebonding_slave_slaveid =
+ TOKEN_NUM_INITIALIZER(struct cmd_remove_bonding_slave_result,
+ slave_id, RTE_UINT16);
+static cmdline_parse_token_num_t cmd_removebonding_slave_port =
+ TOKEN_NUM_INITIALIZER(struct cmd_remove_bonding_slave_result,
+ port_id, RTE_UINT16);
+
+static cmdline_parse_inst_t cmd_remove_bonding_slave = {
+ .f = cmd_remove_bonding_slave_parsed,
+ .help_str = "remove bonding slave <slave_id> <port_id>: "
+ "Remove a slave device from a bonded device",
+ .data = NULL,
+ .tokens = {
+ (void *)&cmd_removebonding_slave_remove,
+ (void *)&cmd_removebonding_slave_bonding,
+ (void *)&cmd_removebonding_slave_slave,
+ (void *)&cmd_removebonding_slave_slaveid,
+ (void *)&cmd_removebonding_slave_port,
+ NULL
+ }
+};
+
+/* *** CREATE BONDED DEVICE *** */
+struct cmd_create_bonded_device_result {
+ cmdline_fixed_string_t create;
+ cmdline_fixed_string_t bonded;
+ cmdline_fixed_string_t device;
+ uint8_t mode;
+ uint8_t socket;
+};
+
+static int bond_dev_num;
+
+static void cmd_create_bonded_device_parsed(void *parsed_result,
+ __rte_unused struct cmdline *cl,
+ __rte_unused void *data)
+{
+ struct cmd_create_bonded_device_result *res = parsed_result;
+ char ethdev_name[RTE_ETH_NAME_MAX_LEN];
+ int port_id;
+ int ret;
+
+ if (test_done == 0) {
+ fprintf(stderr, "Please stop forwarding first\n");
+ return;
+ }
+
+ snprintf(ethdev_name, RTE_ETH_NAME_MAX_LEN, "net_bonding_testpmd_%d",
+ bond_dev_num++);
+
+ /* Create a new bonded device. */
+ port_id = rte_eth_bond_create(ethdev_name, res->mode, res->socket);
+ if (port_id < 0) {
+ fprintf(stderr, "\t Failed to create bonded device.\n");
+ return;
+ }
+ printf("Created new bonded device %s on (port %d).\n", ethdev_name,
+ port_id);
+
+ /* Update number of ports */
+ nb_ports = rte_eth_dev_count_avail();
+ reconfig(port_id, res->socket);
+ ret = rte_eth_promiscuous_enable(port_id);
+ if (ret != 0)
+ fprintf(stderr, "Failed to enable promiscuous mode for port %u: %s - ignore\n",
+ port_id, rte_strerror(-ret));
+
+ ports[port_id].need_setup = 0;
+ ports[port_id].port_status = RTE_PORT_STOPPED;
+}
+
+static cmdline_parse_token_string_t cmd_createbonded_device_create =
+ TOKEN_STRING_INITIALIZER(struct cmd_create_bonded_device_result,
+ create, "create");
+static cmdline_parse_token_string_t cmd_createbonded_device_bonded =
+ TOKEN_STRING_INITIALIZER(struct cmd_create_bonded_device_result,
+ bonded, "bonded");
+static cmdline_parse_token_string_t cmd_createbonded_device_device =
+ TOKEN_STRING_INITIALIZER(struct cmd_create_bonded_device_result,
+ device, "device");
+static cmdline_parse_token_num_t cmd_createbonded_device_mode =
+ TOKEN_NUM_INITIALIZER(struct cmd_create_bonded_device_result,
+ mode, RTE_UINT8);
+static cmdline_parse_token_num_t cmd_createbonded_device_socket =
+ TOKEN_NUM_INITIALIZER(struct cmd_create_bonded_device_result,
+ socket, RTE_UINT8);
+
+static cmdline_parse_inst_t cmd_create_bonded_device = {
+ .f = cmd_create_bonded_device_parsed,
+ .help_str = "create bonded device <mode> <socket>: "
+ "Create a new bonded device with specific bonding mode and socket",
+ .data = NULL,
+ .tokens = {
+ (void *)&cmd_createbonded_device_create,
+ (void *)&cmd_createbonded_device_bonded,
+ (void *)&cmd_createbonded_device_device,
+ (void *)&cmd_createbonded_device_mode,
+ (void *)&cmd_createbonded_device_socket,
+ NULL
+ }
+};
+
+/* *** SET MAC ADDRESS IN BONDED DEVICE *** */
+struct cmd_set_bond_mac_addr_result {
+ cmdline_fixed_string_t set;
+ cmdline_fixed_string_t bonding;
+ cmdline_fixed_string_t mac_addr;
+ uint16_t port_num;
+ struct rte_ether_addr address;
+};
+
+static void cmd_set_bond_mac_addr_parsed(void *parsed_result,
+ __rte_unused struct cmdline *cl,
+ __rte_unused void *data)
+{
+ struct cmd_set_bond_mac_addr_result *res = parsed_result;
+ int ret;
+
+ if (port_id_is_invalid(res->port_num, ENABLED_WARN))
+ return;
+
+ ret = rte_eth_bond_mac_address_set(res->port_num, &res->address);
+
+ /* check the return value and print it if is < 0 */
+ if (ret < 0)
+ fprintf(stderr, "set_bond_mac_addr error: (%s)\n",
+ strerror(-ret));
+}
+
+static cmdline_parse_token_string_t cmd_set_bond_mac_addr_set =
+ TOKEN_STRING_INITIALIZER(struct cmd_set_bond_mac_addr_result, set, "set");
+static cmdline_parse_token_string_t cmd_set_bond_mac_addr_bonding =
+ TOKEN_STRING_INITIALIZER(struct cmd_set_bond_mac_addr_result, bonding,
+ "bonding");
+static cmdline_parse_token_string_t cmd_set_bond_mac_addr_mac =
+ TOKEN_STRING_INITIALIZER(struct cmd_set_bond_mac_addr_result, mac_addr,
+ "mac_addr");
+static cmdline_parse_token_num_t cmd_set_bond_mac_addr_portnum =
+ TOKEN_NUM_INITIALIZER(struct cmd_set_bond_mac_addr_result,
+ port_num, RTE_UINT16);
+static cmdline_parse_token_etheraddr_t cmd_set_bond_mac_addr_addr =
+ TOKEN_ETHERADDR_INITIALIZER(struct cmd_set_bond_mac_addr_result, address);
+
+static cmdline_parse_inst_t cmd_set_bond_mac_addr = {
+ .f = cmd_set_bond_mac_addr_parsed,
+ .data = NULL,
+ .help_str = "set bonding mac_addr <port_id> <mac_addr>",
+ .tokens = {
+ (void *)&cmd_set_bond_mac_addr_set,
+ (void *)&cmd_set_bond_mac_addr_bonding,
+ (void *)&cmd_set_bond_mac_addr_mac,
+ (void *)&cmd_set_bond_mac_addr_portnum,
+ (void *)&cmd_set_bond_mac_addr_addr,
+ NULL
+ }
+};
+
+/* *** SET LINK STATUS MONITORING POLLING PERIOD ON BONDED DEVICE *** */
+struct cmd_set_bond_mon_period_result {
+ cmdline_fixed_string_t set;
+ cmdline_fixed_string_t bonding;
+ cmdline_fixed_string_t mon_period;
+ uint16_t port_num;
+ uint32_t period_ms;
+};
+
+static void cmd_set_bond_mon_period_parsed(void *parsed_result,
+ __rte_unused struct cmdline *cl,
+ __rte_unused void *data)
+{
+ struct cmd_set_bond_mon_period_result *res = parsed_result;
+ int ret;
+
+ ret = rte_eth_bond_link_monitoring_set(res->port_num, res->period_ms);
+
+ /* check the return value and print it if is < 0 */
+ if (ret < 0)
+ fprintf(stderr, "set_bond_mac_addr error: (%s)\n",
+ strerror(-ret));
+}
+
+static cmdline_parse_token_string_t cmd_set_bond_mon_period_set =
+ TOKEN_STRING_INITIALIZER(struct cmd_set_bond_mon_period_result,
+ set, "set");
+static cmdline_parse_token_string_t cmd_set_bond_mon_period_bonding =
+ TOKEN_STRING_INITIALIZER(struct cmd_set_bond_mon_period_result,
+ bonding, "bonding");
+static cmdline_parse_token_string_t cmd_set_bond_mon_period_mon_period =
+ TOKEN_STRING_INITIALIZER(struct cmd_set_bond_mon_period_result,
+ mon_period, "mon_period");
+static cmdline_parse_token_num_t cmd_set_bond_mon_period_portnum =
+ TOKEN_NUM_INITIALIZER(struct cmd_set_bond_mon_period_result,
+ port_num, RTE_UINT16);
+static cmdline_parse_token_num_t cmd_set_bond_mon_period_period_ms =
+ TOKEN_NUM_INITIALIZER(struct cmd_set_bond_mon_period_result,
+ period_ms, RTE_UINT32);
+
+static cmdline_parse_inst_t cmd_set_bond_mon_period = {
+ .f = cmd_set_bond_mon_period_parsed,
+ .data = NULL,
+ .help_str = "set bonding mon_period <port_id> <period_ms>",
+ .tokens = {
+ (void *)&cmd_set_bond_mon_period_set,
+ (void *)&cmd_set_bond_mon_period_bonding,
+ (void *)&cmd_set_bond_mon_period_mon_period,
+ (void *)&cmd_set_bond_mon_period_portnum,
+ (void *)&cmd_set_bond_mon_period_period_ms,
+ NULL
+ }
+};
+
+struct cmd_set_bonding_agg_mode_policy_result {
+ cmdline_fixed_string_t set;
+ cmdline_fixed_string_t bonding;
+ cmdline_fixed_string_t agg_mode;
+ uint16_t port_num;
+ cmdline_fixed_string_t policy;
+};
+
+static void
+cmd_set_bonding_agg_mode(void *parsed_result,
+ __rte_unused struct cmdline *cl,
+ __rte_unused void *data)
+{
+ struct cmd_set_bonding_agg_mode_policy_result *res = parsed_result;
+ uint8_t policy = AGG_BANDWIDTH;
+
+ if (!strcmp(res->policy, "bandwidth"))
+ policy = AGG_BANDWIDTH;
+ else if (!strcmp(res->policy, "stable"))
+ policy = AGG_STABLE;
+ else if (!strcmp(res->policy, "count"))
+ policy = AGG_COUNT;
+
+ rte_eth_bond_8023ad_agg_selection_set(res->port_num, policy);
+}
+
+static cmdline_parse_token_string_t cmd_set_bonding_agg_mode_set =
+ TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_agg_mode_policy_result,
+ set, "set");
+static cmdline_parse_token_string_t cmd_set_bonding_agg_mode_bonding =
+ TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_agg_mode_policy_result,
+ bonding, "bonding");
+
+static cmdline_parse_token_string_t cmd_set_bonding_agg_mode_agg_mode =
+ TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_agg_mode_policy_result,
+ agg_mode, "agg_mode");
+
+static cmdline_parse_token_num_t cmd_set_bonding_agg_mode_portnum =
+ TOKEN_NUM_INITIALIZER(struct cmd_set_bonding_agg_mode_policy_result,
+ port_num, RTE_UINT16);
+
+static cmdline_parse_token_string_t cmd_set_bonding_agg_mode_policy_string =
+ TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_balance_xmit_policy_result,
+ policy, "stable#bandwidth#count");
+
+static cmdline_parse_inst_t cmd_set_bonding_agg_mode_policy = {
+ .f = cmd_set_bonding_agg_mode,
+ .data = NULL,
+ .help_str = "set bonding mode IEEE802.3AD aggregator policy <port_id> <agg_name>",
+ .tokens = {
+ (void *)&cmd_set_bonding_agg_mode_set,
+ (void *)&cmd_set_bonding_agg_mode_bonding,
+ (void *)&cmd_set_bonding_agg_mode_agg_mode,
+ (void *)&cmd_set_bonding_agg_mode_portnum,
+ (void *)&cmd_set_bonding_agg_mode_policy_string,
+ NULL
+ }
+};
+
+static struct testpmd_cmdline_parser driver_parser = {
+ .ctx = (cmdline_parse_ctx_t[]) {
+ (cmdline_parse_inst_t *)&cmd_set_bonding_mode,
+ (cmdline_parse_inst_t *)&cmd_show_bonding_config,
+ (cmdline_parse_inst_t *)&cmd_show_bonding_lacp_info,
+ (cmdline_parse_inst_t *)&cmd_set_bonding_primary,
+ (cmdline_parse_inst_t *)&cmd_add_bonding_slave,
+ (cmdline_parse_inst_t *)&cmd_remove_bonding_slave,
+ (cmdline_parse_inst_t *)&cmd_create_bonded_device,
+ (cmdline_parse_inst_t *)&cmd_set_bond_mac_addr,
+ (cmdline_parse_inst_t *)&cmd_set_balance_xmit_policy,
+ (cmdline_parse_inst_t *)&cmd_set_bond_mon_period,
+ (cmdline_parse_inst_t *)&cmd_set_lacp_dedicated_queues,
+ (cmdline_parse_inst_t *)&cmd_set_bonding_agg_mode_policy,
+ NULL
+ },
+ .help = {
+ "set bonding mode (value) (port_id)\n"
+ " Set the bonding mode on a bonded device.\n",
+
+ "show bonding config (port_id)\n"
+ " Show the bonding config for port_id.\n",
+
+ "show bonding lacp info (port_id)\n"
+ " Show the bonding lacp information for port_id.\n",
+
+ "set bonding primary (slave_id) (port_id)\n"
+ " Set the primary slave for a bonded device.\n",
+
+ "add bonding slave (slave_id) (port_id)\n"
+ " Add a slave device to a bonded device.\n",
+
+ "remove bonding slave (slave_id) (port_id)\n"
+ " Remove a slave device from a bonded device.\n",
+
+ "create bonded device (mode) (socket)\n"
+ " Create a new bonded device with specific bonding mode and socket.\n",
+
+ "set bonding mac_addr (port_id) (address)\n"
+ " Set the MAC address of a bonded device.\n",
+
+ "set bonding balance_xmit_policy (port_id) (l2|l23|l34)\n"
+ " Set the transmit balance policy for bonded device running in balance mode.\n",
+
+ "set bonding mon_period (port_id) (value)\n"
+ " Set the bonding link status monitoring polling period in ms.\n",
+
+ "set bonding lacp dedicated_queues <port_id> (enable|disable)\n"
+ " Enable/disable dedicated queues for LACP control traffic.\n",
+
+ "set bonding mode IEEE802.3AD aggregator policy (port_id) (agg_name)\n"
+ " Set Aggregation mode for IEEE802.3AD (mode 4)\n",
+
+ NULL
+ },
+};
+
+RTE_INIT(bonding_testpmd)
+{
+ testpmd_add_commands(&driver_parser);
+}
--
2.36.1
next prev parent reply other threads:[~2022-05-18 19:47 UTC|newest]
Thread overview: 65+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-05-13 7:57 [RFC PATCH 0/4] Split driver specific commands out of testpmd David Marchand
2022-05-13 7:57 ` [RFC PATCH 1/4] app/testpmd: register driver specific commands David Marchand
2022-05-13 10:30 ` David Marchand
2022-05-13 7:57 ` [RFC PATCH 2/4] net/bonding: move testpmd commands David Marchand
2022-05-13 10:09 ` Min Hu (Connor)
2022-05-18 17:24 ` David Marchand
2022-05-18 23:25 ` Konstantin Ananyev
2022-05-19 7:40 ` David Marchand
2022-05-19 11:26 ` Thomas Monjalon
2022-05-20 6:59 ` Andrew Rybchenko
2022-05-24 9:40 ` Konstantin Ananyev
2022-05-24 10:15 ` Thomas Monjalon
2022-05-24 22:41 ` Konstantin Ananyev
2022-05-13 7:57 ` [RFC PATCH 3/4] net/i40e: " David Marchand
2022-05-13 7:57 ` [RFC PATCH 4/4] net/ixgbe: " David Marchand
2022-05-18 19:46 ` [RFC PATCH v2 0/5] Split driver specific commands out of testpmd David Marchand
2022-05-18 19:46 ` [RFC PATCH v2 1/5] app/testpmd: mark cmdline symbols as static David Marchand
2022-05-20 6:28 ` Andrew Rybchenko
2022-05-18 19:46 ` [RFC PATCH v2 2/5] app/testpmd: register driver specific commands David Marchand
2022-05-20 6:55 ` Andrew Rybchenko
2022-05-18 19:46 ` David Marchand [this message]
2022-05-20 6:55 ` [RFC PATCH v2 3/5] net/bonding: move testpmd commands Andrew Rybchenko
2022-05-18 19:46 ` [RFC PATCH v2 4/5] net/i40e: " David Marchand
2022-05-18 19:46 ` [RFC PATCH v2 5/5] net/ixgbe: " David Marchand
2022-05-20 7:04 ` [RFC PATCH v2 0/5] Split driver specific commands out of testpmd Andrew Rybchenko
2022-05-23 7:10 ` [PATCH 0/6] " David Marchand
2022-05-23 7:10 ` [PATCH 1/6] app/testpmd: mark most cmdline symbols as static David Marchand
2022-05-23 10:19 ` Dumitrescu, Cristian
2022-05-23 18:09 ` Ferruh Yigit
2022-05-23 7:10 ` [PATCH 2/6] app/testpmd: register driver specific commands David Marchand
2022-05-23 18:10 ` Ferruh Yigit
2022-05-24 10:53 ` David Marchand
2022-05-24 11:43 ` Ferruh Yigit
2022-05-24 17:21 ` Thomas Monjalon
2022-05-24 17:44 ` David Marchand
2022-05-24 17:51 ` Thomas Monjalon
2022-05-23 7:10 ` [PATCH 3/6] net/bonding: move testpmd commands David Marchand
2022-05-23 18:10 ` Ferruh Yigit
2022-06-17 5:06 ` [PATCH v2] " David Marchand
2022-06-20 17:53 ` Ferruh Yigit
2022-05-23 7:10 ` [PATCH 4/6] net/i40e: " David Marchand
2022-06-17 5:07 ` [PATCH v2] " David Marchand
2022-06-20 17:53 ` Ferruh Yigit
2022-05-23 7:10 ` [PATCH 5/6] app/testpmd: drop ixgbe bypass commands David Marchand
2022-05-23 18:10 ` Ferruh Yigit
2022-06-17 5:07 ` [PATCH v2 1/3] app/testpmd: restore " David Marchand
2022-06-17 5:07 ` [PATCH v2 2/3] net/ixgbe: move testpmd commands David Marchand
2022-06-17 5:07 ` [PATCH v2 3/3] net/ixgbe: move bypass init in a testpmd command David Marchand
2022-06-20 19:04 ` Ferruh Yigit
2022-06-23 12:35 ` Zhang, Qi Z
2022-07-21 8:05 ` [PATCH v3 1/3] app/testpmd: restore ixgbe bypass commands David Marchand
2022-07-21 8:05 ` [PATCH v3 2/3] net/ixgbe: move testpmd commands David Marchand
2022-07-21 8:05 ` [PATCH v3 3/3] net/ixgbe: move bypass init in a testpmd command David Marchand
2022-08-25 10:37 ` Ferruh Yigit
2022-08-25 11:44 ` [PATCH v3 1/3] app/testpmd: restore ixgbe bypass commands Ferruh Yigit
2022-05-23 7:10 ` [PATCH 6/6] net/ixgbe: move testpmd commands David Marchand
2022-05-23 18:09 ` [PATCH 0/6] Split driver specific commands out of testpmd Ferruh Yigit
2022-05-24 20:06 ` [PATCH v2 0/2] " David Marchand
2022-05-24 20:06 ` [PATCH v2 1/2] app/testpmd: mark most cmdline symbols as static David Marchand
2022-05-31 15:15 ` Andrew Rybchenko
2022-05-24 20:06 ` [PATCH v2 2/2] app/testpmd: register driver specific commands David Marchand
2022-05-24 20:28 ` Thomas Monjalon
2022-05-31 15:14 ` Andrew Rybchenko
2022-05-31 15:18 ` David Marchand
2022-05-31 15:18 ` [PATCH v2 0/2] Split driver specific commands out of testpmd Andrew Rybchenko
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20220518194649.1868574-4-david.marchand@redhat.com \
--to=david.marchand@redhat.com \
--cc=aman.deep.singh@intel.com \
--cc=chas3@att.com \
--cc=dev@dpdk.org \
--cc=humin29@huawei.com \
--cc=thomas@monjalon.net \
--cc=xiaoyun.li@intel.com \
--cc=yuying.zhang@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).