From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by smtp.lore.kernel.org (Postfix) with ESMTP id 0E7D7C54EED for ; Mon, 30 Jan 2023 08:22:56 +0000 (UTC) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 0FD7740EDE; Mon, 30 Jan 2023 09:22:55 +0100 (CET) Received: from mga06.intel.com (mga06b.intel.com [134.134.136.31]) by mails.dpdk.org (Postfix) with ESMTP id 4FAE340C35 for ; Mon, 30 Jan 2023 09:22:53 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1675066973; x=1706602973; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=6T1GjPIiGBRZsytNVGG+GrO5JDO1wL/mEQeavb3NJ6k=; b=IT7fwgLgYwAmlwge8w4RuPlcNyUyZXR5G47Ujh90/aUpgL9Cmd8Ci/sU ue8jmJqQ5zDSqFxuSs1oI0rn3c6Ljs3MFDj13eyt1GStafolruQ+3SmM6 T6IX6FwjedvQ+u912Ds7pO30gion+D+Ry4AU6v+5z9TlgJvTd40CC0zIz ostEcGWX7X4LOvC1aIPEio/vPN8NCpUB9+3XdStmDg/FHrioGvEDwBR/S pvB7nkkx/IcnPQN4NVqtd0O8LMmdC/bylhLdaAR9GafrCTSHelcaez0Hx pOChY09Itz712rbiLu3ArgEKR2yF3fpXe7FSYMxPrlOMYhUX6hLjvq/PS A==; X-IronPort-AV: E=McAfee;i="6500,9779,10605"; a="389872813" X-IronPort-AV: E=Sophos;i="5.97,257,1669104000"; d="scan'208";a="389872813" Received: from fmsmga008.fm.intel.com ([10.253.24.58]) by orsmga104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 30 Jan 2023 00:22:52 -0800 X-IronPort-AV: E=McAfee;i="6500,9779,10605"; a="727412978" X-IronPort-AV: E=Sophos;i="5.97,257,1669104000"; d="scan'208";a="727412978" Received: from unknown (HELO localhost.localdomain) ([10.239.252.104]) by fmsmga008-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 30 Jan 2023 00:22:49 -0800 From: Ke Zhang To: dev@dpdk.org, mb@smartsharesystems.com, thomas@monjalon.net, ferruh.yigit@amd.com, olivier.matz@6wind.com, Yuying.Zhang@intel.com, beilei.xing@intel.com Cc: Ke Zhang Subject: [PATCH v2] net/i40e: support enabling/disabling source pruning Date: Mon, 30 Jan 2023 16:09:16 +0800 Message-Id: <20230130080916.77274-1-ke1x.zhang@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20230109022027.190627-1-ke1x.zhang@intel.com> References: <20230109022027.190627-1-ke1x.zhang@intel.com> 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 List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org VRRP advertisement packets are dropped on i40e PF devices 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 Signed-off-by: Ke Zhang --- app/test-pmd/cmdline.c | 84 +++++++++++++++++++++++++++++++++ drivers/net/i40e/i40e_ethdev.c | 43 +++++++++++++++++ drivers/net/i40e/i40e_ethdev.h | 1 + drivers/net/i40e/rte_pmd_i40e.c | 20 ++++++++ drivers/net/i40e/rte_pmd_i40e.h | 16 +++++++ 5 files changed, 164 insertions(+) diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c index cb8c174020..76a574affd 100644 --- a/app/test-pmd/cmdline.c +++ b/app/test-pmd/cmdline.c @@ -776,6 +776,9 @@ static void cmd_help_long_parsed(void *parsed_result, "port cleanup (port_id) txq (queue_id) (free_cnt)\n" " Cleanup txq mbufs for a specific Tx queue\n\n" + + "port config (port_id|all) src_prune (on|off)\n" + " Set source prune on port_id, or all.\n\n" ); } @@ -1619,6 +1622,84 @@ static cmdline_parse_inst_t cmd_config_loopback_specific = { }, }; +/* *** 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_num; /* valid if "allports" argument == 0 */ + cmdline_fixed_string_t item; + cmdline_fixed_string_t enable; +}; + +static void cmd_config_src_prune_parsed(void *parsed_result, + __rte_unused struct cmdline *cl, + void *allports) +{ + struct cmd_config_src_prune_result *res = parsed_result; + int enable; + portid_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_src_prune(i, enable); + } else { + rte_pmd_i40e_set_src_prune(res->port_num, 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_portnum = + TOKEN_NUM_INITIALIZER(struct cmd_config_src_prune_result, port_num, + RTE_UINT16); +static cmdline_parse_token_string_t cmd_config_src_prune_item = + TOKEN_STRING_INITIALIZER(struct cmd_config_src_prune_result, + item, "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_src_prune_parsed, + .data = (void *)1, + .help_str = "port config all src_prune (on|off): Set source prune on all 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_src_prune_parsed, + .data = (void *)0, + .help_str = "port config all src_prune (on|off): Set source prune on specific port.", + .tokens = { + (void *)&cmd_config_src_prune_port, + (void *)&cmd_config_src_prune_keyword, + (void *)&cmd_config_src_prune_portnum, + (void *)&cmd_config_src_prune_item, + (void *)&cmd_config_src_prune_enable, + NULL, + }, +}; + /* *** configure txq/rxq, txd/rxd *** */ struct cmd_config_rx_tx { cmdline_fixed_string_t port; @@ -12731,6 +12812,8 @@ static cmdline_parse_ctx_t builtin_ctx[] = { (cmdline_parse_inst_t *)&cmd_config_speed_specific, (cmdline_parse_inst_t *)&cmd_config_loopback_all, (cmdline_parse_inst_t *)&cmd_config_loopback_specific, + (cmdline_parse_inst_t *)&cmd_config_src_prune_all, + (cmdline_parse_inst_t *)&cmd_config_src_prune_specific, (cmdline_parse_inst_t *)&cmd_config_rx_tx, (cmdline_parse_inst_t *)&cmd_config_mtu, (cmdline_parse_inst_t *)&cmd_config_max_pkt_len, @@ -12850,6 +12933,7 @@ static cmdline_parse_ctx_t builtin_ctx[] = { (cmdline_parse_inst_t *)&cmd_operate_bpf_unld_parse, #endif (cmdline_parse_inst_t *)&cmd_config_tx_metadata_specific, + (cmdline_parse_inst_t *)&cmd_show_tx_metadata, (cmdline_parse_inst_t *)&cmd_show_rx_tx_desc_status, (cmdline_parse_inst_t *)&cmd_show_rx_queue_desc_used_count, diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c index 7726a89d99..0f993b958e 100644 --- a/drivers/net/i40e/i40e_ethdev.c +++ b/drivers/net/i40e/i40e_ethdev.c @@ -5634,6 +5634,46 @@ i40e_enable_pf_lb(struct i40e_pf *pf) hw->aq.asq_last_status); } +/* i40e_set_pf_source_prune + * @pf: pointer to the pf structure + * @on: Enable/disable source prune + * + * set source prune on pf + */ +int +i40e_set_pf_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, @@ -5691,6 +5731,9 @@ i40e_vsi_setup(struct i40e_pf *pf, } } + /* source prune is disabled to support VRRP in default*/ + i40e_set_pf_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 7c4cc44a27..df1591584b 100644 --- a/drivers/net/i40e/i40e_ethdev.h +++ b/drivers/net/i40e/i40e_ethdev.h @@ -1427,6 +1427,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_set_pf_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/rte_pmd_i40e.c b/drivers/net/i40e/rte_pmd_i40e.c index 35829a1eea..b9fc3c24a1 100644 --- a/drivers/net/i40e/rte_pmd_i40e.c +++ b/drivers/net/i40e/rte_pmd_i40e.c @@ -445,6 +445,26 @@ rte_pmd_i40e_set_tx_loopback(uint16_t port, uint8_t on) return ret; } +int +rte_pmd_i40e_set_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_set_pf_source_prune(pf, on); + return ret; +} + int rte_pmd_i40e_set_vf_unicast_promisc(uint16_t port, uint16_t vf_id, uint8_t on) { diff --git a/drivers/net/i40e/rte_pmd_i40e.h b/drivers/net/i40e/rte_pmd_i40e.h index 4cb21c3713..76c9296413 100644 --- a/drivers/net/i40e/rte_pmd_i40e.h +++ b/drivers/net/i40e/rte_pmd_i40e.h @@ -400,6 +400,22 @@ int rte_pmd_i40e_set_vf_vlan_anti_spoof(uint16_t port, int rte_pmd_i40e_set_tx_loopback(uint16_t port, uint8_t on); +/** + * 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. + */ +int rte_pmd_i40e_set_src_prune(uint16_t port, + uint8_t on); + /** * Enable/Disable VF unicast promiscuous mode. * -- 2.25.1