From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id A855342965 for ; Mon, 17 Apr 2023 03:57:49 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 94B8442BC9; Mon, 17 Apr 2023 03:57:49 +0200 (CEST) Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) by mails.dpdk.org (Postfix) with ESMTP id 59CD54021D; Mon, 17 Apr 2023 03:57:46 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1681696666; x=1713232666; h=from:to:cc:subject:date:message-id:mime-version: content-transfer-encoding; bh=9awylVdVkbTrp2Z0o/vOvH+EeDtQXLMfD7pSrpmKhlk=; b=N2bhlovLOrDqNvgNvSwShAkc9WUZ/e6fBaxNRPpmJRnnk5L22QjnfF2Z ph61JIfI7KJGYOy2iucoRNXaC9euqXBi7sWoHT534MkmYGJO9z3787CWn LCYwE3wfMFRcpd1k3ZpTd3c+AVqqTTJWkMw8XiXfjkikTtSlICpo8f4lm /FiyTc+VfbOic0+3OFh+wwVvBGNMsok5NgRlxaJl2jMiIMU0osD/Q8hJF L6WizaynEYW3wCfyystmWj3/72eWKkAkgD5gc6HnQid4QCBKymUI9lbHH kEB2CMx7tE0F9M+BR32AQixX2k/Xa/JTO9KfwK09+t/yVyqYhEjxX4OWB w==; X-IronPort-AV: E=McAfee;i="6600,9927,10682"; a="342274606" X-IronPort-AV: E=Sophos;i="5.99,203,1677571200"; d="scan'208";a="342274606" Received: from orsmga006.jf.intel.com ([10.7.209.51]) by fmsmga102.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Apr 2023 18:57:45 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10682"; a="667948657" X-IronPort-AV: E=Sophos;i="5.99,203,1677571200"; d="scan'208";a="667948657" Received: from unknown (HELO localhost.localdomain) ([10.239.252.253]) by orsmga006-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Apr 2023 18:57:40 -0700 From: Mingjin Ye To: dev@dpdk.org Cc: qiming.yang@intel.com, stable@dpdk.org, yidingx.zhou@intel.com, Mingjin Ye , Yuying Zhang , Beilei Xing Subject: [PATCH v3] net/i40e: support enable/disable source pruning Date: Mon, 17 Apr 2023 01:51:40 +0000 Message-Id: <20230417015140.40421-1-mingjinx.ye@intel.com> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-BeenThere: stable@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: patches for DPDK stable branches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: stable-bounces@dpdk.org VRRP advertisement packets are dropped on i40e PF device because when a MAC address is added to a device, packets originating from that MAC address are dropped. This patch adds a PMD specific API to enable/disable source pruning to fix above issue. Bugzilla ID: 648 Fixes: 94b3c1a72507 ("net/i40e: move testpmd commands") Fixes: bce83974ba2c ("net/i40e: set Tx loopback from PF") Fixes: 96974a6600ec ("net/i40e: move private APIs to a specific file") Fixes: 689bba33272d ("i40e: add VEB switching support") Fixes: 440499cf5376 ("net/i40e: support floating VEB") Fixes: ef4c16fd9148 ("net/i40e: refactor RSS flow") Cc: stable@dpdk.org Signed-off-by: Mingjin Ye --- v3: The i40e specific commands are moved to drivers/net/i40e/i40e_testpmd.c. --- drivers/net/i40e/i40e_ethdev.c | 43 ++++++++++++++++ drivers/net/i40e/i40e_ethdev.h | 1 + drivers/net/i40e/i40e_testpmd.c | 88 +++++++++++++++++++++++++++++++++ drivers/net/i40e/rte_pmd_i40e.c | 20 ++++++++ drivers/net/i40e/rte_pmd_i40e.h | 17 +++++++ drivers/net/i40e/version.map | 1 + 6 files changed, 170 insertions(+) diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c index cb0070f94b..90d8e5a8bc 100644 --- a/drivers/net/i40e/i40e_ethdev.c +++ b/drivers/net/i40e/i40e_ethdev.c @@ -5647,6 +5647,46 @@ i40e_enable_pf_lb(struct i40e_pf *pf) hw->aq.asq_last_status); } +/* i40e_pf_set_source_prune + * @pf: pointer to the pf structure + * @on: Enable/disable source prune + * + * set source prune on pf + */ +int +i40e_pf_set_source_prune(struct i40e_pf *pf, int on) +{ + struct i40e_hw *hw = I40E_PF_TO_HW(pf); + struct i40e_vsi_context ctxt; + int ret; + + memset(&ctxt, 0, sizeof(ctxt)); + ctxt.seid = pf->main_vsi_seid; + ctxt.pf_num = hw->pf_id; + ret = i40e_aq_get_vsi_params(hw, &ctxt, NULL); + if (ret) { + PMD_DRV_LOG(ERR, "cannot get pf vsi config, err %d, aq_err %d", + ret, hw->aq.asq_last_status); + return ret; + } + ctxt.flags = I40E_AQ_VSI_TYPE_PF; + ctxt.info.valid_sections = + rte_cpu_to_le_16(I40E_AQ_VSI_PROP_SWITCH_VALID); + if (on) + ctxt.info.switch_id &= + ~rte_cpu_to_le_16(I40E_AQ_VSI_SW_ID_FLAG_LOCAL_LB); + else + ctxt.info.switch_id |= + rte_cpu_to_le_16(I40E_AQ_VSI_SW_ID_FLAG_LOCAL_LB); + + ret = i40e_aq_update_vsi_params(hw, &ctxt, NULL); + if (ret) + PMD_DRV_LOG(ERR, "update vsi switch failed, aq_err=%d", + hw->aq.asq_last_status); + + return ret; +} + /* Setup a VSI */ struct i40e_vsi * i40e_vsi_setup(struct i40e_pf *pf, @@ -5704,6 +5744,9 @@ i40e_vsi_setup(struct i40e_pf *pf, } } + /* source prune is disabled to support VRRP in default*/ + i40e_pf_set_source_prune(pf, 0); + vsi = rte_zmalloc("i40e_vsi", sizeof(struct i40e_vsi), 0); if (!vsi) { PMD_DRV_LOG(ERR, "Failed to allocate memory for vsi"); diff --git a/drivers/net/i40e/i40e_ethdev.h b/drivers/net/i40e/i40e_ethdev.h index 9b806d130e..6f65d5e0ac 100644 --- a/drivers/net/i40e/i40e_ethdev.h +++ b/drivers/net/i40e/i40e_ethdev.h @@ -1430,6 +1430,7 @@ int i40e_pf_calc_configured_queues_num(struct i40e_pf *pf); int i40e_pf_reset_rss_reta(struct i40e_pf *pf); int i40e_pf_reset_rss_key(struct i40e_pf *pf); int i40e_pf_config_rss(struct i40e_pf *pf); +int i40e_pf_set_source_prune(struct i40e_pf *pf, int on); int i40e_set_rss_key(struct i40e_vsi *vsi, uint8_t *key, uint8_t key_len); int i40e_set_rss_lut(struct i40e_vsi *vsi, uint8_t *lut, uint16_t lut_size); int i40e_vf_representor_init(struct rte_eth_dev *ethdev, void *init_params); diff --git a/drivers/net/i40e/i40e_testpmd.c b/drivers/net/i40e/i40e_testpmd.c index 7be9fea5b0..b6ef5d6e42 100644 --- a/drivers/net/i40e/i40e_testpmd.c +++ b/drivers/net/i40e/i40e_testpmd.c @@ -2446,6 +2446,84 @@ static cmdline_parse_inst_t cmd_ptype_mapping_update = { }, }; +/* *** configure source prune for port *** */ +struct cmd_config_src_prune_result { + cmdline_fixed_string_t port; + cmdline_fixed_string_t keyword; + cmdline_fixed_string_t port_all; /* valid if "allports" argument == 1 */ + uint16_t port_id; /* valid if "allports" argument == 0 */ + cmdline_fixed_string_t item; + cmdline_fixed_string_t enable; +}; + +static void cmd_config_pf_src_prune_parsed(void *parsed_result, + __rte_unused struct cmdline *cl, + void *allports) +{ + struct cmd_config_src_prune_result *res = parsed_result; + uint8_t enable; + uint16_t i; + + if (!strcmp(res->enable, "on")) + enable = 1; + else + enable = 0; + + /* all ports */ + if (allports) { + RTE_ETH_FOREACH_DEV(i) + rte_pmd_i40e_set_pf_src_prune(i, enable); + } else { + rte_pmd_i40e_set_pf_src_prune(res->port_id, enable); + } +} + +static cmdline_parse_token_string_t cmd_config_src_prune_port = + TOKEN_STRING_INITIALIZER(struct cmd_config_src_prune_result, port, "port"); +static cmdline_parse_token_string_t cmd_config_src_prune_keyword = + TOKEN_STRING_INITIALIZER(struct cmd_config_src_prune_result, keyword, + "config"); +static cmdline_parse_token_string_t cmd_config_src_prune_portall = + TOKEN_STRING_INITIALIZER(struct cmd_config_src_prune_result, port_all, + "all"); +static cmdline_parse_token_num_t cmd_config_src_prune_port_id = + TOKEN_NUM_INITIALIZER(struct cmd_config_src_prune_result, port_id, + RTE_UINT16); +static cmdline_parse_token_string_t cmd_config_src_prune_item = + TOKEN_STRING_INITIALIZER(struct cmd_config_src_prune_result, + item, "i40e_src_prune"); +static cmdline_parse_token_string_t cmd_config_src_prune_enable = + TOKEN_STRING_INITIALIZER(struct cmd_config_src_prune_result, enable, + "on#off"); + +static cmdline_parse_inst_t cmd_config_src_prune_all = { + .f = cmd_config_pf_src_prune_parsed, + .data = (void *)1, + .help_str = "port config all i40e_src_prune on|off: Set source pruning on all pf ports.", + .tokens = { + (void *)&cmd_config_src_prune_port, + (void *)&cmd_config_src_prune_keyword, + (void *)&cmd_config_src_prune_portall, + (void *)&cmd_config_src_prune_item, + (void *)&cmd_config_src_prune_enable, + NULL, + }, +}; + +static cmdline_parse_inst_t cmd_config_src_prune_specific = { + .f = cmd_config_pf_src_prune_parsed, + .data = (void *)0, + .help_str = "port config i40e_src_prune on|off: Set source pruning on specific pf port.", + .tokens = { + (void *)&cmd_config_src_prune_port, + (void *)&cmd_config_src_prune_keyword, + (void *)&cmd_config_src_prune_port_id, + (void *)&cmd_config_src_prune_item, + (void *)&cmd_config_src_prune_enable, + NULL, + }, +}; + static struct testpmd_driver_commands i40e_cmds = { .commands = { { @@ -2592,6 +2670,16 @@ static struct testpmd_driver_commands i40e_cmds = { " (pctype_id_0[,pctype_id_1]*) (flow_type_id)\n" " Update a flow type to pctype mapping item on a port\n", }, + { + &cmd_config_src_prune_all, + "port config all i40e_src_prune (on|off)\n" + " Set source pruning on pf port all.\n" + }, + { + &cmd_config_src_prune_specific, + "port config (port_id) i40e_src_prune (on|off)\n" + " Set source pruning on pf port_id.\n" + }, { NULL, NULL }, }, }; diff --git a/drivers/net/i40e/rte_pmd_i40e.c b/drivers/net/i40e/rte_pmd_i40e.c index 35829a1eea..9d39984ea1 100644 --- a/drivers/net/i40e/rte_pmd_i40e.c +++ b/drivers/net/i40e/rte_pmd_i40e.c @@ -3282,3 +3282,23 @@ rte_pmd_i40e_set_switch_dev(uint16_t port_id, struct rte_eth_dev *switch_dev) return 0; } + +int +rte_pmd_i40e_set_pf_src_prune(uint16_t port, uint8_t on) +{ + struct rte_eth_dev *dev; + struct i40e_pf *pf; + int ret; + + RTE_ETH_VALID_PORTID_OR_ERR_RET(port, -ENODEV); + + dev = &rte_eth_devices[port]; + + if (!is_i40e_supported(dev)) + return -ENOTSUP; + + pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private); + + ret = i40e_pf_set_source_prune(pf, on); + return ret; +} diff --git a/drivers/net/i40e/rte_pmd_i40e.h b/drivers/net/i40e/rte_pmd_i40e.h index 4cb21c3713..a802f989e9 100644 --- a/drivers/net/i40e/rte_pmd_i40e.h +++ b/drivers/net/i40e/rte_pmd_i40e.h @@ -1134,6 +1134,23 @@ __rte_experimental int rte_pmd_i40e_set_switch_dev(uint16_t port_id, struct rte_eth_dev *switch_dev); +/** + * Enable/Disable source prune on all the PF. + * + * @param port + * The port identifier of the Ethernet device. + * @param on + * 1 - Enable source prune. + * 0 - Disable source prune. + * @return + * - (0) if successful. + * - (-ENODEV) if *port* invalid. + * - (-EINVAL) if bad parameter. + */ +__rte_experimental +int rte_pmd_i40e_set_pf_src_prune(uint16_t port, + uint8_t on); + #ifdef __cplusplus } #endif diff --git a/drivers/net/i40e/version.map b/drivers/net/i40e/version.map index 561db50eac..51e1ac4f06 100644 --- a/drivers/net/i40e/version.map +++ b/drivers/net/i40e/version.map @@ -46,4 +46,5 @@ EXPERIMENTAL { rte_pmd_i40e_get_fdir_stats; rte_pmd_i40e_set_gre_key_len; rte_pmd_i40e_set_switch_dev; + rte_pmd_i40e_set_pf_src_prune; }; -- 2.25.1