From patchwork Sun Oct 18 14:08:58 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Rybchenko X-Patchwork-Id: 81260 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 01188A04B0; Sun, 18 Oct 2020 16:10:36 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 8306ECFC9; Sun, 18 Oct 2020 16:09:32 +0200 (CEST) Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [67.231.154.164]) by dpdk.org (Postfix) with ESMTP id D42AFC87C for ; Sun, 18 Oct 2020 16:09:25 +0200 (CEST) Received: from mx1-us1.ppe-hosted.com (unknown [10.110.50.144]) by dispatch1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 729D420095; Sun, 18 Oct 2020 14:09:24 +0000 (UTC) Received: from us4-mdac16-2.at1.mdlocal (unknown [10.110.49.148]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 70E46800A4; Sun, 18 Oct 2020 14:09:24 +0000 (UTC) X-Virus-Scanned: Proofpoint Essentials engine Received: from mx1-us1.ppe-hosted.com (unknown [10.110.50.12]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id E3DBB4006F; Sun, 18 Oct 2020 14:09:23 +0000 (UTC) Received: from webmail.solarflare.com (uk.solarflare.com [193.34.186.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 9E1544005C; Sun, 18 Oct 2020 14:09:22 +0000 (UTC) Received: from ukex01.SolarFlarecom.com (10.17.10.4) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Sun, 18 Oct 2020 15:09:18 +0100 Received: from opal.uk.solarflarecom.com (10.17.10.1) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Sun, 18 Oct 2020 15:09:18 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (ukv-loginhost.uk.solarflarecom.com [10.17.10.39]) by opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id 09IE9H6H001990; Sun, 18 Oct 2020 15:09:17 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1]) by ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id 94E581613A9; Sun, 18 Oct 2020 15:09:17 +0100 (BST) From: Andrew Rybchenko To: Wenzhuo Lu , Beilei Xing , Bernard Iremonger , Ray Kinsella , Neil Horman , Jeff Guo , Rasesh Mody , Shahed Shaikh , Andrew Rybchenko , Thomas Monjalon , Ferruh Yigit CC: Date: Sun, 18 Oct 2020 15:08:58 +0100 Message-ID: <1603030152-13451-2-git-send-email-arybchenko@solarflare.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1603030152-13451-1-git-send-email-arybchenko@solarflare.com> References: <1603030152-13451-1-git-send-email-arybchenko@solarflare.com> MIME-Version: 1.0 X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.6.1012-25732.003 X-TM-AS-Result: No-12.903500-8.000000-10 X-TMASE-MatchedRID: 83JriJr7reU3VOJ/TfTyYsPRlYRmv+e2eouvej40T4gd0WOKRkwsh3Io zGa69omdrdoLblq9S5ra/g/NGTW3MqVQ2UDgU7NDIAjxomarSPDxuhkRWK22GOLsQIDmr3S5vQS /jzORDUH49TeP+hzSpbGFLqsKabaOPk3Ltq0ik9xPecEIo68ASx+26QzoWaY2V4i674aSi3xiVh Z6MGscrpq7+DtMdYiVECxVUAfg3wn+PzzbebkcBJyBsp6+TmyGPw8st9LJ22852X8YwVUEW4kII OqbR5F7CmviniliH8pD3/OEVqXP9DL7uOIf7WD3nMQdNQ64xfeByxVkfd04JIu6fTXJM2TrHixC Zq+8CAbEjTIwgJMkPCcS0UT/zgu0O5cso4YfEOwCHo2L+QRlp+dppbZRNp/IUjFJwpdmcrR95Ee pdMBiBn2dcFgFzv71EtRm78gcrDGzMsBjmgeEEP9XRIMLUOjQnQkHrAHoKqYpItvvrTT/tw9lTA N4Wxnx5gRGsse3q3eAMuqetGVetnyef22ep6XYOwBXM346/+wanNjYIBszZuAw2cgad7oBkWbc2 vUQnYGpgoBYvC/JUjbXXH/Q19SS X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10--12.903500-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.6.1012-25732.003 X-MDID: 1603030164-yBSB5B1vGob4 X-PPE-DISP: 1603030164;yBSB5B1vGob4 Subject: [dpdk-dev] [PATCH 01/14] ethdev: remove legacy MACVLAN filter type support X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" RTE flow API should be used for filtering. Signed-off-by: Andrew Rybchenko --- app/test-pmd/cmdline.c | 110 ------------------------- doc/guides/rel_notes/deprecation.rst | 2 +- drivers/net/i40e/i40e_ethdev.c | 116 --------------------------- drivers/net/qede/qede_filter.c | 1 - drivers/net/sfc/sfc_ethdev.c | 3 - lib/librte_ethdev/rte_eth_ctrl.h | 11 --- 6 files changed, 1 insertion(+), 242 deletions(-) diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c index 07ee4e4e13..bb0be8cf42 100644 --- a/app/test-pmd/cmdline.c +++ b/app/test-pmd/cmdline.c @@ -559,11 +559,6 @@ static void cmd_help_long_parsed(void *parsed_result, "set port (port_id) vf (vf_id) rx|tx on|off\n" " Enable/Disable a VF receive/tranmit from a port\n\n" - "set port (port_id) vf (vf_id) (mac_addr)" - " (exact-mac#exact-mac-vlan#hashmac|hashmac-vlan) on|off\n" - " Add/Remove unicast or multicast MAC addr filter" - " for a VF.\n\n" - "set port (port_id) vf (vf_id) rxmode (AUPE|ROPE|BAM" "|MPE) (on|off)\n" " AUPE:accepts untagged VLAN;" @@ -8757,110 +8752,6 @@ cmdline_parse_inst_t cmd_set_uc_all_hash_filter = { }, }; -/* *** CONFIGURE MACVLAN FILTER FOR VF(s) *** */ -struct cmd_set_vf_macvlan_filter { - cmdline_fixed_string_t set; - cmdline_fixed_string_t port; - portid_t port_id; - cmdline_fixed_string_t vf; - uint8_t vf_id; - struct rte_ether_addr address; - cmdline_fixed_string_t filter_type; - cmdline_fixed_string_t mode; -}; - -static void -cmd_set_vf_macvlan_parsed(void *parsed_result, - __rte_unused struct cmdline *cl, - __rte_unused void *data) -{ - int is_on, ret = 0; - struct cmd_set_vf_macvlan_filter *res = parsed_result; - struct rte_eth_mac_filter filter; - - memset(&filter, 0, sizeof(struct rte_eth_mac_filter)); - - rte_memcpy(&filter.mac_addr, &res->address, RTE_ETHER_ADDR_LEN); - - /* set VF MAC filter */ - filter.is_vf = 1; - - /* set VF ID */ - filter.dst_id = res->vf_id; - - if (!strcmp(res->filter_type, "exact-mac")) - filter.filter_type = RTE_MAC_PERFECT_MATCH; - else if (!strcmp(res->filter_type, "exact-mac-vlan")) - filter.filter_type = RTE_MACVLAN_PERFECT_MATCH; - else if (!strcmp(res->filter_type, "hashmac")) - filter.filter_type = RTE_MAC_HASH_MATCH; - else if (!strcmp(res->filter_type, "hashmac-vlan")) - filter.filter_type = RTE_MACVLAN_HASH_MATCH; - - is_on = (strcmp(res->mode, "on") == 0) ? 1 : 0; - - if (is_on) - ret = rte_eth_dev_filter_ctrl(res->port_id, - RTE_ETH_FILTER_MACVLAN, - RTE_ETH_FILTER_ADD, - &filter); - else - ret = rte_eth_dev_filter_ctrl(res->port_id, - RTE_ETH_FILTER_MACVLAN, - RTE_ETH_FILTER_DELETE, - &filter); - - if (ret < 0) - printf("bad set MAC hash parameter, return code = %d\n", ret); - -} - -cmdline_parse_token_string_t cmd_set_vf_macvlan_set = - TOKEN_STRING_INITIALIZER(struct cmd_set_vf_macvlan_filter, - set, "set"); -cmdline_parse_token_string_t cmd_set_vf_macvlan_port = - TOKEN_STRING_INITIALIZER(struct cmd_set_vf_macvlan_filter, - port, "port"); -cmdline_parse_token_num_t cmd_set_vf_macvlan_portid = - TOKEN_NUM_INITIALIZER(struct cmd_set_vf_macvlan_filter, - port_id, UINT16); -cmdline_parse_token_string_t cmd_set_vf_macvlan_vf = - TOKEN_STRING_INITIALIZER(struct cmd_set_vf_macvlan_filter, - vf, "vf"); -cmdline_parse_token_num_t cmd_set_vf_macvlan_vf_id = - TOKEN_NUM_INITIALIZER(struct cmd_set_vf_macvlan_filter, - vf_id, UINT8); -cmdline_parse_token_etheraddr_t cmd_set_vf_macvlan_mac = - TOKEN_ETHERADDR_INITIALIZER(struct cmd_set_vf_macvlan_filter, - address); -cmdline_parse_token_string_t cmd_set_vf_macvlan_filter_type = - TOKEN_STRING_INITIALIZER(struct cmd_set_vf_macvlan_filter, - filter_type, "exact-mac#exact-mac-vlan" - "#hashmac#hashmac-vlan"); -cmdline_parse_token_string_t cmd_set_vf_macvlan_mode = - TOKEN_STRING_INITIALIZER(struct cmd_set_vf_macvlan_filter, - mode, "on#off"); - -cmdline_parse_inst_t cmd_set_vf_macvlan_filter = { - .f = cmd_set_vf_macvlan_parsed, - .data = NULL, - .help_str = "set port vf " - "exact-mac|exact-mac-vlan|hashmac|hashmac-vlan on|off: " - "Exact match rule: exact match of MAC or MAC and VLAN; " - "hash match rule: hash match of MAC and exact match of VLAN", - .tokens = { - (void *)&cmd_set_vf_macvlan_set, - (void *)&cmd_set_vf_macvlan_port, - (void *)&cmd_set_vf_macvlan_portid, - (void *)&cmd_set_vf_macvlan_vf, - (void *)&cmd_set_vf_macvlan_vf_id, - (void *)&cmd_set_vf_macvlan_mac, - (void *)&cmd_set_vf_macvlan_filter_type, - (void *)&cmd_set_vf_macvlan_mode, - NULL, - }, -}; - /* *** CONFIGURE VF TRAFFIC CONTROL *** */ struct cmd_set_vf_traffic { cmdline_fixed_string_t set; @@ -20041,7 +19932,6 @@ cmdline_parse_ctx_t main_ctx[] = { (cmdline_parse_inst_t *)&cmd_set_uc_hash_filter, (cmdline_parse_inst_t *)&cmd_set_uc_all_hash_filter, (cmdline_parse_inst_t *)&cmd_vf_mac_addr_filter, - (cmdline_parse_inst_t *)&cmd_set_vf_macvlan_filter, (cmdline_parse_inst_t *)&cmd_queue_rate_limit, (cmdline_parse_inst_t *)&cmd_tunnel_filter, (cmdline_parse_inst_t *)&cmd_tunnel_udp_config, diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst index ff39243f32..223ff7661f 100644 --- a/doc/guides/rel_notes/deprecation.rst +++ b/doc/guides/rel_notes/deprecation.rst @@ -108,7 +108,7 @@ Deprecation Notices * ethdev: the legacy filter API, including ``rte_eth_dev_filter_supported()``, ``rte_eth_dev_filter_ctrl()`` as well - as filter types MACVLAN, ETHERTYPE, FLEXIBLE, SYN, NTUPLE, TUNNEL, FDIR, + as filter types ETHERTYPE, FLEXIBLE, SYN, NTUPLE, TUNNEL, FDIR, HASH and L2_TUNNEL, is superseded by the generic flow API (rte_flow) in PMDs that implement the latter. The legacy API will be removed in DPDK 20.11. diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c index 4778aaf299..217a7bbbd8 100644 --- a/drivers/net/i40e/i40e_ethdev.c +++ b/drivers/net/i40e/i40e_ethdev.c @@ -4386,119 +4386,6 @@ i40e_macaddr_remove(struct rte_eth_dev *dev, uint32_t index) } } -/* Set perfect match or hash match of MAC and VLAN for a VF */ -static int -i40e_vf_mac_filter_set(struct i40e_pf *pf, - struct rte_eth_mac_filter *filter, - bool add) -{ - struct i40e_hw *hw; - struct i40e_mac_filter_info mac_filter; - struct rte_ether_addr old_mac; - struct rte_ether_addr *new_mac; - struct i40e_pf_vf *vf = NULL; - uint16_t vf_id; - int ret; - - if (pf == NULL) { - PMD_DRV_LOG(ERR, "Invalid PF argument."); - return -EINVAL; - } - hw = I40E_PF_TO_HW(pf); - - if (filter == NULL) { - PMD_DRV_LOG(ERR, "Invalid mac filter argument."); - return -EINVAL; - } - - new_mac = &filter->mac_addr; - - if (rte_is_zero_ether_addr(new_mac)) { - PMD_DRV_LOG(ERR, "Invalid ethernet address."); - return -EINVAL; - } - - vf_id = filter->dst_id; - - if (vf_id > pf->vf_num - 1 || !pf->vfs) { - PMD_DRV_LOG(ERR, "Invalid argument."); - return -EINVAL; - } - vf = &pf->vfs[vf_id]; - - if (add && rte_is_same_ether_addr(new_mac, &pf->dev_addr)) { - PMD_DRV_LOG(INFO, "Ignore adding permanent MAC address."); - return -EINVAL; - } - - if (add) { - rte_memcpy(&old_mac, hw->mac.addr, RTE_ETHER_ADDR_LEN); - rte_memcpy(hw->mac.addr, new_mac->addr_bytes, - RTE_ETHER_ADDR_LEN); - rte_memcpy(&mac_filter.mac_addr, &filter->mac_addr, - RTE_ETHER_ADDR_LEN); - - mac_filter.filter_type = filter->filter_type; - ret = i40e_vsi_add_mac(vf->vsi, &mac_filter); - if (ret != I40E_SUCCESS) { - PMD_DRV_LOG(ERR, "Failed to add MAC filter."); - return -1; - } - rte_ether_addr_copy(new_mac, &pf->dev_addr); - } else { - rte_memcpy(hw->mac.addr, hw->mac.perm_addr, - RTE_ETHER_ADDR_LEN); - ret = i40e_vsi_delete_mac(vf->vsi, &filter->mac_addr); - if (ret != I40E_SUCCESS) { - PMD_DRV_LOG(ERR, "Failed to delete MAC filter."); - return -1; - } - - /* Clear device address as it has been removed */ - if (rte_is_same_ether_addr(&pf->dev_addr, new_mac)) - memset(&pf->dev_addr, 0, sizeof(struct rte_ether_addr)); - } - - return 0; -} - -/* MAC filter handle */ -static int -i40e_mac_filter_handle(struct rte_eth_dev *dev, enum rte_filter_op filter_op, - void *arg) -{ - struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private); - struct rte_eth_mac_filter *filter; - struct i40e_hw *hw = I40E_PF_TO_HW(pf); - int ret = I40E_NOT_SUPPORTED; - - filter = (struct rte_eth_mac_filter *)(arg); - - switch (filter_op) { - case RTE_ETH_FILTER_NOP: - ret = I40E_SUCCESS; - break; - case RTE_ETH_FILTER_ADD: - i40e_pf_disable_irq0(hw); - if (filter->is_vf) - ret = i40e_vf_mac_filter_set(pf, filter, 1); - i40e_pf_enable_irq0(hw); - break; - case RTE_ETH_FILTER_DELETE: - i40e_pf_disable_irq0(hw); - if (filter->is_vf) - ret = i40e_vf_mac_filter_set(pf, filter, 0); - i40e_pf_enable_irq0(hw); - break; - default: - PMD_DRV_LOG(ERR, "unknown operation %u", filter_op); - ret = I40E_ERR_PARAM; - break; - } - - return ret; -} - static int i40e_get_rss_lut(struct i40e_vsi *vsi, uint8_t *lut, uint16_t lut_size) { @@ -10620,9 +10507,6 @@ i40e_dev_filter_ctrl(struct rte_eth_dev *dev, case RTE_ETH_FILTER_HASH: ret = i40e_hash_filter_ctrl(dev, filter_op, arg); break; - case RTE_ETH_FILTER_MACVLAN: - ret = i40e_mac_filter_handle(dev, filter_op, arg); - break; case RTE_ETH_FILTER_ETHERTYPE: ret = i40e_ethertype_filter_handle(dev, filter_op, arg); break; diff --git a/drivers/net/qede/qede_filter.c b/drivers/net/qede/qede_filter.c index 86a2e0dc9a..2e1646fe89 100644 --- a/drivers/net/qede/qede_filter.c +++ b/drivers/net/qede/qede_filter.c @@ -1561,7 +1561,6 @@ int qede_dev_filter_ctrl(struct rte_eth_dev *eth_dev, *(const void **)arg = &qede_flow_ops; return 0; - case RTE_ETH_FILTER_MACVLAN: case RTE_ETH_FILTER_ETHERTYPE: case RTE_ETH_FILTER_FLEXIBLE: case RTE_ETH_FILTER_SYN: diff --git a/drivers/net/sfc/sfc_ethdev.c b/drivers/net/sfc/sfc_ethdev.c index c0672083ec..1abf05a80c 100644 --- a/drivers/net/sfc/sfc_ethdev.c +++ b/drivers/net/sfc/sfc_ethdev.c @@ -1748,9 +1748,6 @@ sfc_dev_filter_ctrl(struct rte_eth_dev *dev, enum rte_filter_type filter_type, case RTE_ETH_FILTER_NONE: sfc_err(sa, "Global filters configuration not supported"); break; - case RTE_ETH_FILTER_MACVLAN: - sfc_err(sa, "MACVLAN filters not supported"); - break; case RTE_ETH_FILTER_ETHERTYPE: sfc_err(sa, "EtherType filters not supported"); break; diff --git a/lib/librte_ethdev/rte_eth_ctrl.h b/lib/librte_ethdev/rte_eth_ctrl.h index 1416c371fb..bbb94eccce 100644 --- a/lib/librte_ethdev/rte_eth_ctrl.h +++ b/lib/librte_ethdev/rte_eth_ctrl.h @@ -27,7 +27,6 @@ extern "C" { */ enum rte_filter_type { RTE_ETH_FILTER_NONE = 0, - RTE_ETH_FILTER_MACVLAN, RTE_ETH_FILTER_ETHERTYPE, RTE_ETH_FILTER_FLEXIBLE, RTE_ETH_FILTER_SYN, @@ -68,16 +67,6 @@ enum rte_mac_filter_type { RTE_MACVLAN_HASH_MATCH, }; -/** - * MAC filter info - */ -struct rte_eth_mac_filter { - uint8_t is_vf; /**< 1 for VF, 0 for port dev */ - uint16_t dst_id; /**< VF ID, available when is_vf is 1*/ - enum rte_mac_filter_type filter_type; /**< MAC filter type */ - struct rte_ether_addr mac_addr; -}; - /** * Define all structures for Ethertype Filter type. */ From patchwork Sun Oct 18 14:08:59 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Rybchenko X-Patchwork-Id: 81258 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id B78A8A04B0; Sun, 18 Oct 2020 16:09:49 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 17EBDC88A; Sun, 18 Oct 2020 16:09:28 +0200 (CEST) Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [67.231.154.164]) by dpdk.org (Postfix) with ESMTP id A1A1AC86A for ; Sun, 18 Oct 2020 16:09:24 +0200 (CEST) Received: from mx1-us1.ppe-hosted.com (unknown [10.110.50.143]) by dispatch1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 1C5252009C; Sun, 18 Oct 2020 14:09:23 +0000 (UTC) Received: from us4-mdac16-20.at1.mdlocal (unknown [10.110.49.202]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 1A79F8009B; Sun, 18 Oct 2020 14:09:23 +0000 (UTC) X-Virus-Scanned: Proofpoint Essentials engine Received: from mx1-us1.ppe-hosted.com (unknown [10.110.50.12]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 9163740061; Sun, 18 Oct 2020 14:09:22 +0000 (UTC) Received: from webmail.solarflare.com (uk.solarflare.com [193.34.186.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 2A02F4005B; Sun, 18 Oct 2020 14:09:22 +0000 (UTC) Received: from ukex01.SolarFlarecom.com (10.17.10.4) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Sun, 18 Oct 2020 15:09:18 +0100 Received: from opal.uk.solarflarecom.com (10.17.10.1) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Sun, 18 Oct 2020 15:09:18 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (ukv-loginhost.uk.solarflarecom.com [10.17.10.39]) by opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id 09IE9IpZ002010; Sun, 18 Oct 2020 15:09:18 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1]) by ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id 1817E1613AB; Sun, 18 Oct 2020 15:09:18 +0100 (BST) From: Andrew Rybchenko To: Beilei Xing , Jeff Guo , "Thomas Monjalon" , Ferruh Yigit , Andrew Rybchenko CC: Date: Sun, 18 Oct 2020 15:08:59 +0100 Message-ID: <1603030152-13451-3-git-send-email-arybchenko@solarflare.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1603030152-13451-1-git-send-email-arybchenko@solarflare.com> References: <1603030152-13451-1-git-send-email-arybchenko@solarflare.com> MIME-Version: 1.0 X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.6.1012-25732.003 X-TM-AS-Result: No-2.123700-8.000000-10 X-TMASE-MatchedRID: KQ3ld5ivywa/kNGHVZrslklR2DE0NRda3FYvKmZiVnM7OtcKFS0EBNN+ VO8UR4MhfGzuoVn0Vs6PQi9XuOWoOPwfXc9ZWlYMR/j040fRFpL2155bpR+TIAv1OPvvDLzsXWj vA8TpWFhiDAh5k2kAw2WQifIHHZm6MNC3Xj2tG7LGL//8mlodAzefdE7h0G9U9JNRVzW5ZwmDuU 30s68UO+VjSh+visOe/GpF3Kp5Knu1DfGM6db7Xw97mDMXdNW3jHhXj1NLbjDLmsnRFz6pJpUmI 4+Q9tu2gEMeUbUICxqQ+iKT+7tgt+ztpCSqSkXKvoQkZKo949N7xIKEgZq/AS6Zl5fVYhDwrW41 +BBqq+9C0EtKHL9bQOIGJZ6+qv8rHxPMjOKY7A8LbigRnpKlKZvjAepGmdoOcQtAYghpDjopqH4 wo4cyUPFh+bYdm8r1W4Q0ASKjHrP1U83U3I3fGQ/7WFXrZDitfkWh2Sk5saTSyQY2YXQwMYtCJw ovoGdD5APDq2B3cAxn2JWP8qFf9FKehBzm9vnO5B2Qzud0EsI35c5BnKCu9g== X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10--2.123700-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.6.1012-25732.003 X-MDID: 1603030163-48RUizirtgli X-PPE-DISP: 1603030163;48RUizirtgli Subject: [dpdk-dev] [PATCH 02/14] ethdev: move MAC filter type to i40e driver X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" net/i40e driver is the only user of the enum rte_mac_filter_type. Move the define to the driver and use i40e_ prefix instead of rte_. Signed-off-by: Andrew Rybchenko --- drivers/net/i40e/i40e_ethdev.c | 58 ++++++++++++++++---------------- drivers/net/i40e/i40e_ethdev.h | 15 +++++++-- drivers/net/i40e/i40e_pf.c | 2 +- drivers/net/i40e/rte_pmd_i40e.c | 30 ++++++++--------- lib/librte_ethdev/rte_eth_ctrl.h | 11 ------ 5 files changed, 58 insertions(+), 58 deletions(-) diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c index 217a7bbbd8..e298d7aee6 100644 --- a/drivers/net/i40e/i40e_ethdev.c +++ b/drivers/net/i40e/i40e_ethdev.c @@ -4329,9 +4329,9 @@ i40e_macaddr_add(struct rte_eth_dev *dev, rte_memcpy(&mac_filter.mac_addr, mac_addr, RTE_ETHER_ADDR_LEN); if (rxmode->offloads & DEV_RX_OFFLOAD_VLAN_FILTER) - mac_filter.filter_type = RTE_MACVLAN_PERFECT_MATCH; + mac_filter.filter_type = I40E_MACVLAN_PERFECT_MATCH; else - mac_filter.filter_type = RTE_MAC_PERFECT_MATCH; + mac_filter.filter_type = I40E_MAC_PERFECT_MATCH; if (pool == 0) vsi = pf->main_vsi; @@ -5537,7 +5537,7 @@ i40e_update_default_filter_setting(struct i40e_vsi *vsi) mac = &f->mac_info.mac_addr; rte_memcpy(&mac->addr_bytes, hw->mac.perm_addr, ETH_ADDR_LEN); - f->mac_info.filter_type = RTE_MACVLAN_PERFECT_MATCH; + f->mac_info.filter_type = I40E_MACVLAN_PERFECT_MATCH; TAILQ_INSERT_TAIL(&vsi->mac_list, f, next); vsi->mac_num++; @@ -5545,7 +5545,7 @@ i40e_update_default_filter_setting(struct i40e_vsi *vsi) } rte_memcpy(&filter.mac_addr, (struct rte_ether_addr *)(hw->mac.perm_addr), ETH_ADDR_LEN); - filter.filter_type = RTE_MACVLAN_PERFECT_MATCH; + filter.filter_type = I40E_MACVLAN_PERFECT_MATCH; return i40e_vsi_add_mac(vsi, &filter); } @@ -6011,7 +6011,7 @@ i40e_vsi_setup(struct i40e_pf *pf, /* MAC/VLAN configuration */ rte_memcpy(&filter.mac_addr, &broadcast, RTE_ETHER_ADDR_LEN); - filter.filter_type = RTE_MACVLAN_PERFECT_MATCH; + filter.filter_type = I40E_MACVLAN_PERFECT_MATCH; ret = i40e_vsi_add_mac(vsi, &filter); if (ret != I40E_SUCCESS) { @@ -6039,15 +6039,15 @@ i40e_vsi_config_vlan_filter(struct i40e_vsi *vsi, bool on) struct i40e_mac_filter *f; void *temp; struct i40e_mac_filter_info *mac_filter; - enum rte_mac_filter_type desired_filter; + enum i40e_mac_filter_type desired_filter; int ret = I40E_SUCCESS; if (on) { /* Filter to match MAC and VLAN */ - desired_filter = RTE_MACVLAN_PERFECT_MATCH; + desired_filter = I40E_MACVLAN_PERFECT_MATCH; } else { /* Filter to match only MAC */ - desired_filter = RTE_MAC_PERFECT_MATCH; + desired_filter = I40E_MAC_PERFECT_MATCH; } num = vsi->mac_num; @@ -6990,18 +6990,18 @@ i40e_add_macvlan_filters(struct i40e_vsi *vsi, rte_cpu_to_le_16(filter[num + i].vlan_id); switch (filter[num + i].filter_type) { - case RTE_MAC_PERFECT_MATCH: + case I40E_MAC_PERFECT_MATCH: flags = I40E_AQC_MACVLAN_ADD_PERFECT_MATCH | I40E_AQC_MACVLAN_ADD_IGNORE_VLAN; break; - case RTE_MACVLAN_PERFECT_MATCH: + case I40E_MACVLAN_PERFECT_MATCH: flags = I40E_AQC_MACVLAN_ADD_PERFECT_MATCH; break; - case RTE_MAC_HASH_MATCH: + case I40E_MAC_HASH_MATCH: flags = I40E_AQC_MACVLAN_ADD_HASH_MATCH | I40E_AQC_MACVLAN_ADD_IGNORE_VLAN; break; - case RTE_MACVLAN_HASH_MATCH: + case I40E_MACVLAN_HASH_MATCH: flags = I40E_AQC_MACVLAN_ADD_HASH_MATCH; break; default: @@ -7065,18 +7065,18 @@ i40e_remove_macvlan_filters(struct i40e_vsi *vsi, rte_cpu_to_le_16(filter[num + i].vlan_id); switch (filter[num + i].filter_type) { - case RTE_MAC_PERFECT_MATCH: + case I40E_MAC_PERFECT_MATCH: flags = I40E_AQC_MACVLAN_DEL_PERFECT_MATCH | I40E_AQC_MACVLAN_DEL_IGNORE_VLAN; break; - case RTE_MACVLAN_PERFECT_MATCH: + case I40E_MACVLAN_PERFECT_MATCH: flags = I40E_AQC_MACVLAN_DEL_PERFECT_MATCH; break; - case RTE_MAC_HASH_MATCH: + case I40E_MAC_HASH_MATCH: flags = I40E_AQC_MACVLAN_DEL_HASH_MATCH | I40E_AQC_MACVLAN_DEL_IGNORE_VLAN; break; - case RTE_MACVLAN_HASH_MATCH: + case I40E_MACVLAN_HASH_MATCH: flags = I40E_AQC_MACVLAN_DEL_HASH_MATCH; break; default: @@ -7421,8 +7421,8 @@ i40e_vsi_add_mac(struct i40e_vsi *vsi, struct i40e_mac_filter_info *mac_filter) f = i40e_find_mac_filter(vsi, &mac_filter->mac_addr); if (f != NULL) return I40E_SUCCESS; - if ((mac_filter->filter_type == RTE_MACVLAN_PERFECT_MATCH) || - (mac_filter->filter_type == RTE_MACVLAN_HASH_MATCH)) { + if (mac_filter->filter_type == I40E_MACVLAN_PERFECT_MATCH || + mac_filter->filter_type == I40E_MACVLAN_HASH_MATCH) { /** * If vlan_num is 0, that's the first time to add mac, @@ -7433,8 +7433,8 @@ i40e_vsi_add_mac(struct i40e_vsi *vsi, struct i40e_mac_filter_info *mac_filter) vsi->vlan_num = 1; } vlan_num = vsi->vlan_num; - } else if ((mac_filter->filter_type == RTE_MAC_PERFECT_MATCH) || - (mac_filter->filter_type == RTE_MAC_HASH_MATCH)) + } else if (mac_filter->filter_type == I40E_MAC_PERFECT_MATCH || + mac_filter->filter_type == I40E_MAC_HASH_MATCH) vlan_num = 1; mv_f = rte_zmalloc("macvlan_data", vlan_num * sizeof(*mv_f), 0); @@ -7449,8 +7449,8 @@ i40e_vsi_add_mac(struct i40e_vsi *vsi, struct i40e_mac_filter_info *mac_filter) ETH_ADDR_LEN); } - if (mac_filter->filter_type == RTE_MACVLAN_PERFECT_MATCH || - mac_filter->filter_type == RTE_MACVLAN_HASH_MATCH) { + if (mac_filter->filter_type == I40E_MACVLAN_PERFECT_MATCH || + mac_filter->filter_type == I40E_MACVLAN_HASH_MATCH) { ret = i40e_find_all_vlan_for_mac(vsi, mv_f, vlan_num, &mac_filter->mac_addr); if (ret != I40E_SUCCESS) @@ -7487,7 +7487,7 @@ i40e_vsi_delete_mac(struct i40e_vsi *vsi, struct rte_ether_addr *addr) struct i40e_mac_filter *f; struct i40e_macvlan_filter *mv_f; int i, vlan_num; - enum rte_mac_filter_type filter_type; + enum i40e_mac_filter_type filter_type; int ret = I40E_SUCCESS; /* Can't find it, return an error */ @@ -7497,14 +7497,14 @@ i40e_vsi_delete_mac(struct i40e_vsi *vsi, struct rte_ether_addr *addr) vlan_num = vsi->vlan_num; filter_type = f->mac_info.filter_type; - if (filter_type == RTE_MACVLAN_PERFECT_MATCH || - filter_type == RTE_MACVLAN_HASH_MATCH) { + if (filter_type == I40E_MACVLAN_PERFECT_MATCH || + filter_type == I40E_MACVLAN_HASH_MATCH) { if (vlan_num == 0) { PMD_DRV_LOG(ERR, "VLAN number shouldn't be 0"); return I40E_ERR_PARAM; } - } else if (filter_type == RTE_MAC_PERFECT_MATCH || - filter_type == RTE_MAC_HASH_MATCH) + } else if (filter_type == I40E_MAC_PERFECT_MATCH || + filter_type == I40E_MAC_HASH_MATCH) vlan_num = 1; mv_f = rte_zmalloc("macvlan_data", vlan_num * sizeof(*mv_f), 0); @@ -7518,8 +7518,8 @@ i40e_vsi_delete_mac(struct i40e_vsi *vsi, struct rte_ether_addr *addr) rte_memcpy(&mv_f[i].macaddr, &f->mac_info.mac_addr, ETH_ADDR_LEN); } - if (filter_type == RTE_MACVLAN_PERFECT_MATCH || - filter_type == RTE_MACVLAN_HASH_MATCH) { + if (filter_type == I40E_MACVLAN_PERFECT_MATCH || + filter_type == I40E_MACVLAN_HASH_MATCH) { ret = i40e_find_all_vlan_for_mac(vsi, mv_f, vlan_num, addr); if (ret != I40E_SUCCESS) goto DONE; diff --git a/drivers/net/i40e/i40e_ethdev.h b/drivers/net/i40e/i40e_ethdev.h index 1466998aa1..458219c784 100644 --- a/drivers/net/i40e/i40e_ethdev.h +++ b/drivers/net/i40e/i40e_ethdev.h @@ -288,11 +288,22 @@ struct rte_flow { struct i40e_adapter; struct rte_pci_driver; +/** + * MAC filter type + */ +enum i40e_mac_filter_type { + I40E_MAC_PERFECT_MATCH = 1, /**< exact match of MAC addr. */ + I40E_MACVLAN_PERFECT_MATCH, /**< exact match of MAC addr and VLAN ID. */ + I40E_MAC_HASH_MATCH, /**< hash match of MAC addr. */ + /** hash match of MAC addr and exact match of VLAN ID. */ + I40E_MACVLAN_HASH_MATCH, +}; + /** * MAC filter structure */ struct i40e_mac_filter_info { - enum rte_mac_filter_type filter_type; + enum i40e_mac_filter_type filter_type; struct rte_ether_addr mac_addr; }; @@ -347,7 +358,7 @@ struct i40e_veb { /* i40e MACVLAN filter structure */ struct i40e_macvlan_filter { struct rte_ether_addr macaddr; - enum rte_mac_filter_type filter_type; + enum i40e_mac_filter_type filter_type; uint16_t vlan_id; }; diff --git a/drivers/net/i40e/i40e_pf.c b/drivers/net/i40e/i40e_pf.c index 03c2070c3f..65d649b627 100644 --- a/drivers/net/i40e/i40e_pf.c +++ b/drivers/net/i40e/i40e_pf.c @@ -844,7 +844,7 @@ i40e_pf_host_process_cmd_add_ether_address(struct i40e_pf_vf *vf, for (i = 0; i < addr_list->num_elements; i++) { mac = (struct rte_ether_addr *)(addr_list->list[i].addr); rte_memcpy(&filter.mac_addr, mac, RTE_ETHER_ADDR_LEN); - filter.filter_type = RTE_MACVLAN_PERFECT_MATCH; + filter.filter_type = I40E_MACVLAN_PERFECT_MATCH; if (rte_is_zero_ether_addr(mac) || i40e_vsi_add_mac(vf->vsi, &filter)) { ret = I40E_ERR_INVALID_MAC_ADDR; diff --git a/drivers/net/i40e/rte_pmd_i40e.c b/drivers/net/i40e/rte_pmd_i40e.c index 17938e7d30..790d042002 100644 --- a/drivers/net/i40e/rte_pmd_i40e.c +++ b/drivers/net/i40e/rte_pmd_i40e.c @@ -211,7 +211,7 @@ i40e_vsi_rm_mac_filter(struct i40e_vsi *vsi) struct i40e_mac_filter *f; struct i40e_macvlan_filter *mv_f; int i, vlan_num; - enum rte_mac_filter_type filter_type; + enum i40e_mac_filter_type filter_type; int ret = I40E_SUCCESS; void *temp; @@ -219,14 +219,14 @@ i40e_vsi_rm_mac_filter(struct i40e_vsi *vsi) TAILQ_FOREACH_SAFE(f, &vsi->mac_list, next, temp) { vlan_num = vsi->vlan_num; filter_type = f->mac_info.filter_type; - if (filter_type == RTE_MACVLAN_PERFECT_MATCH || - filter_type == RTE_MACVLAN_HASH_MATCH) { + if (filter_type == I40E_MACVLAN_PERFECT_MATCH || + filter_type == I40E_MACVLAN_HASH_MATCH) { if (vlan_num == 0) { PMD_DRV_LOG(ERR, "VLAN number shouldn't be 0"); return I40E_ERR_PARAM; } - } else if (filter_type == RTE_MAC_PERFECT_MATCH || - filter_type == RTE_MAC_HASH_MATCH) + } else if (filter_type == I40E_MAC_PERFECT_MATCH || + filter_type == I40E_MAC_HASH_MATCH) vlan_num = 1; mv_f = rte_zmalloc("macvlan_data", vlan_num * sizeof(*mv_f), 0); @@ -241,8 +241,8 @@ i40e_vsi_rm_mac_filter(struct i40e_vsi *vsi) &f->mac_info.mac_addr, ETH_ADDR_LEN); } - if (filter_type == RTE_MACVLAN_PERFECT_MATCH || - filter_type == RTE_MACVLAN_HASH_MATCH) { + if (filter_type == I40E_MACVLAN_PERFECT_MATCH || + filter_type == I40E_MACVLAN_HASH_MATCH) { ret = i40e_find_all_vlan_for_mac(vsi, mv_f, vlan_num, &f->mac_info.mac_addr); if (ret != I40E_SUCCESS) { @@ -275,8 +275,8 @@ i40e_vsi_restore_mac_filter(struct i40e_vsi *vsi) /* restore all the MACs */ TAILQ_FOREACH_SAFE(f, &vsi->mac_list, next, temp) { - if ((f->mac_info.filter_type == RTE_MACVLAN_PERFECT_MATCH) || - (f->mac_info.filter_type == RTE_MACVLAN_HASH_MATCH)) { + if (f->mac_info.filter_type == I40E_MACVLAN_PERFECT_MATCH || + f->mac_info.filter_type == I40E_MACVLAN_HASH_MATCH) { /** * If vlan_num is 0, that's the first time to add mac, * set mask for vlan_id 0. @@ -286,8 +286,8 @@ i40e_vsi_restore_mac_filter(struct i40e_vsi *vsi) vsi->vlan_num = 1; } vlan_num = vsi->vlan_num; - } else if ((f->mac_info.filter_type == RTE_MAC_PERFECT_MATCH) || - (f->mac_info.filter_type == RTE_MAC_HASH_MATCH)) + } else if (f->mac_info.filter_type == I40E_MAC_PERFECT_MATCH || + f->mac_info.filter_type == I40E_MAC_HASH_MATCH) vlan_num = 1; mv_f = rte_zmalloc("macvlan_data", vlan_num * sizeof(*mv_f), 0); @@ -303,8 +303,8 @@ i40e_vsi_restore_mac_filter(struct i40e_vsi *vsi) ETH_ADDR_LEN); } - if (f->mac_info.filter_type == RTE_MACVLAN_PERFECT_MATCH || - f->mac_info.filter_type == RTE_MACVLAN_HASH_MATCH) { + if (f->mac_info.filter_type == I40E_MACVLAN_PERFECT_MATCH || + f->mac_info.filter_type == I40E_MACVLAN_HASH_MATCH) { ret = i40e_find_all_vlan_for_mac(vsi, mv_f, vlan_num, &f->mac_info.mac_addr); if (ret != I40E_SUCCESS) { @@ -768,7 +768,7 @@ int rte_pmd_i40e_set_vf_broadcast(uint16_t port, uint16_t vf_id, if (on) { rte_memcpy(&filter.mac_addr, &broadcast, RTE_ETHER_ADDR_LEN); - filter.filter_type = RTE_MACVLAN_PERFECT_MATCH; + filter.filter_type = I40E_MACVLAN_PERFECT_MATCH; ret = i40e_vsi_add_mac(vsi, &filter); } else { ret = i40e_vsi_delete_mac(vsi, &broadcast); @@ -2388,7 +2388,7 @@ rte_pmd_i40e_add_vf_mac_addr(uint16_t port, uint16_t vf_id, return -EINVAL; } - mac_filter.filter_type = RTE_MACVLAN_PERFECT_MATCH; + mac_filter.filter_type = I40E_MACVLAN_PERFECT_MATCH; rte_ether_addr_copy(mac_addr, &mac_filter.mac_addr); ret = i40e_vsi_add_mac(vsi, &mac_filter); if (ret != I40E_SUCCESS) { diff --git a/lib/librte_ethdev/rte_eth_ctrl.h b/lib/librte_ethdev/rte_eth_ctrl.h index bbb94eccce..a3d49e0913 100644 --- a/lib/librte_ethdev/rte_eth_ctrl.h +++ b/lib/librte_ethdev/rte_eth_ctrl.h @@ -56,17 +56,6 @@ enum rte_filter_op { RTE_ETH_FILTER_OP_MAX }; -/** - * MAC filter type - */ -enum rte_mac_filter_type { - RTE_MAC_PERFECT_MATCH = 1, /**< exact match of MAC addr. */ - RTE_MACVLAN_PERFECT_MATCH, /**< exact match of MAC addr and VLAN ID. */ - RTE_MAC_HASH_MATCH, /**< hash match of MAC addr. */ - /** hash match of MAC addr and exact match of VLAN ID. */ - RTE_MACVLAN_HASH_MATCH, -}; - /** * Define all structures for Ethertype Filter type. */ From patchwork Sun Oct 18 14:09:00 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Rybchenko X-Patchwork-Id: 81261 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id E2C65A04B0; Sun, 18 Oct 2020 16:10:59 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 38B3AD03D; Sun, 18 Oct 2020 16:09:34 +0200 (CEST) Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [67.231.154.164]) by dpdk.org (Postfix) with ESMTP id 60A18C87E for ; Sun, 18 Oct 2020 16:09:26 +0200 (CEST) Received: from mx1-us1.ppe-hosted.com (unknown [10.110.50.150]) by dispatch1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id ED3DF20082; Sun, 18 Oct 2020 14:09:24 +0000 (UTC) Received: from us4-mdac16-49.at1.mdlocal (unknown [10.110.50.132]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id EAE7F800A3; Sun, 18 Oct 2020 14:09:24 +0000 (UTC) X-Virus-Scanned: Proofpoint Essentials engine Received: from mx1-us1.ppe-hosted.com (unknown [10.110.50.12]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 3CCE9100052; Sun, 18 Oct 2020 14:09:24 +0000 (UTC) Received: from webmail.solarflare.com (uk.solarflare.com [193.34.186.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id F32674005B; Sun, 18 Oct 2020 14:09:23 +0000 (UTC) Received: from ukex01.SolarFlarecom.com (10.17.10.4) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Sun, 18 Oct 2020 15:09:19 +0100 Received: from opal.uk.solarflarecom.com (10.17.10.1) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Sun, 18 Oct 2020 15:09:18 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (ukv-loginhost.uk.solarflarecom.com [10.17.10.39]) by opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id 09IE9IEJ002021; Sun, 18 Oct 2020 15:09:18 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1]) by ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id B3FDE1613A9; Sun, 18 Oct 2020 15:09:18 +0100 (BST) From: Andrew Rybchenko To: Wenzhuo Lu , Beilei Xing , Bernard Iremonger , Ray Kinsella , Neil Horman , Ajit Khaparde , Somnath Kotur , Jeff Guo , Haiyue Wang , "Ziyang Xuan" , Xiaoyun Wang , Guoyang Zhou , Rasesh Mody , Shahed Shaikh , Andrew Rybchenko , Thomas Monjalon , Ferruh Yigit CC: Date: Sun, 18 Oct 2020 15:09:00 +0100 Message-ID: <1603030152-13451-4-git-send-email-arybchenko@solarflare.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1603030152-13451-1-git-send-email-arybchenko@solarflare.com> References: <1603030152-13451-1-git-send-email-arybchenko@solarflare.com> MIME-Version: 1.0 X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.6.1012-25732.003 X-TM-AS-Result: No-16.881100-8.000000-10 X-TMASE-MatchedRID: CrpnShPcGhH0gpEqM7fvYXv15w39S8ARY/L2/AZJAWSYkF7ZtFfCU4wW IRmLVWq5NNN0dk/lb45w5T4Iaj538mJZXQNDzktSGjzBgnFZvQ41X1Ls767cpizk1ksq4f2vuFy qcZKS0BDbCWkB73sdyNe41BRX2H3a8VYQPfofUdrYNujk7h3xKSEF1RdqrHVdAv57j5eT9BbE2/ /5aPgu0cwoZ4h95QFeYztnCSVlW1soxElBqT5s9pdn0VaVcqOkovA/6ONsv0ogRW6taEdAZrnyO 1e9qRiz2X8SJUbaZuNomViyNzIIqef7tGBB4aDuRow8EUpfIBQ/Dyy30snbbx1e3LLOsg63MFdd v+pLbrebGphGYyvIEjpiWTZKW5KgId18tSp0CEQdjoPUYuBywOqhuTPUDQDtaHvr9sOkYSuDuU3 0s68UO7LFzVWms74C5dtnO7xeDZuzcEvRT7uU5xYZoKAPfQ6CquFC73XPA2e6pZ/o2Hu2YVLiA4 WBV3WfUfOcEH1bmoH1PPnHhQe8tsMlA9qlu+4CIAjxomarSPB0ZH0LS0ioj753x71IIIESOWjcB JBnam1GTKG9z8yA7ZIAsfvd5LdF3drJ6tQCW56hLSC6hXpJl8oioCrSMgeKqPGqHIPGZiO4nrgI M5K3vff+4kabl0OBqUf8NJRfg8KhdhOr/xScIXTnOygHVQpOMBFRtdEz6qHc/xG0ZnouuUFzseL D8cAM4vM1YF6AJbbCCfuIMF6xLbxAi7jPoeEQftwZ3X11IV0= X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10--16.881100-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.6.1012-25732.003 X-MDID: 1603030164-fZ_3IFOfPnxa X-PPE-DISP: 1603030164;fZ_3IFOfPnxa Subject: [dpdk-dev] [PATCH 03/14] ethdev: remove legacy EtherType filter type support X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" RTE flow API should be used for filtering. Move corresponding definitions to ethdev internal driver API since it is used by drivers internally. Preserve RTE_ETH_FILTER_ETHERTYPE because of it as well. Signed-off-by: Andrew Rybchenko Acked-by: Ajit Khaparde Acked-by: Haiyue Wang --- app/test-pmd/cmdline.c | 115 ------------------- doc/guides/rel_notes/deprecation.rst | 2 +- drivers/net/bnxt/bnxt_ethdev.c | 157 -------------------------- drivers/net/e1000/igb_ethdev.c | 85 -------------- drivers/net/hinic/hinic_pmd_ethdev.h | 1 + drivers/net/i40e/i40e_ethdev.c | 45 -------- drivers/net/ixgbe/ixgbe_ethdev.c | 85 -------------- drivers/net/qede/qede_filter.c | 1 - drivers/net/sfc/sfc_ethdev.c | 3 - lib/librte_ethdev/rte_eth_ctrl.h | 19 ---- lib/librte_ethdev/rte_ethdev_driver.h | 23 ++++ 11 files changed, 25 insertions(+), 511 deletions(-) diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c index bb0be8cf42..f0fe97fb9c 100644 --- a/app/test-pmd/cmdline.c +++ b/app/test-pmd/cmdline.c @@ -976,11 +976,6 @@ static void cmd_help_long_parsed(void *parsed_result, "filters:\n" "--------\n\n" - "ethertype_filter (port_id) (add|del)" - " (mac_addr|mac_ignr) (mac_address) ethertype" - " (ether_type) (drop|fwd) queue (queue_id)\n" - " Add/Del an ethertype filter.\n\n" - "2tuple_filter (port_id) (add|del)" " dst_port (dst_port_value) protocol (protocol_value)" " mask (mask_value) tcp_flags (tcp_flags_value)" @@ -11069,115 +11064,6 @@ cmdline_parse_inst_t cmd_flex_filter = { /* *** Filters Control *** */ -/* *** deal with ethertype filter *** */ -struct cmd_ethertype_filter_result { - cmdline_fixed_string_t filter; - portid_t port_id; - cmdline_fixed_string_t ops; - cmdline_fixed_string_t mac; - struct rte_ether_addr mac_addr; - cmdline_fixed_string_t ethertype; - uint16_t ethertype_value; - cmdline_fixed_string_t drop; - cmdline_fixed_string_t queue; - uint16_t queue_id; -}; - -cmdline_parse_token_string_t cmd_ethertype_filter_filter = - TOKEN_STRING_INITIALIZER(struct cmd_ethertype_filter_result, - filter, "ethertype_filter"); -cmdline_parse_token_num_t cmd_ethertype_filter_port_id = - TOKEN_NUM_INITIALIZER(struct cmd_ethertype_filter_result, - port_id, UINT16); -cmdline_parse_token_string_t cmd_ethertype_filter_ops = - TOKEN_STRING_INITIALIZER(struct cmd_ethertype_filter_result, - ops, "add#del"); -cmdline_parse_token_string_t cmd_ethertype_filter_mac = - TOKEN_STRING_INITIALIZER(struct cmd_ethertype_filter_result, - mac, "mac_addr#mac_ignr"); -cmdline_parse_token_etheraddr_t cmd_ethertype_filter_mac_addr = - TOKEN_ETHERADDR_INITIALIZER(struct cmd_ethertype_filter_result, - mac_addr); -cmdline_parse_token_string_t cmd_ethertype_filter_ethertype = - TOKEN_STRING_INITIALIZER(struct cmd_ethertype_filter_result, - ethertype, "ethertype"); -cmdline_parse_token_num_t cmd_ethertype_filter_ethertype_value = - TOKEN_NUM_INITIALIZER(struct cmd_ethertype_filter_result, - ethertype_value, UINT16); -cmdline_parse_token_string_t cmd_ethertype_filter_drop = - TOKEN_STRING_INITIALIZER(struct cmd_ethertype_filter_result, - drop, "drop#fwd"); -cmdline_parse_token_string_t cmd_ethertype_filter_queue = - TOKEN_STRING_INITIALIZER(struct cmd_ethertype_filter_result, - queue, "queue"); -cmdline_parse_token_num_t cmd_ethertype_filter_queue_id = - TOKEN_NUM_INITIALIZER(struct cmd_ethertype_filter_result, - queue_id, UINT16); - -static void -cmd_ethertype_filter_parsed(void *parsed_result, - __rte_unused struct cmdline *cl, - __rte_unused void *data) -{ - struct cmd_ethertype_filter_result *res = parsed_result; - struct rte_eth_ethertype_filter filter; - int ret = 0; - - ret = rte_eth_dev_filter_supported(res->port_id, - RTE_ETH_FILTER_ETHERTYPE); - if (ret < 0) { - printf("ethertype filter is not supported on port %u.\n", - res->port_id); - return; - } - - memset(&filter, 0, sizeof(filter)); - if (!strcmp(res->mac, "mac_addr")) { - filter.flags |= RTE_ETHTYPE_FLAGS_MAC; - rte_memcpy(&filter.mac_addr, &res->mac_addr, - sizeof(struct rte_ether_addr)); - } - if (!strcmp(res->drop, "drop")) - filter.flags |= RTE_ETHTYPE_FLAGS_DROP; - filter.ether_type = res->ethertype_value; - filter.queue = res->queue_id; - - if (!strcmp(res->ops, "add")) - ret = rte_eth_dev_filter_ctrl(res->port_id, - RTE_ETH_FILTER_ETHERTYPE, - RTE_ETH_FILTER_ADD, - &filter); - else - ret = rte_eth_dev_filter_ctrl(res->port_id, - RTE_ETH_FILTER_ETHERTYPE, - RTE_ETH_FILTER_DELETE, - &filter); - if (ret < 0) - printf("ethertype filter programming error: (%s)\n", - strerror(-ret)); -} - -cmdline_parse_inst_t cmd_ethertype_filter = { - .f = cmd_ethertype_filter_parsed, - .data = NULL, - .help_str = "ethertype_filter add|del mac_addr|mac_ignr " - " ethertype drop|fw queue : " - "Add or delete an ethertype filter entry", - .tokens = { - (void *)&cmd_ethertype_filter_filter, - (void *)&cmd_ethertype_filter_port_id, - (void *)&cmd_ethertype_filter_ops, - (void *)&cmd_ethertype_filter_mac, - (void *)&cmd_ethertype_filter_mac_addr, - (void *)&cmd_ethertype_filter_ethertype, - (void *)&cmd_ethertype_filter_ethertype_value, - (void *)&cmd_ethertype_filter_drop, - (void *)&cmd_ethertype_filter_queue, - (void *)&cmd_ethertype_filter_queue_id, - NULL, - }, -}; - /* *** deal with flow director filter *** */ struct cmd_flow_director_result { cmdline_fixed_string_t flow_director_filter; @@ -19944,7 +19830,6 @@ cmdline_parse_ctx_t main_ctx[] = { (cmdline_parse_inst_t *)&cmd_config_rss_hash_key, (cmdline_parse_inst_t *)&cmd_dump, (cmdline_parse_inst_t *)&cmd_dump_one, - (cmdline_parse_inst_t *)&cmd_ethertype_filter, (cmdline_parse_inst_t *)&cmd_syn_filter, (cmdline_parse_inst_t *)&cmd_2tuple_filter, (cmdline_parse_inst_t *)&cmd_5tuple_filter, diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst index 223ff7661f..f655fc06ac 100644 --- a/doc/guides/rel_notes/deprecation.rst +++ b/doc/guides/rel_notes/deprecation.rst @@ -108,7 +108,7 @@ Deprecation Notices * ethdev: the legacy filter API, including ``rte_eth_dev_filter_supported()``, ``rte_eth_dev_filter_ctrl()`` as well - as filter types ETHERTYPE, FLEXIBLE, SYN, NTUPLE, TUNNEL, FDIR, + as filter types FLEXIBLE, SYN, NTUPLE, TUNNEL, FDIR, HASH and L2_TUNNEL, is superseded by the generic flow API (rte_flow) in PMDs that implement the latter. The legacy API will be removed in DPDK 20.11. diff --git a/drivers/net/bnxt/bnxt_ethdev.c b/drivers/net/bnxt/bnxt_ethdev.c index 6c1236953a..12bc3288e5 100644 --- a/drivers/net/bnxt/bnxt_ethdev.c +++ b/drivers/net/bnxt/bnxt_ethdev.c @@ -2987,160 +2987,6 @@ bnxt_tx_descriptor_status_op(void *tx_queue, uint16_t offset) return RTE_ETH_TX_DESC_FULL; } -static struct bnxt_filter_info * -bnxt_match_and_validate_ether_filter(struct bnxt *bp, - struct rte_eth_ethertype_filter *efilter, - struct bnxt_vnic_info *vnic0, - struct bnxt_vnic_info *vnic, - int *ret) -{ - struct bnxt_filter_info *mfilter = NULL; - int match = 0; - *ret = 0; - - if (efilter->ether_type == RTE_ETHER_TYPE_IPV4 || - efilter->ether_type == RTE_ETHER_TYPE_IPV6) { - PMD_DRV_LOG(ERR, "invalid ether_type(0x%04x) in" - " ethertype filter.", efilter->ether_type); - *ret = -EINVAL; - goto exit; - } - if (efilter->queue >= bp->rx_nr_rings) { - PMD_DRV_LOG(ERR, "Invalid queue %d\n", efilter->queue); - *ret = -EINVAL; - goto exit; - } - - vnic0 = BNXT_GET_DEFAULT_VNIC(bp); - vnic = &bp->vnic_info[efilter->queue]; - if (vnic == NULL) { - PMD_DRV_LOG(ERR, "Invalid queue %d\n", efilter->queue); - *ret = -EINVAL; - goto exit; - } - - if (efilter->flags & RTE_ETHTYPE_FLAGS_DROP) { - STAILQ_FOREACH(mfilter, &vnic0->filter, next) { - if ((!memcmp(efilter->mac_addr.addr_bytes, - mfilter->l2_addr, RTE_ETHER_ADDR_LEN) && - mfilter->flags == - HWRM_CFA_NTUPLE_FILTER_ALLOC_INPUT_FLAGS_DROP && - mfilter->ethertype == efilter->ether_type)) { - match = 1; - break; - } - } - } else { - STAILQ_FOREACH(mfilter, &vnic->filter, next) - if ((!memcmp(efilter->mac_addr.addr_bytes, - mfilter->l2_addr, RTE_ETHER_ADDR_LEN) && - mfilter->ethertype == efilter->ether_type && - mfilter->flags == - HWRM_CFA_L2_FILTER_CFG_INPUT_FLAGS_PATH_RX)) { - match = 1; - break; - } - } - - if (match) - *ret = -EEXIST; - -exit: - return mfilter; -} - -static int -bnxt_ethertype_filter(struct rte_eth_dev *dev, - enum rte_filter_op filter_op, - void *arg) -{ - struct bnxt *bp = dev->data->dev_private; - struct rte_eth_ethertype_filter *efilter = - (struct rte_eth_ethertype_filter *)arg; - struct bnxt_filter_info *bfilter, *filter1; - struct bnxt_vnic_info *vnic, *vnic0; - int ret; - - if (filter_op == RTE_ETH_FILTER_NOP) - return 0; - - if (arg == NULL) { - PMD_DRV_LOG(ERR, "arg shouldn't be NULL for operation %u.", - filter_op); - return -EINVAL; - } - - vnic0 = BNXT_GET_DEFAULT_VNIC(bp); - vnic = &bp->vnic_info[efilter->queue]; - - switch (filter_op) { - case RTE_ETH_FILTER_ADD: - bnxt_match_and_validate_ether_filter(bp, efilter, - vnic0, vnic, &ret); - if (ret < 0) - return ret; - - bfilter = bnxt_get_unused_filter(bp); - if (bfilter == NULL) { - PMD_DRV_LOG(ERR, - "Not enough resources for a new filter.\n"); - return -ENOMEM; - } - bfilter->filter_type = HWRM_CFA_NTUPLE_FILTER; - memcpy(bfilter->l2_addr, efilter->mac_addr.addr_bytes, - RTE_ETHER_ADDR_LEN); - memcpy(bfilter->dst_macaddr, efilter->mac_addr.addr_bytes, - RTE_ETHER_ADDR_LEN); - bfilter->enables |= NTUPLE_FLTR_ALLOC_INPUT_EN_DST_MACADDR; - bfilter->ethertype = efilter->ether_type; - bfilter->enables |= NTUPLE_FLTR_ALLOC_INPUT_EN_ETHERTYPE; - - filter1 = bnxt_get_l2_filter(bp, bfilter, vnic0); - if (filter1 == NULL) { - ret = -EINVAL; - goto cleanup; - } - bfilter->enables |= - HWRM_CFA_NTUPLE_FILTER_ALLOC_INPUT_ENABLES_L2_FILTER_ID; - bfilter->fw_l2_filter_id = filter1->fw_l2_filter_id; - - bfilter->dst_id = vnic->fw_vnic_id; - - if (efilter->flags & RTE_ETHTYPE_FLAGS_DROP) { - bfilter->flags = - HWRM_CFA_NTUPLE_FILTER_ALLOC_INPUT_FLAGS_DROP; - } - - ret = bnxt_hwrm_set_ntuple_filter(bp, bfilter->dst_id, bfilter); - if (ret) - goto cleanup; - STAILQ_INSERT_TAIL(&vnic->filter, bfilter, next); - break; - case RTE_ETH_FILTER_DELETE: - filter1 = bnxt_match_and_validate_ether_filter(bp, efilter, - vnic0, vnic, &ret); - if (ret == -EEXIST) { - ret = bnxt_hwrm_clear_ntuple_filter(bp, filter1); - - STAILQ_REMOVE(&vnic->filter, filter1, bnxt_filter_info, - next); - bnxt_free_filter(bp, filter1); - } else if (ret == 0) { - PMD_DRV_LOG(ERR, "No matching filter found\n"); - } - break; - default: - PMD_DRV_LOG(ERR, "unsupported operation %u.", filter_op); - ret = -EINVAL; - goto error; - } - return ret; -cleanup: - bnxt_free_filter(bp, bfilter); -error: - return ret; -} - static inline int parse_ntuple_filter(struct bnxt *bp, struct rte_eth_ntuple_filter *nfilter, @@ -3815,9 +3661,6 @@ bnxt_filter_ctrl_op(struct rte_eth_dev *dev, case RTE_ETH_FILTER_NTUPLE: ret = bnxt_ntuple_filter(dev, filter_op, arg); break; - case RTE_ETH_FILTER_ETHERTYPE: - ret = bnxt_ethertype_filter(dev, filter_op, arg); - break; case RTE_ETH_FILTER_GENERIC: if (filter_op != RTE_ETH_FILTER_GET) return -EINVAL; diff --git a/drivers/net/e1000/igb_ethdev.c b/drivers/net/e1000/igb_ethdev.c index ac4b8f1123..8b18f1cb28 100644 --- a/drivers/net/e1000/igb_ethdev.c +++ b/drivers/net/e1000/igb_ethdev.c @@ -209,11 +209,6 @@ static int igb_get_ntuple_filter(struct rte_eth_dev *dev, static int igb_ntuple_filter_handle(struct rte_eth_dev *dev, enum rte_filter_op filter_op, void *arg); -static int igb_ethertype_filter_handle(struct rte_eth_dev *dev, - enum rte_filter_op filter_op, - void *arg); -static int igb_get_ethertype_filter(struct rte_eth_dev *dev, - struct rte_eth_ethertype_filter *filter); static int eth_igb_filter_ctrl(struct rte_eth_dev *dev, enum rte_filter_type filter_type, enum rte_filter_op filter_op, @@ -4842,83 +4837,6 @@ igb_add_del_ethertype_filter(struct rte_eth_dev *dev, return 0; } -static int -igb_get_ethertype_filter(struct rte_eth_dev *dev, - struct rte_eth_ethertype_filter *filter) -{ - struct e1000_hw *hw = E1000_DEV_PRIVATE_TO_HW(dev->data->dev_private); - struct e1000_filter_info *filter_info = - E1000_DEV_PRIVATE_TO_FILTER_INFO(dev->data->dev_private); - uint32_t etqf; - int ret; - - ret = igb_ethertype_filter_lookup(filter_info, filter->ether_type); - if (ret < 0) { - PMD_DRV_LOG(ERR, "ethertype (0x%04x) filter doesn't exist.", - filter->ether_type); - return -ENOENT; - } - - etqf = E1000_READ_REG(hw, E1000_ETQF(ret)); - if (etqf & E1000_ETQF_FILTER_ENABLE) { - filter->ether_type = etqf & E1000_ETQF_ETHERTYPE; - filter->flags = 0; - filter->queue = (etqf & E1000_ETQF_QUEUE) >> - E1000_ETQF_QUEUE_SHIFT; - return 0; - } - - return -ENOENT; -} - -/* - * igb_ethertype_filter_handle - Handle operations for ethertype filter. - * @dev: pointer to rte_eth_dev structure - * @filter_op:operation will be taken. - * @arg: a pointer to specific structure corresponding to the filter_op - */ -static int -igb_ethertype_filter_handle(struct rte_eth_dev *dev, - enum rte_filter_op filter_op, - void *arg) -{ - struct e1000_hw *hw = E1000_DEV_PRIVATE_TO_HW(dev->data->dev_private); - int ret; - - MAC_TYPE_FILTER_SUP(hw->mac.type); - - if (filter_op == RTE_ETH_FILTER_NOP) - return 0; - - if (arg == NULL) { - PMD_DRV_LOG(ERR, "arg shouldn't be NULL for operation %u.", - filter_op); - return -EINVAL; - } - - switch (filter_op) { - case RTE_ETH_FILTER_ADD: - ret = igb_add_del_ethertype_filter(dev, - (struct rte_eth_ethertype_filter *)arg, - TRUE); - break; - case RTE_ETH_FILTER_DELETE: - ret = igb_add_del_ethertype_filter(dev, - (struct rte_eth_ethertype_filter *)arg, - FALSE); - break; - case RTE_ETH_FILTER_GET: - ret = igb_get_ethertype_filter(dev, - (struct rte_eth_ethertype_filter *)arg); - break; - default: - PMD_DRV_LOG(ERR, "unsupported operation %u.", filter_op); - ret = -EINVAL; - break; - } - return ret; -} - static int eth_igb_filter_ctrl(struct rte_eth_dev *dev, enum rte_filter_type filter_type, @@ -4931,9 +4849,6 @@ eth_igb_filter_ctrl(struct rte_eth_dev *dev, case RTE_ETH_FILTER_NTUPLE: ret = igb_ntuple_filter_handle(dev, filter_op, arg); break; - case RTE_ETH_FILTER_ETHERTYPE: - ret = igb_ethertype_filter_handle(dev, filter_op, arg); - break; case RTE_ETH_FILTER_SYN: ret = eth_igb_syn_filter_handle(dev, filter_op, arg); break; diff --git a/drivers/net/hinic/hinic_pmd_ethdev.h b/drivers/net/hinic/hinic_pmd_ethdev.h index 3f2d51d752..c7338d83be 100644 --- a/drivers/net/hinic/hinic_pmd_ethdev.h +++ b/drivers/net/hinic/hinic_pmd_ethdev.h @@ -7,6 +7,7 @@ #include #include +#include #include "base/hinic_compat.h" #include "base/hinic_pmd_cfg.h" diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c index e298d7aee6..aa87ad8dd5 100644 --- a/drivers/net/i40e/i40e_ethdev.c +++ b/drivers/net/i40e/i40e_ethdev.c @@ -319,9 +319,6 @@ static int i40e_dev_udp_tunnel_port_add(struct rte_eth_dev *dev, static int i40e_dev_udp_tunnel_port_del(struct rte_eth_dev *dev, struct rte_eth_udp_tunnel *udp_tunnel); static void i40e_filter_input_set_init(struct i40e_pf *pf); -static int i40e_ethertype_filter_handle(struct rte_eth_dev *dev, - enum rte_filter_op filter_op, - void *arg); static int i40e_dev_filter_ctrl(struct rte_eth_dev *dev, enum rte_filter_type filter_type, enum rte_filter_op filter_op, @@ -10449,45 +10446,6 @@ i40e_ethertype_filter_set(struct i40e_pf *pf, return ret; } -/* - * Handle operations for ethertype filter. - */ -static int -i40e_ethertype_filter_handle(struct rte_eth_dev *dev, - enum rte_filter_op filter_op, - void *arg) -{ - struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private); - int ret = 0; - - if (filter_op == RTE_ETH_FILTER_NOP) - return ret; - - if (arg == NULL) { - PMD_DRV_LOG(ERR, "arg shouldn't be NULL for operation %u", - filter_op); - return -EINVAL; - } - - switch (filter_op) { - case RTE_ETH_FILTER_ADD: - ret = i40e_ethertype_filter_set(pf, - (struct rte_eth_ethertype_filter *)arg, - TRUE); - break; - case RTE_ETH_FILTER_DELETE: - ret = i40e_ethertype_filter_set(pf, - (struct rte_eth_ethertype_filter *)arg, - FALSE); - break; - default: - PMD_DRV_LOG(ERR, "unsupported operation %u", filter_op); - ret = -ENOSYS; - break; - } - return ret; -} - static int i40e_dev_filter_ctrl(struct rte_eth_dev *dev, enum rte_filter_type filter_type, @@ -10507,9 +10465,6 @@ i40e_dev_filter_ctrl(struct rte_eth_dev *dev, case RTE_ETH_FILTER_HASH: ret = i40e_hash_filter_ctrl(dev, filter_op, arg); break; - case RTE_ETH_FILTER_ETHERTYPE: - ret = i40e_ethertype_filter_handle(dev, filter_op, arg); - break; case RTE_ETH_FILTER_TUNNEL: ret = i40e_tunnel_filter_handle(dev, filter_op, arg); break; diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c index 14a254ab74..28a088a71b 100644 --- a/drivers/net/ixgbe/ixgbe_ethdev.c +++ b/drivers/net/ixgbe/ixgbe_ethdev.c @@ -314,11 +314,6 @@ static int ixgbe_ntuple_filter_handle(struct rte_eth_dev *dev, void *arg); static int ixgbe_get_ntuple_filter(struct rte_eth_dev *dev, struct rte_eth_ntuple_filter *filter); -static int ixgbe_ethertype_filter_handle(struct rte_eth_dev *dev, - enum rte_filter_op filter_op, - void *arg); -static int ixgbe_get_ethertype_filter(struct rte_eth_dev *dev, - struct rte_eth_ethertype_filter *filter); static int ixgbe_dev_filter_ctrl(struct rte_eth_dev *dev, enum rte_filter_type filter_type, enum rte_filter_op filter_op, @@ -6967,83 +6962,6 @@ ixgbe_add_del_ethertype_filter(struct rte_eth_dev *dev, return 0; } -static int -ixgbe_get_ethertype_filter(struct rte_eth_dev *dev, - struct rte_eth_ethertype_filter *filter) -{ - struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private); - struct ixgbe_filter_info *filter_info = - IXGBE_DEV_PRIVATE_TO_FILTER_INFO(dev->data->dev_private); - uint32_t etqf, etqs; - int ret; - - ret = ixgbe_ethertype_filter_lookup(filter_info, filter->ether_type); - if (ret < 0) { - PMD_DRV_LOG(ERR, "ethertype (0x%04x) filter doesn't exist.", - filter->ether_type); - return -ENOENT; - } - - etqf = IXGBE_READ_REG(hw, IXGBE_ETQF(ret)); - if (etqf & IXGBE_ETQF_FILTER_EN) { - etqs = IXGBE_READ_REG(hw, IXGBE_ETQS(ret)); - filter->ether_type = etqf & IXGBE_ETQF_ETHERTYPE; - filter->flags = 0; - filter->queue = (etqs & IXGBE_ETQS_RX_QUEUE) >> - IXGBE_ETQS_RX_QUEUE_SHIFT; - return 0; - } - return -ENOENT; -} - -/* - * ixgbe_ethertype_filter_handle - Handle operations for ethertype filter. - * @dev: pointer to rte_eth_dev structure - * @filter_op:operation will be taken. - * @arg: a pointer to specific structure corresponding to the filter_op - */ -static int -ixgbe_ethertype_filter_handle(struct rte_eth_dev *dev, - enum rte_filter_op filter_op, - void *arg) -{ - struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private); - int ret; - - MAC_TYPE_FILTER_SUP(hw->mac.type); - - if (filter_op == RTE_ETH_FILTER_NOP) - return 0; - - if (arg == NULL) { - PMD_DRV_LOG(ERR, "arg shouldn't be NULL for operation %u.", - filter_op); - return -EINVAL; - } - - switch (filter_op) { - case RTE_ETH_FILTER_ADD: - ret = ixgbe_add_del_ethertype_filter(dev, - (struct rte_eth_ethertype_filter *)arg, - TRUE); - break; - case RTE_ETH_FILTER_DELETE: - ret = ixgbe_add_del_ethertype_filter(dev, - (struct rte_eth_ethertype_filter *)arg, - FALSE); - break; - case RTE_ETH_FILTER_GET: - ret = ixgbe_get_ethertype_filter(dev, - (struct rte_eth_ethertype_filter *)arg); - break; - default: - PMD_DRV_LOG(ERR, "unsupported operation %u.", filter_op); - ret = -EINVAL; - break; - } - return ret; -} - static int ixgbe_dev_filter_ctrl(struct rte_eth_dev *dev, enum rte_filter_type filter_type, @@ -7056,9 +6974,6 @@ ixgbe_dev_filter_ctrl(struct rte_eth_dev *dev, case RTE_ETH_FILTER_NTUPLE: ret = ixgbe_ntuple_filter_handle(dev, filter_op, arg); break; - case RTE_ETH_FILTER_ETHERTYPE: - ret = ixgbe_ethertype_filter_handle(dev, filter_op, arg); - break; case RTE_ETH_FILTER_SYN: ret = ixgbe_syn_filter_handle(dev, filter_op, arg); break; diff --git a/drivers/net/qede/qede_filter.c b/drivers/net/qede/qede_filter.c index 2e1646fe89..4d31db09fd 100644 --- a/drivers/net/qede/qede_filter.c +++ b/drivers/net/qede/qede_filter.c @@ -1561,7 +1561,6 @@ int qede_dev_filter_ctrl(struct rte_eth_dev *eth_dev, *(const void **)arg = &qede_flow_ops; return 0; - case RTE_ETH_FILTER_ETHERTYPE: case RTE_ETH_FILTER_FLEXIBLE: case RTE_ETH_FILTER_SYN: case RTE_ETH_FILTER_HASH: diff --git a/drivers/net/sfc/sfc_ethdev.c b/drivers/net/sfc/sfc_ethdev.c index 1abf05a80c..75f3a2f3d3 100644 --- a/drivers/net/sfc/sfc_ethdev.c +++ b/drivers/net/sfc/sfc_ethdev.c @@ -1748,9 +1748,6 @@ sfc_dev_filter_ctrl(struct rte_eth_dev *dev, enum rte_filter_type filter_type, case RTE_ETH_FILTER_NONE: sfc_err(sa, "Global filters configuration not supported"); break; - case RTE_ETH_FILTER_ETHERTYPE: - sfc_err(sa, "EtherType filters not supported"); - break; case RTE_ETH_FILTER_FLEXIBLE: sfc_err(sa, "Flexible filters not supported"); break; diff --git a/lib/librte_ethdev/rte_eth_ctrl.h b/lib/librte_ethdev/rte_eth_ctrl.h index a3d49e0913..5690f8111a 100644 --- a/lib/librte_ethdev/rte_eth_ctrl.h +++ b/lib/librte_ethdev/rte_eth_ctrl.h @@ -56,25 +56,6 @@ enum rte_filter_op { RTE_ETH_FILTER_OP_MAX }; -/** - * Define all structures for Ethertype Filter type. - */ - -#define RTE_ETHTYPE_FLAGS_MAC 0x0001 /**< If set, compare mac */ -#define RTE_ETHTYPE_FLAGS_DROP 0x0002 /**< If set, drop packet when match */ - -/** - * A structure used to define the ethertype filter entry - * to support RTE_ETH_FILTER_ETHERTYPE with RTE_ETH_FILTER_ADD, - * RTE_ETH_FILTER_DELETE and RTE_ETH_FILTER_GET operations. - */ -struct rte_eth_ethertype_filter { - struct rte_ether_addr mac_addr; /**< Mac address to match. */ - uint16_t ether_type; /**< Ether type to match */ - uint16_t flags; /**< Flags from RTE_ETHTYPE_FLAGS_* */ - uint16_t queue; /**< Queue assigned to when match*/ -}; - #define RTE_FLEX_FILTER_MAXLEN 128 /**< bytes to use in flex filter. */ #define RTE_FLEX_FILTER_MASK_SIZE \ (RTE_ALIGN(RTE_FLEX_FILTER_MAXLEN, CHAR_BIT) / CHAR_BIT) diff --git a/lib/librte_ethdev/rte_ethdev_driver.h b/lib/librte_ethdev/rte_ethdev_driver.h index c63b9f7eb7..67a83dacc7 100644 --- a/lib/librte_ethdev/rte_ethdev_driver.h +++ b/lib/librte_ethdev/rte_ethdev_driver.h @@ -1342,6 +1342,29 @@ int rte_eth_hairpin_queue_peer_unbind(uint16_t cur_port, uint16_t cur_queue, uint32_t direction); + +/* + * Legacy ethdev API used internally by drivers. + */ + +/** + * Define all structures for Ethertype Filter type. + */ + +#define RTE_ETHTYPE_FLAGS_MAC 0x0001 /**< If set, compare mac */ +#define RTE_ETHTYPE_FLAGS_DROP 0x0002 /**< If set, drop packet when match */ + +/** + * A structure used to define the ethertype filter entry + * to support RTE_ETH_FILTER_ETHERTYPE data representation. + */ +struct rte_eth_ethertype_filter { + struct rte_ether_addr mac_addr; /**< Mac address to match. */ + uint16_t ether_type; /**< Ether type to match */ + uint16_t flags; /**< Flags from RTE_ETHTYPE_FLAGS_* */ + uint16_t queue; /**< Queue assigned to when match*/ +}; + #ifdef __cplusplus } #endif From patchwork Sun Oct 18 14:09:01 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Rybchenko X-Patchwork-Id: 81259 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 1B9ACA04B0; Sun, 18 Oct 2020 16:10:14 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 791B0CA08; Sun, 18 Oct 2020 16:09:30 +0200 (CEST) Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [67.231.154.164]) by dpdk.org (Postfix) with ESMTP id 79670C87A for ; Sun, 18 Oct 2020 16:09:26 +0200 (CEST) Received: from mx1-us1.ppe-hosted.com (unknown [10.110.50.150]) by dispatch1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 1754F20087; Sun, 18 Oct 2020 14:09:25 +0000 (UTC) Received: from us4-mdac16-62.at1.mdlocal (unknown [10.110.50.155]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 155E0800A3; Sun, 18 Oct 2020 14:09:25 +0000 (UTC) X-Virus-Scanned: Proofpoint Essentials engine Received: from mx1-us1.ppe-hosted.com (unknown [10.110.50.12]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 87F64100061; Sun, 18 Oct 2020 14:09:24 +0000 (UTC) Received: from webmail.solarflare.com (uk.solarflare.com [193.34.186.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 4DFAF4005B; Sun, 18 Oct 2020 14:09:24 +0000 (UTC) Received: from ukex01.SolarFlarecom.com (10.17.10.4) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Sun, 18 Oct 2020 15:09:19 +0100 Received: from opal.uk.solarflarecom.com (10.17.10.1) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Sun, 18 Oct 2020 15:09:19 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (ukv-loginhost.uk.solarflarecom.com [10.17.10.39]) by opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id 09IE9Jlj002033; Sun, 18 Oct 2020 15:09:19 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1]) by ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id 31D8F1613A9; Sun, 18 Oct 2020 15:09:19 +0100 (BST) From: Andrew Rybchenko To: Wenzhuo Lu , Beilei Xing , Bernard Iremonger , Ray Kinsella , Neil Horman , Jeff Guo , Haiyue Wang , Rasesh Mody , Shahed Shaikh , Andrew Rybchenko CC: Date: Sun, 18 Oct 2020 15:09:01 +0100 Message-ID: <1603030152-13451-5-git-send-email-arybchenko@solarflare.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1603030152-13451-1-git-send-email-arybchenko@solarflare.com> References: <1603030152-13451-1-git-send-email-arybchenko@solarflare.com> MIME-Version: 1.0 X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.6.1012-25732.003 X-TM-AS-Result: No-17.078900-8.000000-10 X-TMASE-MatchedRID: WZ4RUs49kiDXhaZsZZP8sDahjZPEodkXY/L2/AZJAWSYkF7ZtFfCU0I9 0U6XYOu38XVI39JCRnRuL3ESIrARlyHhSBQfglfsA9lly13c/gHYuVu0X/rOkJGhAvBSa2i/Ceg a5Z7JsDGRbYgMp8kCH7FjRXmWmjfVcqDeIxo3t8hPs79gcmEg0HE01tKb2rARVI7KaIl9Nhdo8w ucTFrANc2yqQsaXQic1575LJbEh7B+kzNEKbXWo+Pwk3jODTrZnyQFaVgMM2Ag2yVdj3LAROLSd VP2tZn5gjiRDGW7Bcy2MJS2H4HaNtGZBRXICgnt6GyDR2ZB+cai8D/o42y/SuQ45nVtPqmx1SNB BkEOrj5PJKNFvY5r+b6oBTCBl4wcBZdQz2rkVg5FeAr5guIYJrto11mU6Hl8x5B+7qLBJ+xwcpE 9NiP9Xav7P7uHsnluOvlrxAcLL1fDJQPapbvuAihJ5tvbfbyL3FYvKmZiVnMB3LgzIBkuA4O5Tf SzrxQ7XIP6Tr+fSxOyc/zO2GdYPJOA1IVKiSC+oS0guoV6SZexq37CBjJNbJsoi2XrUn/JUTdY/ mdfTXtJKW4mDlJsMbxAi7jPoeEQftwZ3X11IV0= X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10--17.078900-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.6.1012-25732.003 X-MDID: 1603030165-0bIt2C3Jfzmz X-PPE-DISP: 1603030165;0bIt2C3Jfzmz Subject: [dpdk-dev] [PATCH 04/14] ethdev: remove legacy flexible filter type support X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" RTE flow API should be used for filtering. Temporarily preserve helper defines in public interface. Signed-off-by: Andrew Rybchenko Acked-by: Haiyue Wang --- app/test-pmd/cmdline.c | 195 --------------------------- doc/guides/rel_notes/deprecation.rst | 2 +- drivers/net/e1000/igb_ethdev.c | 104 -------------- drivers/net/qede/qede_filter.c | 1 - drivers/net/sfc/sfc_ethdev.c | 3 - 5 files changed, 1 insertion(+), 304 deletions(-) diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c index f0fe97fb9c..e7e85cf304 100644 --- a/app/test-pmd/cmdline.c +++ b/app/test-pmd/cmdline.c @@ -993,11 +993,6 @@ static void cmd_help_long_parsed(void *parsed_result, "syn_filter (port_id) (add|del) priority (high|low) queue (queue_id)" " Add/Del syn filter.\n\n" - "flex_filter (port_id) (add|del) len (len_value)" - " bytes (bytes_value) mask (mask_value)" - " priority (prio_value) queue (queue_id)\n" - " Add/Del a flex filter.\n\n" - "flow_director_filter (port_id) mode IP (add|del|update)" " flow (ipv4-other|ipv4-frag|ipv6-other|ipv6-frag)" " src (src_ip_address) dst (dst_ip_address)" @@ -10873,195 +10868,6 @@ cmdline_parse_inst_t cmd_5tuple_filter = { }, }; -/* *** ADD/REMOVE A flex FILTER *** */ -struct cmd_flex_filter_result { - cmdline_fixed_string_t filter; - cmdline_fixed_string_t ops; - portid_t port_id; - cmdline_fixed_string_t len; - uint8_t len_value; - cmdline_fixed_string_t bytes; - cmdline_fixed_string_t bytes_value; - cmdline_fixed_string_t mask; - cmdline_fixed_string_t mask_value; - cmdline_fixed_string_t priority; - uint8_t priority_value; - cmdline_fixed_string_t queue; - uint16_t queue_id; -}; - -static int xdigit2val(unsigned char c) -{ - int val; - if (isdigit(c)) - val = c - '0'; - else if (isupper(c)) - val = c - 'A' + 10; - else - val = c - 'a' + 10; - return val; -} - -static void -cmd_flex_filter_parsed(void *parsed_result, - __rte_unused struct cmdline *cl, - __rte_unused void *data) -{ - int ret = 0; - struct rte_eth_flex_filter filter; - struct cmd_flex_filter_result *res = parsed_result; - char *bytes_ptr, *mask_ptr; - uint16_t len, i, j = 0; - char c; - int val; - uint8_t byte = 0; - - if (res->len_value > RTE_FLEX_FILTER_MAXLEN) { - printf("the len exceed the max length 128\n"); - return; - } - memset(&filter, 0, sizeof(struct rte_eth_flex_filter)); - filter.len = res->len_value; - filter.priority = res->priority_value; - filter.queue = res->queue_id; - bytes_ptr = res->bytes_value; - mask_ptr = res->mask_value; - - /* translate bytes string to array. */ - if (bytes_ptr[0] == '0' && ((bytes_ptr[1] == 'x') || - (bytes_ptr[1] == 'X'))) - bytes_ptr += 2; - len = strnlen(bytes_ptr, res->len_value * 2); - if (len == 0 || (len % 8 != 0)) { - printf("please check len and bytes input\n"); - return; - } - for (i = 0; i < len; i++) { - c = bytes_ptr[i]; - if (isxdigit(c) == 0) { - /* invalid characters. */ - printf("invalid input\n"); - return; - } - val = xdigit2val(c); - if (i % 2) { - byte |= val; - filter.bytes[j] = byte; - printf("bytes[%d]:%02x ", j, filter.bytes[j]); - j++; - byte = 0; - } else - byte |= val << 4; - } - printf("\n"); - /* translate mask string to uint8_t array. */ - if (mask_ptr[0] == '0' && ((mask_ptr[1] == 'x') || - (mask_ptr[1] == 'X'))) - mask_ptr += 2; - len = strnlen(mask_ptr, (res->len_value + 3) / 4); - if (len == 0) { - printf("invalid input\n"); - return; - } - j = 0; - byte = 0; - for (i = 0; i < len; i++) { - c = mask_ptr[i]; - if (isxdigit(c) == 0) { - /* invalid characters. */ - printf("invalid input\n"); - return; - } - val = xdigit2val(c); - if (i % 2) { - byte |= val; - filter.mask[j] = byte; - printf("mask[%d]:%02x ", j, filter.mask[j]); - j++; - byte = 0; - } else - byte |= val << 4; - } - printf("\n"); - - if (!strcmp(res->ops, "add")) - ret = rte_eth_dev_filter_ctrl(res->port_id, - RTE_ETH_FILTER_FLEXIBLE, - RTE_ETH_FILTER_ADD, - &filter); - else - ret = rte_eth_dev_filter_ctrl(res->port_id, - RTE_ETH_FILTER_FLEXIBLE, - RTE_ETH_FILTER_DELETE, - &filter); - - if (ret < 0) - printf("flex filter setting error: (%s)\n", strerror(-ret)); -} - -cmdline_parse_token_string_t cmd_flex_filter_filter = - TOKEN_STRING_INITIALIZER(struct cmd_flex_filter_result, - filter, "flex_filter"); -cmdline_parse_token_num_t cmd_flex_filter_port_id = - TOKEN_NUM_INITIALIZER(struct cmd_flex_filter_result, - port_id, UINT16); -cmdline_parse_token_string_t cmd_flex_filter_ops = - TOKEN_STRING_INITIALIZER(struct cmd_flex_filter_result, - ops, "add#del"); -cmdline_parse_token_string_t cmd_flex_filter_len = - TOKEN_STRING_INITIALIZER(struct cmd_flex_filter_result, - len, "len"); -cmdline_parse_token_num_t cmd_flex_filter_len_value = - TOKEN_NUM_INITIALIZER(struct cmd_flex_filter_result, - len_value, UINT8); -cmdline_parse_token_string_t cmd_flex_filter_bytes = - TOKEN_STRING_INITIALIZER(struct cmd_flex_filter_result, - bytes, "bytes"); -cmdline_parse_token_string_t cmd_flex_filter_bytes_value = - TOKEN_STRING_INITIALIZER(struct cmd_flex_filter_result, - bytes_value, NULL); -cmdline_parse_token_string_t cmd_flex_filter_mask = - TOKEN_STRING_INITIALIZER(struct cmd_flex_filter_result, - mask, "mask"); -cmdline_parse_token_string_t cmd_flex_filter_mask_value = - TOKEN_STRING_INITIALIZER(struct cmd_flex_filter_result, - mask_value, NULL); -cmdline_parse_token_string_t cmd_flex_filter_priority = - TOKEN_STRING_INITIALIZER(struct cmd_flex_filter_result, - priority, "priority"); -cmdline_parse_token_num_t cmd_flex_filter_priority_value = - TOKEN_NUM_INITIALIZER(struct cmd_flex_filter_result, - priority_value, UINT8); -cmdline_parse_token_string_t cmd_flex_filter_queue = - TOKEN_STRING_INITIALIZER(struct cmd_flex_filter_result, - queue, "queue"); -cmdline_parse_token_num_t cmd_flex_filter_queue_id = - TOKEN_NUM_INITIALIZER(struct cmd_flex_filter_result, - queue_id, UINT16); -cmdline_parse_inst_t cmd_flex_filter = { - .f = cmd_flex_filter_parsed, - .data = NULL, - .help_str = "flex_filter add|del len bytes " - " mask priority queue : " - "Add/Del a flex filter", - .tokens = { - (void *)&cmd_flex_filter_filter, - (void *)&cmd_flex_filter_port_id, - (void *)&cmd_flex_filter_ops, - (void *)&cmd_flex_filter_len, - (void *)&cmd_flex_filter_len_value, - (void *)&cmd_flex_filter_bytes, - (void *)&cmd_flex_filter_bytes_value, - (void *)&cmd_flex_filter_mask, - (void *)&cmd_flex_filter_mask_value, - (void *)&cmd_flex_filter_priority, - (void *)&cmd_flex_filter_priority_value, - (void *)&cmd_flex_filter_queue, - (void *)&cmd_flex_filter_queue_id, - NULL, - }, -}; - /* *** Filters Control *** */ /* *** deal with flow director filter *** */ @@ -19833,7 +19639,6 @@ cmdline_parse_ctx_t main_ctx[] = { (cmdline_parse_inst_t *)&cmd_syn_filter, (cmdline_parse_inst_t *)&cmd_2tuple_filter, (cmdline_parse_inst_t *)&cmd_5tuple_filter, - (cmdline_parse_inst_t *)&cmd_flex_filter, (cmdline_parse_inst_t *)&cmd_add_del_ip_flow_director, (cmdline_parse_inst_t *)&cmd_add_del_udp_flow_director, (cmdline_parse_inst_t *)&cmd_add_del_sctp_flow_director, diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst index f655fc06ac..4ed78809c0 100644 --- a/doc/guides/rel_notes/deprecation.rst +++ b/doc/guides/rel_notes/deprecation.rst @@ -108,7 +108,7 @@ Deprecation Notices * ethdev: the legacy filter API, including ``rte_eth_dev_filter_supported()``, ``rte_eth_dev_filter_ctrl()`` as well - as filter types FLEXIBLE, SYN, NTUPLE, TUNNEL, FDIR, + as filter types SYN, NTUPLE, TUNNEL, FDIR, HASH and L2_TUNNEL, is superseded by the generic flow API (rte_flow) in PMDs that implement the latter. The legacy API will be removed in DPDK 20.11. diff --git a/drivers/net/e1000/igb_ethdev.c b/drivers/net/e1000/igb_ethdev.c index 8b18f1cb28..7f99b76e48 100644 --- a/drivers/net/e1000/igb_ethdev.c +++ b/drivers/net/e1000/igb_ethdev.c @@ -195,11 +195,6 @@ static int igb_add_2tuple_filter(struct rte_eth_dev *dev, struct rte_eth_ntuple_filter *ntuple_filter); static int igb_remove_2tuple_filter(struct rte_eth_dev *dev, struct rte_eth_ntuple_filter *ntuple_filter); -static int eth_igb_get_flex_filter(struct rte_eth_dev *dev, - struct rte_eth_flex_filter *filter); -static int eth_igb_flex_filter_handle(struct rte_eth_dev *dev, - enum rte_filter_op filter_op, - void *arg); static int igb_add_5tuple_filter_82576(struct rte_eth_dev *dev, struct rte_eth_ntuple_filter *ntuple_filter); static int igb_remove_5tuple_filter_82576(struct rte_eth_dev *dev, @@ -4127,102 +4122,6 @@ eth_igb_add_del_flex_filter(struct rte_eth_dev *dev, return 0; } -static int -eth_igb_get_flex_filter(struct rte_eth_dev *dev, - struct rte_eth_flex_filter *filter) -{ - struct e1000_hw *hw = E1000_DEV_PRIVATE_TO_HW(dev->data->dev_private); - struct e1000_filter_info *filter_info = - E1000_DEV_PRIVATE_TO_FILTER_INFO(dev->data->dev_private); - struct e1000_flex_filter flex_filter, *it; - uint32_t wufc, queueing, wufc_en = 0; - - memset(&flex_filter, 0, sizeof(struct e1000_flex_filter)); - flex_filter.filter_info.len = filter->len; - flex_filter.filter_info.priority = filter->priority; - memcpy(flex_filter.filter_info.dwords, filter->bytes, filter->len); - memcpy(flex_filter.filter_info.mask, filter->mask, - RTE_ALIGN(filter->len, CHAR_BIT) / CHAR_BIT); - - it = eth_igb_flex_filter_lookup(&filter_info->flex_list, - &flex_filter.filter_info); - if (it == NULL) { - PMD_DRV_LOG(ERR, "filter doesn't exist."); - return -ENOENT; - } - - wufc = E1000_READ_REG(hw, E1000_WUFC); - wufc_en = E1000_WUFC_FLEX_HQ | (E1000_WUFC_FLX0 << it->index); - - if ((wufc & wufc_en) == wufc_en) { - uint32_t reg_off = 0; - if (it->index < E1000_MAX_FHFT) - reg_off = E1000_FHFT(it->index); - else - reg_off = E1000_FHFT_EXT(it->index - E1000_MAX_FHFT); - - queueing = E1000_READ_REG(hw, - reg_off + E1000_FHFT_QUEUEING_OFFSET); - filter->len = queueing & E1000_FHFT_QUEUEING_LEN; - filter->priority = (queueing & E1000_FHFT_QUEUEING_PRIO) >> - E1000_FHFT_QUEUEING_PRIO_SHIFT; - filter->queue = (queueing & E1000_FHFT_QUEUEING_QUEUE) >> - E1000_FHFT_QUEUEING_QUEUE_SHIFT; - return 0; - } - return -ENOENT; -} - -static int -eth_igb_flex_filter_handle(struct rte_eth_dev *dev, - enum rte_filter_op filter_op, - void *arg) -{ - struct e1000_hw *hw = E1000_DEV_PRIVATE_TO_HW(dev->data->dev_private); - struct rte_eth_flex_filter *filter; - int ret = 0; - - MAC_TYPE_FILTER_SUP_EXT(hw->mac.type); - - if (filter_op == RTE_ETH_FILTER_NOP) - return ret; - - if (arg == NULL) { - PMD_DRV_LOG(ERR, "arg shouldn't be NULL for operation %u", - filter_op); - return -EINVAL; - } - - filter = (struct rte_eth_flex_filter *)arg; - if (filter->len == 0 || filter->len > E1000_MAX_FLEX_FILTER_LEN - || filter->len % sizeof(uint64_t) != 0) { - PMD_DRV_LOG(ERR, "filter's length is out of range"); - return -EINVAL; - } - if (filter->priority > E1000_MAX_FLEX_FILTER_PRI) { - PMD_DRV_LOG(ERR, "filter's priority is out of range"); - return -EINVAL; - } - - switch (filter_op) { - case RTE_ETH_FILTER_ADD: - ret = eth_igb_add_del_flex_filter(dev, filter, TRUE); - break; - case RTE_ETH_FILTER_DELETE: - ret = eth_igb_add_del_flex_filter(dev, filter, FALSE); - break; - case RTE_ETH_FILTER_GET: - ret = eth_igb_get_flex_filter(dev, filter); - break; - default: - PMD_DRV_LOG(ERR, "unsupported operation %u", filter_op); - ret = -EINVAL; - break; - } - - return ret; -} - /* translate elements in struct rte_eth_ntuple_filter to struct e1000_5tuple_filter_info*/ static inline int ntuple_filter_to_5tuple_82576(struct rte_eth_ntuple_filter *filter, @@ -4852,9 +4751,6 @@ eth_igb_filter_ctrl(struct rte_eth_dev *dev, case RTE_ETH_FILTER_SYN: ret = eth_igb_syn_filter_handle(dev, filter_op, arg); break; - case RTE_ETH_FILTER_FLEXIBLE: - ret = eth_igb_flex_filter_handle(dev, filter_op, arg); - break; case RTE_ETH_FILTER_GENERIC: if (filter_op != RTE_ETH_FILTER_GET) return -EINVAL; diff --git a/drivers/net/qede/qede_filter.c b/drivers/net/qede/qede_filter.c index 4d31db09fd..28dc9d2234 100644 --- a/drivers/net/qede/qede_filter.c +++ b/drivers/net/qede/qede_filter.c @@ -1561,7 +1561,6 @@ int qede_dev_filter_ctrl(struct rte_eth_dev *eth_dev, *(const void **)arg = &qede_flow_ops; return 0; - case RTE_ETH_FILTER_FLEXIBLE: case RTE_ETH_FILTER_SYN: case RTE_ETH_FILTER_HASH: case RTE_ETH_FILTER_L2_TUNNEL: diff --git a/drivers/net/sfc/sfc_ethdev.c b/drivers/net/sfc/sfc_ethdev.c index 75f3a2f3d3..d976a57f2a 100644 --- a/drivers/net/sfc/sfc_ethdev.c +++ b/drivers/net/sfc/sfc_ethdev.c @@ -1748,9 +1748,6 @@ sfc_dev_filter_ctrl(struct rte_eth_dev *dev, enum rte_filter_type filter_type, case RTE_ETH_FILTER_NONE: sfc_err(sa, "Global filters configuration not supported"); break; - case RTE_ETH_FILTER_FLEXIBLE: - sfc_err(sa, "Flexible filters not supported"); - break; case RTE_ETH_FILTER_SYN: sfc_err(sa, "SYN filters not supported"); break; From patchwork Sun Oct 18 14:09:02 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Rybchenko X-Patchwork-Id: 81262 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 58295A04B0; Sun, 18 Oct 2020 16:11:35 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 6E38AE244; Sun, 18 Oct 2020 16:09:37 +0200 (CEST) Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [67.231.154.164]) by dpdk.org (Postfix) with ESMTP id C38C0C87C for ; Sun, 18 Oct 2020 16:09:26 +0200 (CEST) Received: from mx1-us1.ppe-hosted.com (unknown [10.110.50.150]) by dispatch1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 6004E20068; Sun, 18 Oct 2020 14:09:25 +0000 (UTC) Received: from us4-mdac16-71.at1.mdlocal (unknown [10.110.50.187]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 5E558800A3; Sun, 18 Oct 2020 14:09:25 +0000 (UTC) X-Virus-Scanned: Proofpoint Essentials engine Received: from mx1-us1.ppe-hosted.com (unknown [10.110.50.12]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id E2CB8100070; Sun, 18 Oct 2020 14:09:24 +0000 (UTC) Received: from webmail.solarflare.com (uk.solarflare.com [193.34.186.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 958754005B; Sun, 18 Oct 2020 14:09:24 +0000 (UTC) Received: from ukex01.SolarFlarecom.com (10.17.10.4) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Sun, 18 Oct 2020 15:09:19 +0100 Received: from opal.uk.solarflarecom.com (10.17.10.1) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Sun, 18 Oct 2020 15:09:19 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (ukv-loginhost.uk.solarflarecom.com [10.17.10.39]) by opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id 09IE9JOh002038; Sun, 18 Oct 2020 15:09:19 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1]) by ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id 9A11F1613A9; Sun, 18 Oct 2020 15:09:19 +0100 (BST) From: Andrew Rybchenko To: Jeff Guo , Haiyue Wang , "Thomas Monjalon" , Ferruh Yigit , Andrew Rybchenko CC: Date: Sun, 18 Oct 2020 15:09:02 +0100 Message-ID: <1603030152-13451-6-git-send-email-arybchenko@solarflare.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1603030152-13451-1-git-send-email-arybchenko@solarflare.com> References: <1603030152-13451-1-git-send-email-arybchenko@solarflare.com> MIME-Version: 1.0 X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.6.1012-25732.003 X-TM-AS-Result: No-8.507500-8.000000-10 X-TMASE-MatchedRID: pnBbihhC65a/kNGHVZrslklR2DE0NRdaTtNpk/ZYt1RTq//rncsNWRfA rDcyWLohMeqyG0R/rMXMdHm3E7kFwCHhSBQfglfsA9lly13c/gEisyg/lfGoZw6QlBHhBZuw6aX 8TYIrj1t2GjEZJ3ZsMW1JlGB4BRKtKh5xfxw1U6G2HyJ7/YtUlQZyESFXAljfGDF/35PeL1swfX HHXt4W1JXl7gCcwGZpHELAbuK7U6OdThjzrTlfORcr91Fo5aW9BGvINcfHqhcUE18jzz932gXZL VXlDEPdMuU88TSpJLLh4U2gYWCB4OtsQZv7lD956GyDR2ZB+cai8D/o42y/SvAlhlr8vzcdp4M2 YqcWrLWeA8wV5QBC0QLJAZ7o2IDnDPIzF4wRfrAURSScn+QSXt0H8LFZNFG7hqz53n/yPnqeevV OjcDAIYXfqzVb34lbzpqgRHCjBG4kD3Et/bfVEklLd09OvFjP X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10--8.507500-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.6.1012-25732.003 X-MDID: 1603030165-I_MRTaCTvdLb X-PPE-DISP: 1603030165;I_MRTaCTvdLb Subject: [dpdk-dev] [PATCH 05/14] ethdev: move flexible filter type to e1000 driver X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" net/e1000 driver is the only user of the struct rte_eth_flex_filter and helper defines. Move it to the driver and use igb_ prefix instead of rte_eth_. Signed-off-by: Andrew Rybchenko Acked-by: Haiyue Wang --- drivers/net/e1000/e1000_ethdev.h | 22 +++++++++++++++++-- drivers/net/e1000/igb_ethdev.c | 2 +- drivers/net/e1000/igb_flow.c | 36 ++++++++++++++++---------------- lib/librte_ethdev/rte_eth_ctrl.h | 19 ----------------- 4 files changed, 39 insertions(+), 40 deletions(-) diff --git a/drivers/net/e1000/e1000_ethdev.h b/drivers/net/e1000/e1000_ethdev.h index 1e41ae9de1..4755a5f333 100644 --- a/drivers/net/e1000/e1000_ethdev.h +++ b/drivers/net/e1000/e1000_ethdev.h @@ -331,10 +331,28 @@ struct igb_eth_syn_filter_ele { struct rte_eth_syn_filter filter_info; }; +#define IGB_FLEX_FILTER_MAXLEN 128 /**< bytes to use in flex filter. */ +#define IGB_FLEX_FILTER_MASK_SIZE \ + (RTE_ALIGN(IGB_FLEX_FILTER_MAXLEN, CHAR_BIT) / CHAR_BIT) + /**< mask bytes in flex filter. */ + +/** + * A structure used to define the flex filter entry + * to support RTE_ETH_FILTER_FLEXIBLE data representation. + */ +struct igb_flex_filter { + uint16_t len; + uint8_t bytes[IGB_FLEX_FILTER_MAXLEN]; /**< flex bytes in big endian. */ + uint8_t mask[IGB_FLEX_FILTER_MASK_SIZE]; + /**< if mask bit is 1b, do not compare corresponding byte. */ + uint8_t priority; + uint16_t queue; /**< Queue assigned to when match. */ +}; + /* flex filter list structure */ struct igb_flex_filter_ele { TAILQ_ENTRY(igb_flex_filter_ele) entries; - struct rte_eth_flex_filter filter_info; + struct igb_flex_filter filter_info; }; /* rss filter list structure */ @@ -515,7 +533,7 @@ int eth_igb_syn_filter_set(struct rte_eth_dev *dev, struct rte_eth_syn_filter *filter, bool add); int eth_igb_add_del_flex_filter(struct rte_eth_dev *dev, - struct rte_eth_flex_filter *filter, + struct igb_flex_filter *filter, bool add); int igb_rss_conf_init(struct rte_eth_dev *dev, struct igb_rte_flow_rss_conf *out, diff --git a/drivers/net/e1000/igb_ethdev.c b/drivers/net/e1000/igb_ethdev.c index 7f99b76e48..db67bcb7f9 100644 --- a/drivers/net/e1000/igb_ethdev.c +++ b/drivers/net/e1000/igb_ethdev.c @@ -4050,7 +4050,7 @@ igb_remove_flex_filter(struct rte_eth_dev *dev, int eth_igb_add_del_flex_filter(struct rte_eth_dev *dev, - struct rte_eth_flex_filter *filter, + struct igb_flex_filter *filter, bool add) { struct e1000_filter_info *filter_info = diff --git a/drivers/net/e1000/igb_flow.c b/drivers/net/e1000/igb_flow.c index 43fef889b5..ccb184df95 100644 --- a/drivers/net/e1000/igb_flow.c +++ b/drivers/net/e1000/igb_flow.c @@ -1041,7 +1041,7 @@ static int cons_parse_flex_filter(const struct rte_flow_attr *attr, const struct rte_flow_item pattern[], const struct rte_flow_action actions[], - struct rte_eth_flex_filter *filter, + struct igb_flex_filter *filter, struct rte_flow_error *error) { const struct rte_flow_item *item; @@ -1102,7 +1102,7 @@ cons_parse_flex_filter(const struct rte_flow_attr *attr, if (!raw_mask->length || !raw_mask->relative) { - memset(filter, 0, sizeof(struct rte_eth_flex_filter)); + memset(filter, 0, sizeof(struct igb_flex_filter)); rte_flow_error_set(error, EINVAL, RTE_FLOW_ERROR_TYPE_ITEM, item, "Not supported by flex filter"); @@ -1116,7 +1116,7 @@ cons_parse_flex_filter(const struct rte_flow_attr *attr, for (j = 0; j < raw_spec->length; j++) { if (raw_mask->pattern[j] != 0xFF) { - memset(filter, 0, sizeof(struct rte_eth_flex_filter)); + memset(filter, 0, sizeof(struct igb_flex_filter)); rte_flow_error_set(error, EINVAL, RTE_FLOW_ERROR_TYPE_ITEM, item, "Not supported by flex filter"); @@ -1140,8 +1140,8 @@ cons_parse_flex_filter(const struct rte_flow_attr *attr, } if ((raw_spec->length + offset + total_offset) > - RTE_FLEX_FILTER_MAXLEN) { - memset(filter, 0, sizeof(struct rte_eth_flex_filter)); + IGB_FLEX_FILTER_MAXLEN) { + memset(filter, 0, sizeof(struct igb_flex_filter)); rte_flow_error_set(error, EINVAL, RTE_FLOW_ERROR_TYPE_ITEM, item, "Not supported by flex filter"); @@ -1204,7 +1204,7 @@ cons_parse_flex_filter(const struct rte_flow_attr *attr, /* check if the first not void action is QUEUE. */ NEXT_ITEM_OF_ACTION(act, actions, index); if (act->type != RTE_FLOW_ACTION_TYPE_QUEUE) { - memset(filter, 0, sizeof(struct rte_eth_flex_filter)); + memset(filter, 0, sizeof(struct igb_flex_filter)); rte_flow_error_set(error, EINVAL, RTE_FLOW_ERROR_TYPE_ACTION, act, "Not supported action."); @@ -1218,7 +1218,7 @@ cons_parse_flex_filter(const struct rte_flow_attr *attr, index++; NEXT_ITEM_OF_ACTION(act, actions, index); if (act->type != RTE_FLOW_ACTION_TYPE_END) { - memset(filter, 0, sizeof(struct rte_eth_flex_filter)); + memset(filter, 0, sizeof(struct igb_flex_filter)); rte_flow_error_set(error, EINVAL, RTE_FLOW_ERROR_TYPE_ACTION, act, "Not supported action."); @@ -1228,7 +1228,7 @@ cons_parse_flex_filter(const struct rte_flow_attr *attr, /* parse attr */ /* must be input direction */ if (!attr->ingress) { - memset(filter, 0, sizeof(struct rte_eth_flex_filter)); + memset(filter, 0, sizeof(struct igb_flex_filter)); rte_flow_error_set(error, EINVAL, RTE_FLOW_ERROR_TYPE_ATTR_INGRESS, attr, "Only support ingress."); @@ -1237,7 +1237,7 @@ cons_parse_flex_filter(const struct rte_flow_attr *attr, /* not supported */ if (attr->egress) { - memset(filter, 0, sizeof(struct rte_eth_flex_filter)); + memset(filter, 0, sizeof(struct igb_flex_filter)); rte_flow_error_set(error, EINVAL, RTE_FLOW_ERROR_TYPE_ATTR_EGRESS, attr, "Not support egress."); @@ -1246,7 +1246,7 @@ cons_parse_flex_filter(const struct rte_flow_attr *attr, /* not supported */ if (attr->transfer) { - memset(filter, 0, sizeof(struct rte_eth_flex_filter)); + memset(filter, 0, sizeof(struct igb_flex_filter)); rte_flow_error_set(error, EINVAL, RTE_FLOW_ERROR_TYPE_ATTR_TRANSFER, attr, "No support for transfer."); @@ -1254,7 +1254,7 @@ cons_parse_flex_filter(const struct rte_flow_attr *attr, } if (attr->priority > 0xFFFF) { - memset(filter, 0, sizeof(struct rte_eth_flex_filter)); + memset(filter, 0, sizeof(struct igb_flex_filter)); rte_flow_error_set(error, EINVAL, RTE_FLOW_ERROR_TYPE_ATTR_PRIORITY, attr, "Error priority."); @@ -1271,7 +1271,7 @@ igb_parse_flex_filter(struct rte_eth_dev *dev, const struct rte_flow_attr *attr, const struct rte_flow_item pattern[], const struct rte_flow_action actions[], - struct rte_eth_flex_filter *filter, + struct igb_flex_filter *filter, struct rte_flow_error *error) { struct e1000_hw *hw = E1000_DEV_PRIVATE_TO_HW(dev->data->dev_private); @@ -1283,7 +1283,7 @@ igb_parse_flex_filter(struct rte_eth_dev *dev, actions, filter, error); if (filter->queue >= IGB_MAX_RX_QUEUE_NUM) { - memset(filter, 0, sizeof(struct rte_eth_flex_filter)); + memset(filter, 0, sizeof(struct igb_flex_filter)); rte_flow_error_set(error, EINVAL, RTE_FLOW_ERROR_TYPE_ITEM, NULL, "queue number not supported by flex filter"); @@ -1444,7 +1444,7 @@ igb_flow_create(struct rte_eth_dev *dev, struct rte_eth_ntuple_filter ntuple_filter; struct rte_eth_ethertype_filter ethertype_filter; struct rte_eth_syn_filter syn_filter; - struct rte_eth_flex_filter flex_filter; + struct igb_flex_filter flex_filter; struct igb_rte_flow_rss_conf rss_conf; struct rte_flow *flow = NULL; struct igb_ntuple_filter_ele *ntuple_filter_ptr; @@ -1549,7 +1549,7 @@ igb_flow_create(struct rte_eth_dev *dev, goto out; } - memset(&flex_filter, 0, sizeof(struct rte_eth_flex_filter)); + memset(&flex_filter, 0, sizeof(struct igb_flex_filter)); ret = igb_parse_flex_filter(dev, attr, pattern, actions, &flex_filter, error); if (!ret) { @@ -1564,7 +1564,7 @@ igb_flow_create(struct rte_eth_dev *dev, rte_memcpy(&flex_filter_ptr->filter_info, &flex_filter, - sizeof(struct rte_eth_flex_filter)); + sizeof(struct igb_flex_filter)); TAILQ_INSERT_TAIL(&igb_filter_flex_list, flex_filter_ptr, entries); flow->rule = flex_filter_ptr; @@ -1621,7 +1621,7 @@ igb_flow_validate(__rte_unused struct rte_eth_dev *dev, struct rte_eth_ntuple_filter ntuple_filter; struct rte_eth_ethertype_filter ethertype_filter; struct rte_eth_syn_filter syn_filter; - struct rte_eth_flex_filter flex_filter; + struct igb_flex_filter flex_filter; struct igb_rte_flow_rss_conf rss_conf; int ret; @@ -1643,7 +1643,7 @@ igb_flow_validate(__rte_unused struct rte_eth_dev *dev, if (!ret) return 0; - memset(&flex_filter, 0, sizeof(struct rte_eth_flex_filter)); + memset(&flex_filter, 0, sizeof(struct igb_flex_filter)); ret = igb_parse_flex_filter(dev, attr, pattern, actions, &flex_filter, error); if (!ret) diff --git a/lib/librte_ethdev/rte_eth_ctrl.h b/lib/librte_ethdev/rte_eth_ctrl.h index 5690f8111a..c5e33bec31 100644 --- a/lib/librte_ethdev/rte_eth_ctrl.h +++ b/lib/librte_ethdev/rte_eth_ctrl.h @@ -56,25 +56,6 @@ enum rte_filter_op { RTE_ETH_FILTER_OP_MAX }; -#define RTE_FLEX_FILTER_MAXLEN 128 /**< bytes to use in flex filter. */ -#define RTE_FLEX_FILTER_MASK_SIZE \ - (RTE_ALIGN(RTE_FLEX_FILTER_MAXLEN, CHAR_BIT) / CHAR_BIT) - /**< mask bytes in flex filter. */ - -/** - * A structure used to define the flex filter entry - * to support RTE_ETH_FILTER_FLEXIBLE with RTE_ETH_FILTER_ADD, - * RTE_ETH_FILTER_DELETE and RTE_ETH_FILTER_GET operations. - */ -struct rte_eth_flex_filter { - uint16_t len; - uint8_t bytes[RTE_FLEX_FILTER_MAXLEN]; /**< flex bytes in big endian.*/ - uint8_t mask[RTE_FLEX_FILTER_MASK_SIZE]; /**< if mask bit is 1b, do - not compare corresponding byte. */ - uint8_t priority; - uint16_t queue; /**< Queue assigned to when match. */ -}; - /** * A structure used to define the TCP syn filter entry * to support RTE_ETH_FILTER_SYN with RTE_ETH_FILTER_ADD, From patchwork Sun Oct 18 14:09:03 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Rybchenko X-Patchwork-Id: 81263 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 8186AA04B0; Sun, 18 Oct 2020 16:11:56 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 41F45E24A; Sun, 18 Oct 2020 16:09:39 +0200 (CEST) Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [67.231.154.164]) by dpdk.org (Postfix) with ESMTP id 6A4BFC87C for ; Sun, 18 Oct 2020 16:09:27 +0200 (CEST) Received: from mx1-us1.ppe-hosted.com (unknown [10.110.50.143]) by dispatch1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id F0CC9200AD; Sun, 18 Oct 2020 14:09:25 +0000 (UTC) Received: from us4-mdac16-49.at1.mdlocal (unknown [10.110.50.132]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id EEACF800A4; Sun, 18 Oct 2020 14:09:25 +0000 (UTC) X-Virus-Scanned: Proofpoint Essentials engine Received: from mx1-us1.ppe-hosted.com (unknown [10.110.50.12]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 79E3740061; Sun, 18 Oct 2020 14:09:25 +0000 (UTC) Received: from webmail.solarflare.com (uk.solarflare.com [193.34.186.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 3FBAB4005B; Sun, 18 Oct 2020 14:09:25 +0000 (UTC) Received: from ukex01.SolarFlarecom.com (10.17.10.4) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Sun, 18 Oct 2020 15:09:20 +0100 Received: from opal.uk.solarflarecom.com (10.17.10.1) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Sun, 18 Oct 2020 15:09:20 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (ukv-loginhost.uk.solarflarecom.com [10.17.10.39]) by opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id 09IE9Kom002041; Sun, 18 Oct 2020 15:09:20 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1]) by ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id 2882E1613A9; Sun, 18 Oct 2020 15:09:20 +0100 (BST) From: Andrew Rybchenko To: Wenzhuo Lu , Beilei Xing , Bernard Iremonger , Ray Kinsella , Neil Horman , Jeff Guo , Haiyue Wang , Rasesh Mody , Shahed Shaikh , Andrew Rybchenko , Thomas Monjalon , Ferruh Yigit CC: Date: Sun, 18 Oct 2020 15:09:03 +0100 Message-ID: <1603030152-13451-7-git-send-email-arybchenko@solarflare.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1603030152-13451-1-git-send-email-arybchenko@solarflare.com> References: <1603030152-13451-1-git-send-email-arybchenko@solarflare.com> MIME-Version: 1.0 X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.6.1012-25732.003 X-TM-AS-Result: No-19.056900-8.000000-10 X-TMASE-MatchedRID: OOcoWEKA1AP0gpEqM7fvYXv15w39S8ARY/L2/AZJAWSYkF7ZtFfCU4wW IRmLVWq5NNN0dk/lb45w5T4Iaj538mJZXQNDzktSGjzBgnFZvQ5vV3/OnMClWpGhAvBSa2i/rb7 fjT66q20DNmKZmmNto35AB484XXHDuCdzuwD0Lf9Owmo0laDRbMMA9JsxaUa3y5rJ0Rc+qSbp4z 9wZIUHUpq7+DtMdYiVfrEHG1yRCvUj8X63nijPy9+G9ND+fWcZEDnDEqNPduoIRf0AkrYwxeUpg UflHOa/TFCBKUeKNXi4m5J7BMcDnTbcsMCH+ZLFOPcOK0ijAH0TA7ACF0jdA0dmDSBYfnJR9YoZ OFDapk2pL2EAa1GV49oGu15bvOh/be+aQbMzCjP4KPASpfWnuWtNZoZ5+7ekBCzD0Dc8iUtHKow siP9YDRET+8LEBbdcouiEt5eHf2Suyr/sGF0bIMebIMlISwjbnQkHrAHoKqaeH01vXw3W4LERMp uIU2oepZfmyx21mKmJQ9wVn0iA85lfGONdv0wWqjZ865FPtpq/yN2q8U674ncbjcm3iAEjo8WMk QWv6iXBcIE78YqRWo6HM5rqDwqtlExlQIQeRG0= X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10--19.056900-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.6.1012-25732.003 X-MDID: 1603030166-bRxULzHwAuJq X-PPE-DISP: 1603030166;bRxULzHwAuJq Subject: [dpdk-dev] [PATCH 06/14] ethdev: remove legacy SYN filter type support X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" RTE flow API should be used for filtering. Move corresponding definitions to ethdev internal driver API since it is used by drivers internally. Preserve RTE_ETH_FILTER_SYN because of it as well. Signed-off-by: Andrew Rybchenko Acked-by: Haiyue Wang --- app/test-pmd/cmdline.c | 95 --------------------------- doc/guides/rel_notes/deprecation.rst | 2 +- drivers/net/e1000/igb_ethdev.c | 70 -------------------- drivers/net/ixgbe/ixgbe_ethdev.c | 66 ------------------- drivers/net/qede/qede_filter.c | 1 - drivers/net/sfc/sfc_ethdev.c | 3 - lib/librte_ethdev/rte_eth_ctrl.h | 11 ---- lib/librte_ethdev/rte_ethdev_driver.h | 10 +++ 8 files changed, 11 insertions(+), 247 deletions(-) diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c index e7e85cf304..bf3fdd8609 100644 --- a/app/test-pmd/cmdline.c +++ b/app/test-pmd/cmdline.c @@ -990,9 +990,6 @@ static void cmd_help_long_parsed(void *parsed_result, " priority (prio_value) queue (queue_id)\n" " Add/Del a 5tuple filter.\n\n" - "syn_filter (port_id) (add|del) priority (high|low) queue (queue_id)" - " Add/Del syn filter.\n\n" - "flow_director_filter (port_id) mode IP (add|del|update)" " flow (ipv4-other|ipv4-frag|ipv6-other|ipv6-frag)" " src (src_ip_address) dst (dst_ip_address)" @@ -9982,97 +9979,6 @@ cmdline_parse_inst_t cmd_dump_one = { }, }; -/* *** Add/Del syn filter *** */ -struct cmd_syn_filter_result { - cmdline_fixed_string_t filter; - portid_t port_id; - cmdline_fixed_string_t ops; - cmdline_fixed_string_t priority; - cmdline_fixed_string_t high; - cmdline_fixed_string_t queue; - uint16_t queue_id; -}; - -static void -cmd_syn_filter_parsed(void *parsed_result, - __rte_unused struct cmdline *cl, - __rte_unused void *data) -{ - struct cmd_syn_filter_result *res = parsed_result; - struct rte_eth_syn_filter syn_filter; - int ret = 0; - - ret = rte_eth_dev_filter_supported(res->port_id, - RTE_ETH_FILTER_SYN); - if (ret < 0) { - printf("syn filter is not supported on port %u.\n", - res->port_id); - return; - } - - memset(&syn_filter, 0, sizeof(syn_filter)); - - if (!strcmp(res->ops, "add")) { - if (!strcmp(res->high, "high")) - syn_filter.hig_pri = 1; - else - syn_filter.hig_pri = 0; - - syn_filter.queue = res->queue_id; - ret = rte_eth_dev_filter_ctrl(res->port_id, - RTE_ETH_FILTER_SYN, - RTE_ETH_FILTER_ADD, - &syn_filter); - } else - ret = rte_eth_dev_filter_ctrl(res->port_id, - RTE_ETH_FILTER_SYN, - RTE_ETH_FILTER_DELETE, - &syn_filter); - - if (ret < 0) - printf("syn filter programming error: (%s)\n", - strerror(-ret)); -} - -cmdline_parse_token_string_t cmd_syn_filter_filter = - TOKEN_STRING_INITIALIZER(struct cmd_syn_filter_result, - filter, "syn_filter"); -cmdline_parse_token_num_t cmd_syn_filter_port_id = - TOKEN_NUM_INITIALIZER(struct cmd_syn_filter_result, - port_id, UINT16); -cmdline_parse_token_string_t cmd_syn_filter_ops = - TOKEN_STRING_INITIALIZER(struct cmd_syn_filter_result, - ops, "add#del"); -cmdline_parse_token_string_t cmd_syn_filter_priority = - TOKEN_STRING_INITIALIZER(struct cmd_syn_filter_result, - priority, "priority"); -cmdline_parse_token_string_t cmd_syn_filter_high = - TOKEN_STRING_INITIALIZER(struct cmd_syn_filter_result, - high, "high#low"); -cmdline_parse_token_string_t cmd_syn_filter_queue = - TOKEN_STRING_INITIALIZER(struct cmd_syn_filter_result, - queue, "queue"); -cmdline_parse_token_num_t cmd_syn_filter_queue_id = - TOKEN_NUM_INITIALIZER(struct cmd_syn_filter_result, - queue_id, UINT16); - -cmdline_parse_inst_t cmd_syn_filter = { - .f = cmd_syn_filter_parsed, - .data = NULL, - .help_str = "syn_filter add|del priority high|low queue " - ": Add/Delete syn filter", - .tokens = { - (void *)&cmd_syn_filter_filter, - (void *)&cmd_syn_filter_port_id, - (void *)&cmd_syn_filter_ops, - (void *)&cmd_syn_filter_priority, - (void *)&cmd_syn_filter_high, - (void *)&cmd_syn_filter_queue, - (void *)&cmd_syn_filter_queue_id, - NULL, - }, -}; - /* *** queue region set *** */ struct cmd_queue_region_result { cmdline_fixed_string_t set; @@ -19636,7 +19542,6 @@ cmdline_parse_ctx_t main_ctx[] = { (cmdline_parse_inst_t *)&cmd_config_rss_hash_key, (cmdline_parse_inst_t *)&cmd_dump, (cmdline_parse_inst_t *)&cmd_dump_one, - (cmdline_parse_inst_t *)&cmd_syn_filter, (cmdline_parse_inst_t *)&cmd_2tuple_filter, (cmdline_parse_inst_t *)&cmd_5tuple_filter, (cmdline_parse_inst_t *)&cmd_add_del_ip_flow_director, diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst index 4ed78809c0..8a7839152e 100644 --- a/doc/guides/rel_notes/deprecation.rst +++ b/doc/guides/rel_notes/deprecation.rst @@ -108,7 +108,7 @@ Deprecation Notices * ethdev: the legacy filter API, including ``rte_eth_dev_filter_supported()``, ``rte_eth_dev_filter_ctrl()`` as well - as filter types SYN, NTUPLE, TUNNEL, FDIR, + as filter types NTUPLE, TUNNEL, FDIR, HASH and L2_TUNNEL, is superseded by the generic flow API (rte_flow) in PMDs that implement the latter. The legacy API will be removed in DPDK 20.11. diff --git a/drivers/net/e1000/igb_ethdev.c b/drivers/net/e1000/igb_ethdev.c index db67bcb7f9..7e2c77d356 100644 --- a/drivers/net/e1000/igb_ethdev.c +++ b/drivers/net/e1000/igb_ethdev.c @@ -186,11 +186,6 @@ static int eth_igb_rss_reta_query(struct rte_eth_dev *dev, struct rte_eth_rss_reta_entry64 *reta_conf, uint16_t reta_size); -static int eth_igb_syn_filter_get(struct rte_eth_dev *dev, - struct rte_eth_syn_filter *filter); -static int eth_igb_syn_filter_handle(struct rte_eth_dev *dev, - enum rte_filter_op filter_op, - void *arg); static int igb_add_2tuple_filter(struct rte_eth_dev *dev, struct rte_eth_ntuple_filter *ntuple_filter); static int igb_remove_2tuple_filter(struct rte_eth_dev *dev, @@ -3670,68 +3665,6 @@ eth_igb_syn_filter_set(struct rte_eth_dev *dev, return 0; } -static int -eth_igb_syn_filter_get(struct rte_eth_dev *dev, - struct rte_eth_syn_filter *filter) -{ - struct e1000_hw *hw = E1000_DEV_PRIVATE_TO_HW(dev->data->dev_private); - uint32_t synqf, rfctl; - - synqf = E1000_READ_REG(hw, E1000_SYNQF(0)); - if (synqf & E1000_SYN_FILTER_ENABLE) { - rfctl = E1000_READ_REG(hw, E1000_RFCTL); - filter->hig_pri = (rfctl & E1000_RFCTL_SYNQFP) ? 1 : 0; - filter->queue = (uint8_t)((synqf & E1000_SYN_FILTER_QUEUE) >> - E1000_SYN_FILTER_QUEUE_SHIFT); - return 0; - } - - return -ENOENT; -} - -static int -eth_igb_syn_filter_handle(struct rte_eth_dev *dev, - enum rte_filter_op filter_op, - void *arg) -{ - struct e1000_hw *hw = E1000_DEV_PRIVATE_TO_HW(dev->data->dev_private); - int ret; - - MAC_TYPE_FILTER_SUP(hw->mac.type); - - if (filter_op == RTE_ETH_FILTER_NOP) - return 0; - - if (arg == NULL) { - PMD_DRV_LOG(ERR, "arg shouldn't be NULL for operation %u", - filter_op); - return -EINVAL; - } - - switch (filter_op) { - case RTE_ETH_FILTER_ADD: - ret = eth_igb_syn_filter_set(dev, - (struct rte_eth_syn_filter *)arg, - TRUE); - break; - case RTE_ETH_FILTER_DELETE: - ret = eth_igb_syn_filter_set(dev, - (struct rte_eth_syn_filter *)arg, - FALSE); - break; - case RTE_ETH_FILTER_GET: - ret = eth_igb_syn_filter_get(dev, - (struct rte_eth_syn_filter *)arg); - break; - default: - PMD_DRV_LOG(ERR, "unsupported operation %u", filter_op); - ret = -EINVAL; - break; - } - - return ret; -} - /* translate elements in struct rte_eth_ntuple_filter to struct e1000_2tuple_filter_info*/ static inline int ntuple_filter_to_2tuple(struct rte_eth_ntuple_filter *filter, @@ -4748,9 +4681,6 @@ eth_igb_filter_ctrl(struct rte_eth_dev *dev, case RTE_ETH_FILTER_NTUPLE: ret = igb_ntuple_filter_handle(dev, filter_op, arg); break; - case RTE_ETH_FILTER_SYN: - ret = eth_igb_syn_filter_handle(dev, filter_op, arg); - break; case RTE_ETH_FILTER_GENERIC: if (filter_op != RTE_ETH_FILTER_GET) return -EINVAL; diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c index 28a088a71b..f75725b433 100644 --- a/drivers/net/ixgbe/ixgbe_ethdev.c +++ b/drivers/net/ixgbe/ixgbe_ethdev.c @@ -300,11 +300,6 @@ static int ixgbevf_add_mac_addr(struct rte_eth_dev *dev, static void ixgbevf_remove_mac_addr(struct rte_eth_dev *dev, uint32_t index); static int ixgbevf_set_default_mac_addr(struct rte_eth_dev *dev, struct rte_ether_addr *mac_addr); -static int ixgbe_syn_filter_get(struct rte_eth_dev *dev, - struct rte_eth_syn_filter *filter); -static int ixgbe_syn_filter_handle(struct rte_eth_dev *dev, - enum rte_filter_op filter_op, - void *arg); static int ixgbe_add_5tuple_filter(struct rte_eth_dev *dev, struct ixgbe_5tuple_filter *filter); static void ixgbe_remove_5tuple_filter(struct rte_eth_dev *dev, @@ -6404,64 +6399,6 @@ ixgbe_syn_filter_set(struct rte_eth_dev *dev, return 0; } -static int -ixgbe_syn_filter_get(struct rte_eth_dev *dev, - struct rte_eth_syn_filter *filter) -{ - struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private); - uint32_t synqf = IXGBE_READ_REG(hw, IXGBE_SYNQF); - - if (synqf & IXGBE_SYN_FILTER_ENABLE) { - filter->hig_pri = (synqf & IXGBE_SYN_FILTER_SYNQFP) ? 1 : 0; - filter->queue = (uint16_t)((synqf & IXGBE_SYN_FILTER_QUEUE) >> 1); - return 0; - } - return -ENOENT; -} - -static int -ixgbe_syn_filter_handle(struct rte_eth_dev *dev, - enum rte_filter_op filter_op, - void *arg) -{ - struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private); - int ret; - - MAC_TYPE_FILTER_SUP(hw->mac.type); - - if (filter_op == RTE_ETH_FILTER_NOP) - return 0; - - if (arg == NULL) { - PMD_DRV_LOG(ERR, "arg shouldn't be NULL for operation %u", - filter_op); - return -EINVAL; - } - - switch (filter_op) { - case RTE_ETH_FILTER_ADD: - ret = ixgbe_syn_filter_set(dev, - (struct rte_eth_syn_filter *)arg, - TRUE); - break; - case RTE_ETH_FILTER_DELETE: - ret = ixgbe_syn_filter_set(dev, - (struct rte_eth_syn_filter *)arg, - FALSE); - break; - case RTE_ETH_FILTER_GET: - ret = ixgbe_syn_filter_get(dev, - (struct rte_eth_syn_filter *)arg); - break; - default: - PMD_DRV_LOG(ERR, "unsupported operation %u", filter_op); - ret = -EINVAL; - break; - } - - return ret; -} - static inline enum ixgbe_5tuple_protocol convert_protocol_type(uint8_t protocol_value) @@ -6974,9 +6911,6 @@ ixgbe_dev_filter_ctrl(struct rte_eth_dev *dev, case RTE_ETH_FILTER_NTUPLE: ret = ixgbe_ntuple_filter_handle(dev, filter_op, arg); break; - case RTE_ETH_FILTER_SYN: - ret = ixgbe_syn_filter_handle(dev, filter_op, arg); - break; case RTE_ETH_FILTER_FDIR: ret = ixgbe_fdir_ctrl_func(dev, filter_op, arg); break; diff --git a/drivers/net/qede/qede_filter.c b/drivers/net/qede/qede_filter.c index 28dc9d2234..f3da5ecd92 100644 --- a/drivers/net/qede/qede_filter.c +++ b/drivers/net/qede/qede_filter.c @@ -1561,7 +1561,6 @@ int qede_dev_filter_ctrl(struct rte_eth_dev *eth_dev, *(const void **)arg = &qede_flow_ops; return 0; - case RTE_ETH_FILTER_SYN: case RTE_ETH_FILTER_HASH: case RTE_ETH_FILTER_L2_TUNNEL: case RTE_ETH_FILTER_MAX: diff --git a/drivers/net/sfc/sfc_ethdev.c b/drivers/net/sfc/sfc_ethdev.c index d976a57f2a..13f4355cf1 100644 --- a/drivers/net/sfc/sfc_ethdev.c +++ b/drivers/net/sfc/sfc_ethdev.c @@ -1748,9 +1748,6 @@ sfc_dev_filter_ctrl(struct rte_eth_dev *dev, enum rte_filter_type filter_type, case RTE_ETH_FILTER_NONE: sfc_err(sa, "Global filters configuration not supported"); break; - case RTE_ETH_FILTER_SYN: - sfc_err(sa, "SYN filters not supported"); - break; case RTE_ETH_FILTER_NTUPLE: sfc_err(sa, "NTUPLE filters not supported"); break; diff --git a/lib/librte_ethdev/rte_eth_ctrl.h b/lib/librte_ethdev/rte_eth_ctrl.h index c5e33bec31..48515818dd 100644 --- a/lib/librte_ethdev/rte_eth_ctrl.h +++ b/lib/librte_ethdev/rte_eth_ctrl.h @@ -56,17 +56,6 @@ enum rte_filter_op { RTE_ETH_FILTER_OP_MAX }; -/** - * A structure used to define the TCP syn filter entry - * to support RTE_ETH_FILTER_SYN with RTE_ETH_FILTER_ADD, - * RTE_ETH_FILTER_DELETE and RTE_ETH_FILTER_GET operations. - */ -struct rte_eth_syn_filter { - uint8_t hig_pri; /**< 1 - higher priority than other filters, - 0 - lower priority. */ - uint16_t queue; /**< Queue assigned to when match */ -}; - /** * Define all structures for ntuple Filter type. */ diff --git a/lib/librte_ethdev/rte_ethdev_driver.h b/lib/librte_ethdev/rte_ethdev_driver.h index 67a83dacc7..436e7ead9c 100644 --- a/lib/librte_ethdev/rte_ethdev_driver.h +++ b/lib/librte_ethdev/rte_ethdev_driver.h @@ -1365,6 +1365,16 @@ struct rte_eth_ethertype_filter { uint16_t queue; /**< Queue assigned to when match*/ }; +/** + * A structure used to define the TCP syn filter entry + * to support RTE_ETH_FILTER_SYN data representation. + */ +struct rte_eth_syn_filter { + /** 1 - higher priority than other filters, 0 - lower priority. */ + uint8_t hig_pri; + uint16_t queue; /**< Queue assigned to when match */ +}; + #ifdef __cplusplus } #endif From patchwork Sun Oct 18 14:09:04 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Rybchenko X-Patchwork-Id: 81265 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 2C99EA04B0; Sun, 18 Oct 2020 16:12:51 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 92B59E259; Sun, 18 Oct 2020 16:09:42 +0200 (CEST) Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [67.231.154.164]) by dpdk.org (Postfix) with ESMTP id 202F9C8B2 for ; Sun, 18 Oct 2020 16:09:28 +0200 (CEST) Received: from mx1-us1.ppe-hosted.com (unknown [10.110.50.144]) by dispatch1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id A740A20089; Sun, 18 Oct 2020 14:09:26 +0000 (UTC) Received: from us4-mdac16-52.at1.mdlocal (unknown [10.110.48.101]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id A59D6800A9; Sun, 18 Oct 2020 14:09:26 +0000 (UTC) X-Virus-Scanned: Proofpoint Essentials engine Received: from mx1-us1.ppe-hosted.com (unknown [10.110.50.12]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 13D004004D; Sun, 18 Oct 2020 14:09:26 +0000 (UTC) Received: from webmail.solarflare.com (uk.solarflare.com [193.34.186.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id CA2DA4005C; Sun, 18 Oct 2020 14:09:25 +0000 (UTC) Received: from ukex01.SolarFlarecom.com (10.17.10.4) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Sun, 18 Oct 2020 15:09:20 +0100 Received: from opal.uk.solarflarecom.com (10.17.10.1) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Sun, 18 Oct 2020 15:09:20 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (ukv-loginhost.uk.solarflarecom.com [10.17.10.39]) by opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id 09IE9KB8002044; Sun, 18 Oct 2020 15:09:20 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1]) by ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id B14131613A9; Sun, 18 Oct 2020 15:09:20 +0100 (BST) From: Andrew Rybchenko To: Wenzhuo Lu , Beilei Xing , Bernard Iremonger , Ray Kinsella , Neil Horman , Ajit Khaparde , Somnath Kotur , Jeff Guo , Haiyue Wang , "Rasesh Mody" , Shahed Shaikh , "Andrew Rybchenko" , Thomas Monjalon , Ferruh Yigit CC: Date: Sun, 18 Oct 2020 15:09:04 +0100 Message-ID: <1603030152-13451-8-git-send-email-arybchenko@solarflare.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1603030152-13451-1-git-send-email-arybchenko@solarflare.com> References: <1603030152-13451-1-git-send-email-arybchenko@solarflare.com> MIME-Version: 1.0 X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.6.1012-25732.003 X-TM-AS-Result: No-18.251100-8.000000-10 X-TMASE-MatchedRID: XpHeltYW/SBLf8kcbx2o6lXXOFXDx25iSkWlzdsmIx5jLp8Cm8vwFyXD Fxgit6TpPVa/URzklI8chiY3DrTHPa0iin8P0KjVPwKTD1v8YV5MkOX0UoduuVVkJxysad/IvKi 2zQpKIv+tvyJvLU8LEHTpRc4xb/RHch9Ny6YeeFJYe2qRI33KwzDoUQeQv/CPJ6OAoNQ9T6SKqV LAIrdxWkhaxeQ0ua6uZA2hMjGumYKTETGlAbL8c/9XRIMLUOjQoiKTb964zHVm3JRfoPI9scqmr em+KXPdr+86suMuKn71K0hpkcEoGNu9j/ba408t6GyDR2ZB+cai8D/o42y/Skp12IXZajx59lfc 7xDzRuiJ1t8M2zzvPK3+wuBya2BpOlhoODuWFvAUaS/iLVoC5sioJQie/DjpmHjEz2gByy3MIee h8/tuQxafOsBxPPR65wypf9vWg8Iq27VgxCeYdfgo8BKl9ae5a01mhnn7t6QELMPQNzyJSyvC34 sFimMjtI3VVXMQt012dcm1ZXCuwEPbYPqd/GaJFhmgoA99DoL8SjXSxldPUz8fBHJpFUzVyvFco BpD/5wpYtwcKJmmRkjKd8AzLWprEz6oGyKUmA7xWp8B+pjaLPf8ftp0B9+SVptCZRwLvQENP3Ix Zm6dZ4qBP3PVoiLLCB0to4GVFjXeyYs3+FVYBVH6kd/WWyJV3/sybDt23/6KS8s/FMqmOPEIlcH h1SaDqYB+kyCYtxSAMuqetGVetnyef22ep6XYkGUtrowrXLg= X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10--18.251100-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.6.1012-25732.003 X-MDID: 1603030166-NeU4gWdUiKgV X-PPE-DISP: 1603030166;NeU4gWdUiKgV Subject: [dpdk-dev] [PATCH 07/14] ethdev: remove legacy N-tuple filter type support X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" RTE flow API should be used for filtering. Preserve struct rte_eth_ntuple_filter in ethdev API since the structure and related defines are used in flow classify library and a number of drivers. Preserve RTE_ETH_FILTER_NTUPLE because of usage in drivers. Signed-off-by: Andrew Rybchenko Acked-by: Ajit Khaparde Acked-by: Haiyue Wang --- app/test-pmd/cmdline.c | 369 --------------------------- doc/guides/rel_notes/deprecation.rst | 2 +- drivers/net/bnxt/bnxt_ethdev.c | 245 ------------------ drivers/net/e1000/igb_ethdev.c | 130 +--------- drivers/net/ixgbe/ixgbe_ethdev.c | 101 -------- drivers/net/qede/qede_filter.c | 63 ----- drivers/net/sfc/sfc_ethdev.c | 3 - lib/librte_ethdev/rte_eth_ctrl.h | 3 +- 8 files changed, 3 insertions(+), 913 deletions(-) diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c index bf3fdd8609..1fdab5f026 100644 --- a/app/test-pmd/cmdline.c +++ b/app/test-pmd/cmdline.c @@ -976,20 +976,6 @@ static void cmd_help_long_parsed(void *parsed_result, "filters:\n" "--------\n\n" - "2tuple_filter (port_id) (add|del)" - " dst_port (dst_port_value) protocol (protocol_value)" - " mask (mask_value) tcp_flags (tcp_flags_value)" - " priority (prio_value) queue (queue_id)\n" - " Add/Del a 2tuple filter.\n\n" - - "5tuple_filter (port_id) (add|del)" - " dst_ip (dst_address) src_ip (src_address)" - " dst_port (dst_port_value) src_port (src_port_value)" - " protocol (protocol_value)" - " mask (mask_value) tcp_flags (tcp_flags_value)" - " priority (prio_value) queue (queue_id)\n" - " Add/Del a 5tuple filter.\n\n" - "flow_director_filter (port_id) mode IP (add|del|update)" " flow (ipv4-other|ipv4-frag|ipv6-other|ipv6-frag)" " src (src_ip_address) dst (dst_ip_address)" @@ -10421,359 +10407,6 @@ cmdline_parse_inst_t cmd_show_queue_region_info_all = { }, }; -/* *** ADD/REMOVE A 2tuple FILTER *** */ -struct cmd_2tuple_filter_result { - cmdline_fixed_string_t filter; - portid_t port_id; - cmdline_fixed_string_t ops; - cmdline_fixed_string_t dst_port; - uint16_t dst_port_value; - cmdline_fixed_string_t protocol; - uint8_t protocol_value; - cmdline_fixed_string_t mask; - uint8_t mask_value; - cmdline_fixed_string_t tcp_flags; - uint8_t tcp_flags_value; - cmdline_fixed_string_t priority; - uint8_t priority_value; - cmdline_fixed_string_t queue; - uint16_t queue_id; -}; - -static void -cmd_2tuple_filter_parsed(void *parsed_result, - __rte_unused struct cmdline *cl, - __rte_unused void *data) -{ - struct rte_eth_ntuple_filter filter; - struct cmd_2tuple_filter_result *res = parsed_result; - int ret = 0; - - ret = rte_eth_dev_filter_supported(res->port_id, RTE_ETH_FILTER_NTUPLE); - if (ret < 0) { - printf("ntuple filter is not supported on port %u.\n", - res->port_id); - return; - } - - memset(&filter, 0, sizeof(struct rte_eth_ntuple_filter)); - - filter.flags = RTE_2TUPLE_FLAGS; - filter.dst_port_mask = (res->mask_value & 0x02) ? UINT16_MAX : 0; - filter.proto_mask = (res->mask_value & 0x01) ? UINT8_MAX : 0; - filter.proto = res->protocol_value; - filter.priority = res->priority_value; - if (res->tcp_flags_value != 0 && filter.proto != IPPROTO_TCP) { - printf("nonzero tcp_flags is only meaningful" - " when protocol is TCP.\n"); - return; - } - if (res->tcp_flags_value > RTE_NTUPLE_TCP_FLAGS_MASK) { - printf("invalid TCP flags.\n"); - return; - } - - if (res->tcp_flags_value != 0) { - filter.flags |= RTE_NTUPLE_FLAGS_TCP_FLAG; - filter.tcp_flags = res->tcp_flags_value; - } - - /* need convert to big endian. */ - filter.dst_port = rte_cpu_to_be_16(res->dst_port_value); - filter.queue = res->queue_id; - - if (!strcmp(res->ops, "add")) - ret = rte_eth_dev_filter_ctrl(res->port_id, - RTE_ETH_FILTER_NTUPLE, - RTE_ETH_FILTER_ADD, - &filter); - else - ret = rte_eth_dev_filter_ctrl(res->port_id, - RTE_ETH_FILTER_NTUPLE, - RTE_ETH_FILTER_DELETE, - &filter); - if (ret < 0) - printf("2tuple filter programming error: (%s)\n", - strerror(-ret)); - -} - -cmdline_parse_token_string_t cmd_2tuple_filter_filter = - TOKEN_STRING_INITIALIZER(struct cmd_2tuple_filter_result, - filter, "2tuple_filter"); -cmdline_parse_token_num_t cmd_2tuple_filter_port_id = - TOKEN_NUM_INITIALIZER(struct cmd_2tuple_filter_result, - port_id, UINT16); -cmdline_parse_token_string_t cmd_2tuple_filter_ops = - TOKEN_STRING_INITIALIZER(struct cmd_2tuple_filter_result, - ops, "add#del"); -cmdline_parse_token_string_t cmd_2tuple_filter_dst_port = - TOKEN_STRING_INITIALIZER(struct cmd_2tuple_filter_result, - dst_port, "dst_port"); -cmdline_parse_token_num_t cmd_2tuple_filter_dst_port_value = - TOKEN_NUM_INITIALIZER(struct cmd_2tuple_filter_result, - dst_port_value, UINT16); -cmdline_parse_token_string_t cmd_2tuple_filter_protocol = - TOKEN_STRING_INITIALIZER(struct cmd_2tuple_filter_result, - protocol, "protocol"); -cmdline_parse_token_num_t cmd_2tuple_filter_protocol_value = - TOKEN_NUM_INITIALIZER(struct cmd_2tuple_filter_result, - protocol_value, UINT8); -cmdline_parse_token_string_t cmd_2tuple_filter_mask = - TOKEN_STRING_INITIALIZER(struct cmd_2tuple_filter_result, - mask, "mask"); -cmdline_parse_token_num_t cmd_2tuple_filter_mask_value = - TOKEN_NUM_INITIALIZER(struct cmd_2tuple_filter_result, - mask_value, INT8); -cmdline_parse_token_string_t cmd_2tuple_filter_tcp_flags = - TOKEN_STRING_INITIALIZER(struct cmd_2tuple_filter_result, - tcp_flags, "tcp_flags"); -cmdline_parse_token_num_t cmd_2tuple_filter_tcp_flags_value = - TOKEN_NUM_INITIALIZER(struct cmd_2tuple_filter_result, - tcp_flags_value, UINT8); -cmdline_parse_token_string_t cmd_2tuple_filter_priority = - TOKEN_STRING_INITIALIZER(struct cmd_2tuple_filter_result, - priority, "priority"); -cmdline_parse_token_num_t cmd_2tuple_filter_priority_value = - TOKEN_NUM_INITIALIZER(struct cmd_2tuple_filter_result, - priority_value, UINT8); -cmdline_parse_token_string_t cmd_2tuple_filter_queue = - TOKEN_STRING_INITIALIZER(struct cmd_2tuple_filter_result, - queue, "queue"); -cmdline_parse_token_num_t cmd_2tuple_filter_queue_id = - TOKEN_NUM_INITIALIZER(struct cmd_2tuple_filter_result, - queue_id, UINT16); - -cmdline_parse_inst_t cmd_2tuple_filter = { - .f = cmd_2tuple_filter_parsed, - .data = NULL, - .help_str = "2tuple_filter add|del dst_port protocol " - " mask tcp_flags priority queue " - ": Add a 2tuple filter", - .tokens = { - (void *)&cmd_2tuple_filter_filter, - (void *)&cmd_2tuple_filter_port_id, - (void *)&cmd_2tuple_filter_ops, - (void *)&cmd_2tuple_filter_dst_port, - (void *)&cmd_2tuple_filter_dst_port_value, - (void *)&cmd_2tuple_filter_protocol, - (void *)&cmd_2tuple_filter_protocol_value, - (void *)&cmd_2tuple_filter_mask, - (void *)&cmd_2tuple_filter_mask_value, - (void *)&cmd_2tuple_filter_tcp_flags, - (void *)&cmd_2tuple_filter_tcp_flags_value, - (void *)&cmd_2tuple_filter_priority, - (void *)&cmd_2tuple_filter_priority_value, - (void *)&cmd_2tuple_filter_queue, - (void *)&cmd_2tuple_filter_queue_id, - NULL, - }, -}; - -/* *** ADD/REMOVE A 5tuple FILTER *** */ -struct cmd_5tuple_filter_result { - cmdline_fixed_string_t filter; - portid_t port_id; - cmdline_fixed_string_t ops; - cmdline_fixed_string_t dst_ip; - cmdline_ipaddr_t dst_ip_value; - cmdline_fixed_string_t src_ip; - cmdline_ipaddr_t src_ip_value; - cmdline_fixed_string_t dst_port; - uint16_t dst_port_value; - cmdline_fixed_string_t src_port; - uint16_t src_port_value; - cmdline_fixed_string_t protocol; - uint8_t protocol_value; - cmdline_fixed_string_t mask; - uint8_t mask_value; - cmdline_fixed_string_t tcp_flags; - uint8_t tcp_flags_value; - cmdline_fixed_string_t priority; - uint8_t priority_value; - cmdline_fixed_string_t queue; - uint16_t queue_id; -}; - -static void -cmd_5tuple_filter_parsed(void *parsed_result, - __rte_unused struct cmdline *cl, - __rte_unused void *data) -{ - struct rte_eth_ntuple_filter filter; - struct cmd_5tuple_filter_result *res = parsed_result; - int ret = 0; - - ret = rte_eth_dev_filter_supported(res->port_id, RTE_ETH_FILTER_NTUPLE); - if (ret < 0) { - printf("ntuple filter is not supported on port %u.\n", - res->port_id); - return; - } - - memset(&filter, 0, sizeof(struct rte_eth_ntuple_filter)); - - filter.flags = RTE_5TUPLE_FLAGS; - filter.dst_ip_mask = (res->mask_value & 0x10) ? UINT32_MAX : 0; - filter.src_ip_mask = (res->mask_value & 0x08) ? UINT32_MAX : 0; - filter.dst_port_mask = (res->mask_value & 0x04) ? UINT16_MAX : 0; - filter.src_port_mask = (res->mask_value & 0x02) ? UINT16_MAX : 0; - filter.proto_mask = (res->mask_value & 0x01) ? UINT8_MAX : 0; - filter.proto = res->protocol_value; - filter.priority = res->priority_value; - if (res->tcp_flags_value != 0 && filter.proto != IPPROTO_TCP) { - printf("nonzero tcp_flags is only meaningful" - " when protocol is TCP.\n"); - return; - } - if (res->tcp_flags_value > RTE_NTUPLE_TCP_FLAGS_MASK) { - printf("invalid TCP flags.\n"); - return; - } - - if (res->tcp_flags_value != 0) { - filter.flags |= RTE_NTUPLE_FLAGS_TCP_FLAG; - filter.tcp_flags = res->tcp_flags_value; - } - - if (res->dst_ip_value.family == AF_INET) - /* no need to convert, already big endian. */ - filter.dst_ip = res->dst_ip_value.addr.ipv4.s_addr; - else { - if (filter.dst_ip_mask == 0) { - printf("can not support ipv6 involved compare.\n"); - return; - } - filter.dst_ip = 0; - } - - if (res->src_ip_value.family == AF_INET) - /* no need to convert, already big endian. */ - filter.src_ip = res->src_ip_value.addr.ipv4.s_addr; - else { - if (filter.src_ip_mask == 0) { - printf("can not support ipv6 involved compare.\n"); - return; - } - filter.src_ip = 0; - } - /* need convert to big endian. */ - filter.dst_port = rte_cpu_to_be_16(res->dst_port_value); - filter.src_port = rte_cpu_to_be_16(res->src_port_value); - filter.queue = res->queue_id; - - if (!strcmp(res->ops, "add")) - ret = rte_eth_dev_filter_ctrl(res->port_id, - RTE_ETH_FILTER_NTUPLE, - RTE_ETH_FILTER_ADD, - &filter); - else - ret = rte_eth_dev_filter_ctrl(res->port_id, - RTE_ETH_FILTER_NTUPLE, - RTE_ETH_FILTER_DELETE, - &filter); - if (ret < 0) - printf("5tuple filter programming error: (%s)\n", - strerror(-ret)); -} - -cmdline_parse_token_string_t cmd_5tuple_filter_filter = - TOKEN_STRING_INITIALIZER(struct cmd_5tuple_filter_result, - filter, "5tuple_filter"); -cmdline_parse_token_num_t cmd_5tuple_filter_port_id = - TOKEN_NUM_INITIALIZER(struct cmd_5tuple_filter_result, - port_id, UINT16); -cmdline_parse_token_string_t cmd_5tuple_filter_ops = - TOKEN_STRING_INITIALIZER(struct cmd_5tuple_filter_result, - ops, "add#del"); -cmdline_parse_token_string_t cmd_5tuple_filter_dst_ip = - TOKEN_STRING_INITIALIZER(struct cmd_5tuple_filter_result, - dst_ip, "dst_ip"); -cmdline_parse_token_ipaddr_t cmd_5tuple_filter_dst_ip_value = - TOKEN_IPADDR_INITIALIZER(struct cmd_5tuple_filter_result, - dst_ip_value); -cmdline_parse_token_string_t cmd_5tuple_filter_src_ip = - TOKEN_STRING_INITIALIZER(struct cmd_5tuple_filter_result, - src_ip, "src_ip"); -cmdline_parse_token_ipaddr_t cmd_5tuple_filter_src_ip_value = - TOKEN_IPADDR_INITIALIZER(struct cmd_5tuple_filter_result, - src_ip_value); -cmdline_parse_token_string_t cmd_5tuple_filter_dst_port = - TOKEN_STRING_INITIALIZER(struct cmd_5tuple_filter_result, - dst_port, "dst_port"); -cmdline_parse_token_num_t cmd_5tuple_filter_dst_port_value = - TOKEN_NUM_INITIALIZER(struct cmd_5tuple_filter_result, - dst_port_value, UINT16); -cmdline_parse_token_string_t cmd_5tuple_filter_src_port = - TOKEN_STRING_INITIALIZER(struct cmd_5tuple_filter_result, - src_port, "src_port"); -cmdline_parse_token_num_t cmd_5tuple_filter_src_port_value = - TOKEN_NUM_INITIALIZER(struct cmd_5tuple_filter_result, - src_port_value, UINT16); -cmdline_parse_token_string_t cmd_5tuple_filter_protocol = - TOKEN_STRING_INITIALIZER(struct cmd_5tuple_filter_result, - protocol, "protocol"); -cmdline_parse_token_num_t cmd_5tuple_filter_protocol_value = - TOKEN_NUM_INITIALIZER(struct cmd_5tuple_filter_result, - protocol_value, UINT8); -cmdline_parse_token_string_t cmd_5tuple_filter_mask = - TOKEN_STRING_INITIALIZER(struct cmd_5tuple_filter_result, - mask, "mask"); -cmdline_parse_token_num_t cmd_5tuple_filter_mask_value = - TOKEN_NUM_INITIALIZER(struct cmd_5tuple_filter_result, - mask_value, INT8); -cmdline_parse_token_string_t cmd_5tuple_filter_tcp_flags = - TOKEN_STRING_INITIALIZER(struct cmd_5tuple_filter_result, - tcp_flags, "tcp_flags"); -cmdline_parse_token_num_t cmd_5tuple_filter_tcp_flags_value = - TOKEN_NUM_INITIALIZER(struct cmd_5tuple_filter_result, - tcp_flags_value, UINT8); -cmdline_parse_token_string_t cmd_5tuple_filter_priority = - TOKEN_STRING_INITIALIZER(struct cmd_5tuple_filter_result, - priority, "priority"); -cmdline_parse_token_num_t cmd_5tuple_filter_priority_value = - TOKEN_NUM_INITIALIZER(struct cmd_5tuple_filter_result, - priority_value, UINT8); -cmdline_parse_token_string_t cmd_5tuple_filter_queue = - TOKEN_STRING_INITIALIZER(struct cmd_5tuple_filter_result, - queue, "queue"); -cmdline_parse_token_num_t cmd_5tuple_filter_queue_id = - TOKEN_NUM_INITIALIZER(struct cmd_5tuple_filter_result, - queue_id, UINT16); - -cmdline_parse_inst_t cmd_5tuple_filter = { - .f = cmd_5tuple_filter_parsed, - .data = NULL, - .help_str = "5tuple_filter add|del dst_ip " - "src_ip dst_port src_port " - "protocol mask tcp_flags " - "priority queue : Add/Del a 5tuple filter", - .tokens = { - (void *)&cmd_5tuple_filter_filter, - (void *)&cmd_5tuple_filter_port_id, - (void *)&cmd_5tuple_filter_ops, - (void *)&cmd_5tuple_filter_dst_ip, - (void *)&cmd_5tuple_filter_dst_ip_value, - (void *)&cmd_5tuple_filter_src_ip, - (void *)&cmd_5tuple_filter_src_ip_value, - (void *)&cmd_5tuple_filter_dst_port, - (void *)&cmd_5tuple_filter_dst_port_value, - (void *)&cmd_5tuple_filter_src_port, - (void *)&cmd_5tuple_filter_src_port_value, - (void *)&cmd_5tuple_filter_protocol, - (void *)&cmd_5tuple_filter_protocol_value, - (void *)&cmd_5tuple_filter_mask, - (void *)&cmd_5tuple_filter_mask_value, - (void *)&cmd_5tuple_filter_tcp_flags, - (void *)&cmd_5tuple_filter_tcp_flags_value, - (void *)&cmd_5tuple_filter_priority, - (void *)&cmd_5tuple_filter_priority_value, - (void *)&cmd_5tuple_filter_queue, - (void *)&cmd_5tuple_filter_queue_id, - NULL, - }, -}; - /* *** Filters Control *** */ /* *** deal with flow director filter *** */ @@ -19542,8 +19175,6 @@ cmdline_parse_ctx_t main_ctx[] = { (cmdline_parse_inst_t *)&cmd_config_rss_hash_key, (cmdline_parse_inst_t *)&cmd_dump, (cmdline_parse_inst_t *)&cmd_dump_one, - (cmdline_parse_inst_t *)&cmd_2tuple_filter, - (cmdline_parse_inst_t *)&cmd_5tuple_filter, (cmdline_parse_inst_t *)&cmd_add_del_ip_flow_director, (cmdline_parse_inst_t *)&cmd_add_del_udp_flow_director, (cmdline_parse_inst_t *)&cmd_add_del_sctp_flow_director, diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst index 8a7839152e..a531edc88c 100644 --- a/doc/guides/rel_notes/deprecation.rst +++ b/doc/guides/rel_notes/deprecation.rst @@ -108,7 +108,7 @@ Deprecation Notices * ethdev: the legacy filter API, including ``rte_eth_dev_filter_supported()``, ``rte_eth_dev_filter_ctrl()`` as well - as filter types NTUPLE, TUNNEL, FDIR, + as filter types TUNNEL, FDIR, HASH and L2_TUNNEL, is superseded by the generic flow API (rte_flow) in PMDs that implement the latter. The legacy API will be removed in DPDK 20.11. diff --git a/drivers/net/bnxt/bnxt_ethdev.c b/drivers/net/bnxt/bnxt_ethdev.c index 12bc3288e5..2de8d003d2 100644 --- a/drivers/net/bnxt/bnxt_ethdev.c +++ b/drivers/net/bnxt/bnxt_ethdev.c @@ -2987,248 +2987,6 @@ bnxt_tx_descriptor_status_op(void *tx_queue, uint16_t offset) return RTE_ETH_TX_DESC_FULL; } -static inline int -parse_ntuple_filter(struct bnxt *bp, - struct rte_eth_ntuple_filter *nfilter, - struct bnxt_filter_info *bfilter) -{ - uint32_t en = 0; - - if (nfilter->queue >= bp->rx_nr_rings) { - PMD_DRV_LOG(ERR, "Invalid queue %d\n", nfilter->queue); - return -EINVAL; - } - - switch (nfilter->dst_port_mask) { - case UINT16_MAX: - bfilter->dst_port_mask = -1; - bfilter->dst_port = nfilter->dst_port; - en |= NTUPLE_FLTR_ALLOC_INPUT_EN_DST_PORT | - NTUPLE_FLTR_ALLOC_INPUT_EN_DST_PORT_MASK; - break; - default: - PMD_DRV_LOG(ERR, "invalid dst_port mask."); - return -EINVAL; - } - - bfilter->ip_addr_type = NTUPLE_FLTR_ALLOC_INPUT_IP_ADDR_TYPE_IPV4; - en |= NTUPLE_FLTR_ALLOC_IN_EN_IP_PROTO; - - switch (nfilter->proto_mask) { - case UINT8_MAX: - if (nfilter->proto == 17) /* IPPROTO_UDP */ - bfilter->ip_protocol = 17; - else if (nfilter->proto == 6) /* IPPROTO_TCP */ - bfilter->ip_protocol = 6; - else - return -EINVAL; - en |= NTUPLE_FLTR_ALLOC_IN_EN_IP_PROTO; - break; - default: - PMD_DRV_LOG(ERR, "invalid protocol mask."); - return -EINVAL; - } - - switch (nfilter->dst_ip_mask) { - case UINT32_MAX: - bfilter->dst_ipaddr_mask[0] = -1; - bfilter->dst_ipaddr[0] = nfilter->dst_ip; - en |= NTUPLE_FLTR_ALLOC_INPUT_EN_DST_IPADDR | - NTUPLE_FLTR_ALLOC_INPUT_EN_DST_IPADDR_MASK; - break; - default: - PMD_DRV_LOG(ERR, "invalid dst_ip mask."); - return -EINVAL; - } - - switch (nfilter->src_ip_mask) { - case UINT32_MAX: - bfilter->src_ipaddr_mask[0] = -1; - bfilter->src_ipaddr[0] = nfilter->src_ip; - en |= NTUPLE_FLTR_ALLOC_INPUT_EN_SRC_IPADDR | - NTUPLE_FLTR_ALLOC_INPUT_EN_SRC_IPADDR_MASK; - break; - default: - PMD_DRV_LOG(ERR, "invalid src_ip mask."); - return -EINVAL; - } - - switch (nfilter->src_port_mask) { - case UINT16_MAX: - bfilter->src_port_mask = -1; - bfilter->src_port = nfilter->src_port; - en |= NTUPLE_FLTR_ALLOC_INPUT_EN_SRC_PORT | - NTUPLE_FLTR_ALLOC_INPUT_EN_SRC_PORT_MASK; - break; - default: - PMD_DRV_LOG(ERR, "invalid src_port mask."); - return -EINVAL; - } - - bfilter->enables = en; - return 0; -} - -static struct bnxt_filter_info* -bnxt_match_ntuple_filter(struct bnxt *bp, - struct bnxt_filter_info *bfilter, - struct bnxt_vnic_info **mvnic) -{ - struct bnxt_filter_info *mfilter = NULL; - int i; - - for (i = bp->nr_vnics - 1; i >= 0; i--) { - struct bnxt_vnic_info *vnic = &bp->vnic_info[i]; - STAILQ_FOREACH(mfilter, &vnic->filter, next) { - if (bfilter->src_ipaddr[0] == mfilter->src_ipaddr[0] && - bfilter->src_ipaddr_mask[0] == - mfilter->src_ipaddr_mask[0] && - bfilter->src_port == mfilter->src_port && - bfilter->src_port_mask == mfilter->src_port_mask && - bfilter->dst_ipaddr[0] == mfilter->dst_ipaddr[0] && - bfilter->dst_ipaddr_mask[0] == - mfilter->dst_ipaddr_mask[0] && - bfilter->dst_port == mfilter->dst_port && - bfilter->dst_port_mask == mfilter->dst_port_mask && - bfilter->flags == mfilter->flags && - bfilter->enables == mfilter->enables) { - if (mvnic) - *mvnic = vnic; - return mfilter; - } - } - } - return NULL; -} - -static int -bnxt_cfg_ntuple_filter(struct bnxt *bp, - struct rte_eth_ntuple_filter *nfilter, - enum rte_filter_op filter_op) -{ - struct bnxt_filter_info *bfilter, *mfilter, *filter1; - struct bnxt_vnic_info *vnic, *vnic0, *mvnic; - int ret; - - if (nfilter->flags != RTE_5TUPLE_FLAGS) { - PMD_DRV_LOG(ERR, "only 5tuple is supported."); - return -EINVAL; - } - - if (nfilter->flags & RTE_NTUPLE_FLAGS_TCP_FLAG) { - PMD_DRV_LOG(ERR, "Ntuple filter: TCP flags not supported\n"); - return -EINVAL; - } - - bfilter = bnxt_get_unused_filter(bp); - if (bfilter == NULL) { - PMD_DRV_LOG(ERR, - "Not enough resources for a new filter.\n"); - return -ENOMEM; - } - ret = parse_ntuple_filter(bp, nfilter, bfilter); - if (ret < 0) - goto free_filter; - - vnic = &bp->vnic_info[nfilter->queue]; - vnic0 = BNXT_GET_DEFAULT_VNIC(bp); - filter1 = STAILQ_FIRST(&vnic0->filter); - if (filter1 == NULL) { - ret = -EINVAL; - goto free_filter; - } - - bfilter->dst_id = vnic->fw_vnic_id; - bfilter->fw_l2_filter_id = filter1->fw_l2_filter_id; - bfilter->enables |= - HWRM_CFA_NTUPLE_FILTER_ALLOC_INPUT_ENABLES_L2_FILTER_ID; - bfilter->ethertype = 0x800; - bfilter->enables |= NTUPLE_FLTR_ALLOC_INPUT_EN_ETHERTYPE; - - mfilter = bnxt_match_ntuple_filter(bp, bfilter, &mvnic); - - if (mfilter != NULL && filter_op == RTE_ETH_FILTER_ADD && - bfilter->dst_id == mfilter->dst_id) { - PMD_DRV_LOG(ERR, "filter exists.\n"); - ret = -EEXIST; - goto free_filter; - } else if (mfilter != NULL && filter_op == RTE_ETH_FILTER_ADD && - bfilter->dst_id != mfilter->dst_id) { - mfilter->dst_id = vnic->fw_vnic_id; - ret = bnxt_hwrm_set_ntuple_filter(bp, mfilter->dst_id, mfilter); - STAILQ_REMOVE(&mvnic->filter, mfilter, bnxt_filter_info, next); - STAILQ_INSERT_TAIL(&vnic->filter, mfilter, next); - PMD_DRV_LOG(ERR, "filter with matching pattern exists.\n"); - PMD_DRV_LOG(ERR, " Updated it to the new destination queue\n"); - goto free_filter; - } - if (mfilter == NULL && filter_op == RTE_ETH_FILTER_DELETE) { - PMD_DRV_LOG(ERR, "filter doesn't exist."); - ret = -ENOENT; - goto free_filter; - } - - if (filter_op == RTE_ETH_FILTER_ADD) { - bfilter->filter_type = HWRM_CFA_NTUPLE_FILTER; - ret = bnxt_hwrm_set_ntuple_filter(bp, bfilter->dst_id, bfilter); - if (ret) - goto free_filter; - STAILQ_INSERT_TAIL(&vnic->filter, bfilter, next); - } else { - if (mfilter == NULL) { - /* This should not happen. But for Coverity! */ - ret = -ENOENT; - goto free_filter; - } - ret = bnxt_hwrm_clear_ntuple_filter(bp, mfilter); - - STAILQ_REMOVE(&vnic->filter, mfilter, bnxt_filter_info, next); - bnxt_free_filter(bp, mfilter); - bnxt_free_filter(bp, bfilter); - } - - return 0; -free_filter: - bnxt_free_filter(bp, bfilter); - return ret; -} - -static int -bnxt_ntuple_filter(struct rte_eth_dev *dev, - enum rte_filter_op filter_op, - void *arg) -{ - struct bnxt *bp = dev->data->dev_private; - int ret; - - if (filter_op == RTE_ETH_FILTER_NOP) - return 0; - - if (arg == NULL) { - PMD_DRV_LOG(ERR, "arg shouldn't be NULL for operation %u.", - filter_op); - return -EINVAL; - } - - switch (filter_op) { - case RTE_ETH_FILTER_ADD: - ret = bnxt_cfg_ntuple_filter(bp, - (struct rte_eth_ntuple_filter *)arg, - filter_op); - break; - case RTE_ETH_FILTER_DELETE: - ret = bnxt_cfg_ntuple_filter(bp, - (struct rte_eth_ntuple_filter *)arg, - filter_op); - break; - default: - PMD_DRV_LOG(ERR, "unsupported operation %u.", filter_op); - ret = -EINVAL; - break; - } - return ret; -} - static int bnxt_parse_fdir_filter(struct bnxt *bp, struct rte_eth_fdir_filter *fdir, @@ -3658,9 +3416,6 @@ bnxt_filter_ctrl_op(struct rte_eth_dev *dev, case RTE_ETH_FILTER_FDIR: ret = bnxt_fdir_filter(dev, filter_op, arg); break; - case RTE_ETH_FILTER_NTUPLE: - ret = bnxt_ntuple_filter(dev, filter_op, arg); - break; case RTE_ETH_FILTER_GENERIC: if (filter_op != RTE_ETH_FILTER_GET) return -EINVAL; diff --git a/drivers/net/e1000/igb_ethdev.c b/drivers/net/e1000/igb_ethdev.c index 7e2c77d356..647aa8d995 100644 --- a/drivers/net/e1000/igb_ethdev.c +++ b/drivers/net/e1000/igb_ethdev.c @@ -194,11 +194,6 @@ static int igb_add_5tuple_filter_82576(struct rte_eth_dev *dev, struct rte_eth_ntuple_filter *ntuple_filter); static int igb_remove_5tuple_filter_82576(struct rte_eth_dev *dev, struct rte_eth_ntuple_filter *ntuple_filter); -static int igb_get_ntuple_filter(struct rte_eth_dev *dev, - struct rte_eth_ntuple_filter *filter); -static int igb_ntuple_filter_handle(struct rte_eth_dev *dev, - enum rte_filter_op filter_op, - void *arg); static int eth_igb_filter_ctrl(struct rte_eth_dev *dev, enum rte_filter_type filter_type, enum rte_filter_op filter_op, @@ -4445,126 +4440,6 @@ igb_add_del_ntuple_filter(struct rte_eth_dev *dev, return ret; } -/* - * igb_get_ntuple_filter - get a ntuple filter - * - * @param - * dev: Pointer to struct rte_eth_dev. - * ntuple_filter: Pointer to struct rte_eth_ntuple_filter - * - * @return - * - On success, zero. - * - On failure, a negative value. - */ -static int -igb_get_ntuple_filter(struct rte_eth_dev *dev, - struct rte_eth_ntuple_filter *ntuple_filter) -{ - struct e1000_hw *hw = E1000_DEV_PRIVATE_TO_HW(dev->data->dev_private); - struct e1000_filter_info *filter_info = - E1000_DEV_PRIVATE_TO_FILTER_INFO(dev->data->dev_private); - struct e1000_5tuple_filter_info filter_5tuple; - struct e1000_2tuple_filter_info filter_2tuple; - struct e1000_5tuple_filter *p_5tuple_filter; - struct e1000_2tuple_filter *p_2tuple_filter; - int ret; - - switch (ntuple_filter->flags) { - case RTE_5TUPLE_FLAGS: - case (RTE_5TUPLE_FLAGS | RTE_NTUPLE_FLAGS_TCP_FLAG): - if (hw->mac.type != e1000_82576) - return -ENOTSUP; - memset(&filter_5tuple, - 0, - sizeof(struct e1000_5tuple_filter_info)); - ret = ntuple_filter_to_5tuple_82576(ntuple_filter, - &filter_5tuple); - if (ret < 0) - return ret; - p_5tuple_filter = igb_5tuple_filter_lookup_82576( - &filter_info->fivetuple_list, - &filter_5tuple); - if (p_5tuple_filter == NULL) { - PMD_DRV_LOG(ERR, "filter doesn't exist."); - return -ENOENT; - } - ntuple_filter->queue = p_5tuple_filter->queue; - break; - case RTE_2TUPLE_FLAGS: - case (RTE_2TUPLE_FLAGS | RTE_NTUPLE_FLAGS_TCP_FLAG): - if (hw->mac.type != e1000_82580 && hw->mac.type != e1000_i350) - return -ENOTSUP; - memset(&filter_2tuple, - 0, - sizeof(struct e1000_2tuple_filter_info)); - ret = ntuple_filter_to_2tuple(ntuple_filter, &filter_2tuple); - if (ret < 0) - return ret; - p_2tuple_filter = igb_2tuple_filter_lookup( - &filter_info->twotuple_list, - &filter_2tuple); - if (p_2tuple_filter == NULL) { - PMD_DRV_LOG(ERR, "filter doesn't exist."); - return -ENOENT; - } - ntuple_filter->queue = p_2tuple_filter->queue; - break; - default: - ret = -EINVAL; - break; - } - - return 0; -} - -/* - * igb_ntuple_filter_handle - Handle operations for ntuple filter. - * @dev: pointer to rte_eth_dev structure - * @filter_op:operation will be taken. - * @arg: a pointer to specific structure corresponding to the filter_op - */ -static int -igb_ntuple_filter_handle(struct rte_eth_dev *dev, - enum rte_filter_op filter_op, - void *arg) -{ - struct e1000_hw *hw = E1000_DEV_PRIVATE_TO_HW(dev->data->dev_private); - int ret; - - MAC_TYPE_FILTER_SUP(hw->mac.type); - - if (filter_op == RTE_ETH_FILTER_NOP) - return 0; - - if (arg == NULL) { - PMD_DRV_LOG(ERR, "arg shouldn't be NULL for operation %u.", - filter_op); - return -EINVAL; - } - - switch (filter_op) { - case RTE_ETH_FILTER_ADD: - ret = igb_add_del_ntuple_filter(dev, - (struct rte_eth_ntuple_filter *)arg, - TRUE); - break; - case RTE_ETH_FILTER_DELETE: - ret = igb_add_del_ntuple_filter(dev, - (struct rte_eth_ntuple_filter *)arg, - FALSE); - break; - case RTE_ETH_FILTER_GET: - ret = igb_get_ntuple_filter(dev, - (struct rte_eth_ntuple_filter *)arg); - break; - default: - PMD_DRV_LOG(ERR, "unsupported operation %u.", filter_op); - ret = -EINVAL; - break; - } - return ret; -} - static inline int igb_ethertype_filter_lookup(struct e1000_filter_info *filter_info, uint16_t ethertype) @@ -4670,7 +4545,7 @@ igb_add_del_ethertype_filter(struct rte_eth_dev *dev, } static int -eth_igb_filter_ctrl(struct rte_eth_dev *dev, +eth_igb_filter_ctrl(struct rte_eth_dev *dev __rte_unused, enum rte_filter_type filter_type, enum rte_filter_op filter_op, void *arg) @@ -4678,9 +4553,6 @@ eth_igb_filter_ctrl(struct rte_eth_dev *dev, int ret = 0; switch (filter_type) { - case RTE_ETH_FILTER_NTUPLE: - ret = igb_ntuple_filter_handle(dev, filter_op, arg); - break; case RTE_ETH_FILTER_GENERIC: if (filter_op != RTE_ETH_FILTER_GET) return -EINVAL; diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c index f75725b433..8c02c0c859 100644 --- a/drivers/net/ixgbe/ixgbe_ethdev.c +++ b/drivers/net/ixgbe/ixgbe_ethdev.c @@ -304,11 +304,6 @@ static int ixgbe_add_5tuple_filter(struct rte_eth_dev *dev, struct ixgbe_5tuple_filter *filter); static void ixgbe_remove_5tuple_filter(struct rte_eth_dev *dev, struct ixgbe_5tuple_filter *filter); -static int ixgbe_ntuple_filter_handle(struct rte_eth_dev *dev, - enum rte_filter_op filter_op, - void *arg); -static int ixgbe_get_ntuple_filter(struct rte_eth_dev *dev, - struct rte_eth_ntuple_filter *filter); static int ixgbe_dev_filter_ctrl(struct rte_eth_dev *dev, enum rte_filter_type filter_type, enum rte_filter_op filter_op, @@ -6732,99 +6727,6 @@ ixgbe_add_del_ntuple_filter(struct rte_eth_dev *dev, return 0; } -/* - * get a ntuple filter - * - * @param - * dev: Pointer to struct rte_eth_dev. - * ntuple_filter: Pointer to struct rte_eth_ntuple_filter - * - * @return - * - On success, zero. - * - On failure, a negative value. - */ -static int -ixgbe_get_ntuple_filter(struct rte_eth_dev *dev, - struct rte_eth_ntuple_filter *ntuple_filter) -{ - struct ixgbe_filter_info *filter_info = - IXGBE_DEV_PRIVATE_TO_FILTER_INFO(dev->data->dev_private); - struct ixgbe_5tuple_filter_info filter_5tuple; - struct ixgbe_5tuple_filter *filter; - int ret; - - if (ntuple_filter->flags != RTE_5TUPLE_FLAGS) { - PMD_DRV_LOG(ERR, "only 5tuple is supported."); - return -EINVAL; - } - - memset(&filter_5tuple, 0, sizeof(struct ixgbe_5tuple_filter_info)); - ret = ntuple_filter_to_5tuple(ntuple_filter, &filter_5tuple); - if (ret < 0) - return ret; - - filter = ixgbe_5tuple_filter_lookup(&filter_info->fivetuple_list, - &filter_5tuple); - if (filter == NULL) { - PMD_DRV_LOG(ERR, "filter doesn't exist."); - return -ENOENT; - } - ntuple_filter->queue = filter->queue; - return 0; -} - -/* - * ixgbe_ntuple_filter_handle - Handle operations for ntuple filter. - * @dev: pointer to rte_eth_dev structure - * @filter_op:operation will be taken. - * @arg: a pointer to specific structure corresponding to the filter_op - * - * @return - * - On success, zero. - * - On failure, a negative value. - */ -static int -ixgbe_ntuple_filter_handle(struct rte_eth_dev *dev, - enum rte_filter_op filter_op, - void *arg) -{ - struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private); - int ret; - - MAC_TYPE_FILTER_SUP_EXT(hw->mac.type); - - if (filter_op == RTE_ETH_FILTER_NOP) - return 0; - - if (arg == NULL) { - PMD_DRV_LOG(ERR, "arg shouldn't be NULL for operation %u.", - filter_op); - return -EINVAL; - } - - switch (filter_op) { - case RTE_ETH_FILTER_ADD: - ret = ixgbe_add_del_ntuple_filter(dev, - (struct rte_eth_ntuple_filter *)arg, - TRUE); - break; - case RTE_ETH_FILTER_DELETE: - ret = ixgbe_add_del_ntuple_filter(dev, - (struct rte_eth_ntuple_filter *)arg, - FALSE); - break; - case RTE_ETH_FILTER_GET: - ret = ixgbe_get_ntuple_filter(dev, - (struct rte_eth_ntuple_filter *)arg); - break; - default: - PMD_DRV_LOG(ERR, "unsupported operation %u.", filter_op); - ret = -EINVAL; - break; - } - return ret; -} - int ixgbe_add_del_ethertype_filter(struct rte_eth_dev *dev, struct rte_eth_ethertype_filter *filter, @@ -6908,9 +6810,6 @@ ixgbe_dev_filter_ctrl(struct rte_eth_dev *dev, int ret = 0; switch (filter_type) { - case RTE_ETH_FILTER_NTUPLE: - ret = ixgbe_ntuple_filter_handle(dev, filter_op, arg); - break; case RTE_ETH_FILTER_FDIR: ret = ixgbe_fdir_ctrl_func(dev, filter_op, arg); break; diff --git a/drivers/net/qede/qede_filter.c b/drivers/net/qede/qede_filter.c index f3da5ecd92..0c47407edd 100644 --- a/drivers/net/qede/qede_filter.c +++ b/drivers/net/qede/qede_filter.c @@ -590,67 +590,6 @@ qede_fdir_filter_conf(struct rte_eth_dev *eth_dev, return ret; } -int qede_ntuple_filter_conf(struct rte_eth_dev *eth_dev, - enum rte_filter_op filter_op, - void *arg) -{ - struct qede_dev *qdev = QEDE_INIT_QDEV(eth_dev); - struct ecore_dev *edev = QEDE_INIT_EDEV(qdev); - struct rte_eth_ntuple_filter *ntuple; - struct rte_eth_fdir_filter fdir_entry; - struct rte_eth_tcpv4_flow *tcpv4_flow; - struct rte_eth_udpv4_flow *udpv4_flow; - bool add = false; - - switch (filter_op) { - case RTE_ETH_FILTER_NOP: - /* Typically used to query fdir support */ - if (ECORE_IS_CMT(edev)) { - DP_ERR(edev, "flowdir is not supported in 100G mode\n"); - return -ENOTSUP; - } - return 0; /* means supported */ - case RTE_ETH_FILTER_ADD: - add = true; - break; - case RTE_ETH_FILTER_DELETE: - break; - case RTE_ETH_FILTER_INFO: - case RTE_ETH_FILTER_GET: - case RTE_ETH_FILTER_UPDATE: - case RTE_ETH_FILTER_FLUSH: - case RTE_ETH_FILTER_SET: - case RTE_ETH_FILTER_STATS: - case RTE_ETH_FILTER_OP_MAX: - DP_ERR(edev, "Unsupported filter_op %d\n", filter_op); - return -ENOTSUP; - } - ntuple = (struct rte_eth_ntuple_filter *)arg; - /* Internally convert ntuple to fdir entry */ - memset(&fdir_entry, 0, sizeof(fdir_entry)); - if (ntuple->proto == IPPROTO_TCP) { - fdir_entry.input.flow_type = RTE_ETH_FLOW_NONFRAG_IPV4_TCP; - tcpv4_flow = &fdir_entry.input.flow.tcp4_flow; - tcpv4_flow->ip.src_ip = ntuple->src_ip; - tcpv4_flow->ip.dst_ip = ntuple->dst_ip; - tcpv4_flow->ip.proto = IPPROTO_TCP; - tcpv4_flow->src_port = ntuple->src_port; - tcpv4_flow->dst_port = ntuple->dst_port; - } else { - fdir_entry.input.flow_type = RTE_ETH_FLOW_NONFRAG_IPV4_UDP; - udpv4_flow = &fdir_entry.input.flow.udp4_flow; - udpv4_flow->ip.src_ip = ntuple->src_ip; - udpv4_flow->ip.dst_ip = ntuple->dst_ip; - udpv4_flow->ip.proto = IPPROTO_TCP; - udpv4_flow->src_port = ntuple->src_port; - udpv4_flow->dst_port = ntuple->dst_port; - } - - fdir_entry.action.rx_queue = ntuple->queue; - - return qede_config_cmn_fdir_filter(eth_dev, &fdir_entry, add); -} - static int qede_tunnel_update(struct qede_dev *qdev, struct ecore_tunnel_info *tunn_info) @@ -1548,8 +1487,6 @@ int qede_dev_filter_ctrl(struct rte_eth_dev *eth_dev, break; case RTE_ETH_FILTER_FDIR: return qede_fdir_filter_conf(eth_dev, filter_op, arg); - case RTE_ETH_FILTER_NTUPLE: - return qede_ntuple_filter_conf(eth_dev, filter_op, arg); case RTE_ETH_FILTER_GENERIC: if (ECORE_IS_CMT(edev)) { DP_ERR(edev, "flowdir is not supported in 100G mode\n"); diff --git a/drivers/net/sfc/sfc_ethdev.c b/drivers/net/sfc/sfc_ethdev.c index 13f4355cf1..4291a932e8 100644 --- a/drivers/net/sfc/sfc_ethdev.c +++ b/drivers/net/sfc/sfc_ethdev.c @@ -1748,9 +1748,6 @@ sfc_dev_filter_ctrl(struct rte_eth_dev *dev, enum rte_filter_type filter_type, case RTE_ETH_FILTER_NONE: sfc_err(sa, "Global filters configuration not supported"); break; - case RTE_ETH_FILTER_NTUPLE: - sfc_err(sa, "NTUPLE filters not supported"); - break; case RTE_ETH_FILTER_TUNNEL: sfc_err(sa, "Tunnel filters not supported"); break; diff --git a/lib/librte_ethdev/rte_eth_ctrl.h b/lib/librte_ethdev/rte_eth_ctrl.h index 48515818dd..b4cc163e3e 100644 --- a/lib/librte_ethdev/rte_eth_ctrl.h +++ b/lib/librte_ethdev/rte_eth_ctrl.h @@ -82,8 +82,7 @@ enum rte_filter_op { /** * A structure used to define the ntuple filter entry - * to support RTE_ETH_FILTER_NTUPLE with RTE_ETH_FILTER_ADD, - * RTE_ETH_FILTER_DELETE and RTE_ETH_FILTER_GET operations. + * to support RTE_ETH_FILTER_NTUPLE data representation. */ struct rte_eth_ntuple_filter { uint16_t flags; /**< Flags from RTE_NTUPLE_FLAGS_* */ From patchwork Sun Oct 18 14:09:05 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Rybchenko X-Patchwork-Id: 81264 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id F00B0A04B0; Sun, 18 Oct 2020 16:12:22 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 09966E252; Sun, 18 Oct 2020 16:09:41 +0200 (CEST) Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [67.231.154.164]) by dpdk.org (Postfix) with ESMTP id 005F8C87C for ; Sun, 18 Oct 2020 16:09:28 +0200 (CEST) Received: from mx1-us1.ppe-hosted.com (unknown [10.110.50.150]) by dispatch1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 9EA8720051; Sun, 18 Oct 2020 14:09:27 +0000 (UTC) Received: from us4-mdac16-75.at1.mdlocal (unknown [10.110.50.193]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 9CA87800A3; Sun, 18 Oct 2020 14:09:27 +0000 (UTC) X-Virus-Scanned: Proofpoint Essentials engine Received: from mx1-us1.ppe-hosted.com (unknown [10.110.50.12]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 0314D100061; Sun, 18 Oct 2020 14:09:27 +0000 (UTC) Received: from webmail.solarflare.com (uk.solarflare.com [193.34.186.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id BCBEB4005C; Sun, 18 Oct 2020 14:09:26 +0000 (UTC) Received: from ukex01.SolarFlarecom.com (10.17.10.4) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Sun, 18 Oct 2020 15:09:21 +0100 Received: from opal.uk.solarflarecom.com (10.17.10.1) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Sun, 18 Oct 2020 15:09:21 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (ukv-loginhost.uk.solarflarecom.com [10.17.10.39]) by opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id 09IE9Lig002047; Sun, 18 Oct 2020 15:09:21 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1]) by ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id 3A6B41613A9; Sun, 18 Oct 2020 15:09:21 +0100 (BST) From: Andrew Rybchenko To: Wenzhuo Lu , Beilei Xing , Bernard Iremonger , Ray Kinsella , Neil Horman , Ajit Khaparde , Somnath Kotur , Jeff Guo , Rasesh Mody , Shahed Shaikh , Andrew Rybchenko CC: , Xiaoyun Li Date: Sun, 18 Oct 2020 15:09:05 +0100 Message-ID: <1603030152-13451-9-git-send-email-arybchenko@solarflare.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1603030152-13451-1-git-send-email-arybchenko@solarflare.com> References: <1603030152-13451-1-git-send-email-arybchenko@solarflare.com> MIME-Version: 1.0 X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.6.1012-25732.003 X-TM-AS-Result: No-11.490000-8.000000-10 X-TMASE-MatchedRID: kgEe5pn284JLf8kcbx2o6lXXOFXDx25iSkWlzdsmIx5jLp8Cm8vwF0ri 9oQp5XF6osFQy9uDlP7YLqzgafDsrTJ/6aMoV+FcuwdUMMznEA8/pOSL72dTfwdkFovAReUoaUX s6FguVy0UXnr/BQqsZEiW+eLSpgc65oNh+BxQ5PcHtOpEBhWiFvsC34Cf26jz9C4tEnGKiglDUT XNni4d0Yeg4D3JiXSWIpdLXGaTzImTETGlAbL8c+hsg0dmQfnGi/zKFHcBv/tKddiF2Wo8eWJWF nowaxyuEStMa8vBrqXv63xzgkJ85NSC71OphuwhoS0guoV6SZcv1a8dwx1BPg6QlBHhBZuwiQgg 6ptHkXsKa+KeKWIfykPf84RWpc/0DCED/Oc5L9vM0ihsfYPMYYHLFWR93Tgk95rCkndYOMUPsPh a9EbuwotumReUJExVtz9kIuTkBq6BvVdJKkNrkM36paW7ZnFodGR9C0tIqI8jRiu1AuxJTCvC34 sFimMjuwMkv49NTOKJUifjIfMJmVZ4zYLYihwU52cbj4/WmPsApu/OILCbuKjxqhyDxmYjHixCZ q+8CAb1bg7EBCvXoSxRIuuPqEt+ckEqwYLs6GxPs79gcmEg0A+jS+LRpl81CXjDiV/HPZxnLmOI seD6ChjaKRfVKer8tZuOYSpvpWTz/70zBS4Wi5U7Bltw5qVL8boZEVitthjaUlKGidjD+/XxsNZ 0PeU/3Mb6qXoihXCHEeMTfR0Cex8TzIzimOwPbdTuPa9VRGvEQdG7H66TyH4gKq42LRYkKa0eni AHMpjexxz3/eTI3w8jR1mSiiLUXS+279/B9ml+3BndfXUhXQ== X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10--11.490000-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.6.1012-25732.003 X-MDID: 1603030167-N6gtww9YQHRl X-PPE-DISP: 1603030167;N6gtww9YQHRl Subject: [dpdk-dev] [PATCH 08/14] ethdev: remove legacy TUNNEL filter type support X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" RTE flow API should be used for filtering. Preserve struct rte_eth_ntuple_filter in ethdev API since the structure and related defines are used in flow classify library and a number of drivers. Preserve RTE_ETH_FILTER_TUNNEL because of usage in drivers. What to do with examples/tep_termination? Signed-off-by: Andrew Rybchenko Acked-by: Ajit Khaparde --- app/test-pmd/cmdline.c | 162 ----------------- doc/guides/rel_notes/deprecation.rst | 2 +- drivers/net/bnxt/bnxt_ethdev.c | 4 - drivers/net/i40e/i40e_ethdev.c | 210 ---------------------- drivers/net/qede/qede_filter.c | 257 --------------------------- drivers/net/sfc/sfc_ethdev.c | 3 - 6 files changed, 1 insertion(+), 637 deletions(-) diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c index 1fdab5f026..f7169c7b9e 100644 --- a/app/test-pmd/cmdline.c +++ b/app/test-pmd/cmdline.c @@ -408,16 +408,6 @@ static void cmd_help_long_parsed(void *parsed_result, " Remove a vlan_id, to the set of VLAN identifiers" "filtered for VF(s) from port_id.\n\n" - "tunnel_filter add (port_id) (outer_mac) (inner_mac) (ip_addr) " - "(inner_vlan) (vxlan|nvgre|ipingre|vxlan-gpe) (imac-ivlan|imac-ivlan-tenid|" - "imac-tenid|imac|omac-imac-tenid|oip|iip) (tenant_id) (queue_id)\n" - " add a tunnel filter of a port.\n\n" - - "tunnel_filter rm (port_id) (outer_mac) (inner_mac) (ip_addr) " - "(inner_vlan) (vxlan|nvgre|ipingre|vxlan-gpe) (imac-ivlan|imac-ivlan-tenid|" - "imac-tenid|imac|omac-imac-tenid|oip|iip) (tenant_id) (queue_id)\n" - " remove a tunnel filter of a port.\n\n" - "rx_vxlan_port add (udp_port) (port_id)\n" " Add an UDP port for VXLAN packet filter on a port\n\n" @@ -9195,157 +9185,6 @@ cmdline_parse_inst_t cmd_vf_rate_limit = { }, }; -/* *** ADD TUNNEL FILTER OF A PORT *** */ -struct cmd_tunnel_filter_result { - cmdline_fixed_string_t cmd; - cmdline_fixed_string_t what; - portid_t port_id; - struct rte_ether_addr outer_mac; - struct rte_ether_addr inner_mac; - cmdline_ipaddr_t ip_value; - uint16_t inner_vlan; - cmdline_fixed_string_t tunnel_type; - cmdline_fixed_string_t filter_type; - uint32_t tenant_id; - uint16_t queue_num; -}; - -static void -cmd_tunnel_filter_parsed(void *parsed_result, - __rte_unused struct cmdline *cl, - __rte_unused void *data) -{ - struct cmd_tunnel_filter_result *res = parsed_result; - struct rte_eth_tunnel_filter_conf tunnel_filter_conf; - int ret = 0; - - memset(&tunnel_filter_conf, 0, sizeof(tunnel_filter_conf)); - - rte_ether_addr_copy(&res->outer_mac, &tunnel_filter_conf.outer_mac); - rte_ether_addr_copy(&res->inner_mac, &tunnel_filter_conf.inner_mac); - tunnel_filter_conf.inner_vlan = res->inner_vlan; - - if (res->ip_value.family == AF_INET) { - tunnel_filter_conf.ip_addr.ipv4_addr = - res->ip_value.addr.ipv4.s_addr; - tunnel_filter_conf.ip_type = RTE_TUNNEL_IPTYPE_IPV4; - } else { - memcpy(&(tunnel_filter_conf.ip_addr.ipv6_addr), - &(res->ip_value.addr.ipv6), - sizeof(struct in6_addr)); - tunnel_filter_conf.ip_type = RTE_TUNNEL_IPTYPE_IPV6; - } - - if (!strcmp(res->filter_type, "imac-ivlan")) - tunnel_filter_conf.filter_type = RTE_TUNNEL_FILTER_IMAC_IVLAN; - else if (!strcmp(res->filter_type, "imac-ivlan-tenid")) - tunnel_filter_conf.filter_type = - RTE_TUNNEL_FILTER_IMAC_IVLAN_TENID; - else if (!strcmp(res->filter_type, "imac-tenid")) - tunnel_filter_conf.filter_type = RTE_TUNNEL_FILTER_IMAC_TENID; - else if (!strcmp(res->filter_type, "imac")) - tunnel_filter_conf.filter_type = ETH_TUNNEL_FILTER_IMAC; - else if (!strcmp(res->filter_type, "omac-imac-tenid")) - tunnel_filter_conf.filter_type = - RTE_TUNNEL_FILTER_OMAC_TENID_IMAC; - else if (!strcmp(res->filter_type, "oip")) - tunnel_filter_conf.filter_type = ETH_TUNNEL_FILTER_OIP; - else if (!strcmp(res->filter_type, "iip")) - tunnel_filter_conf.filter_type = ETH_TUNNEL_FILTER_IIP; - else { - printf("The filter type is not supported"); - return; - } - - if (!strcmp(res->tunnel_type, "vxlan")) - tunnel_filter_conf.tunnel_type = RTE_TUNNEL_TYPE_VXLAN; - else if (!strcmp(res->tunnel_type, "vxlan-gpe")) - tunnel_filter_conf.tunnel_type = RTE_TUNNEL_TYPE_VXLAN_GPE; - else if (!strcmp(res->tunnel_type, "nvgre")) - tunnel_filter_conf.tunnel_type = RTE_TUNNEL_TYPE_NVGRE; - else if (!strcmp(res->tunnel_type, "ipingre")) - tunnel_filter_conf.tunnel_type = RTE_TUNNEL_TYPE_IP_IN_GRE; - else { - printf("The tunnel type %s not supported.\n", res->tunnel_type); - return; - } - - tunnel_filter_conf.tenant_id = res->tenant_id; - tunnel_filter_conf.queue_id = res->queue_num; - if (!strcmp(res->what, "add")) - ret = rte_eth_dev_filter_ctrl(res->port_id, - RTE_ETH_FILTER_TUNNEL, - RTE_ETH_FILTER_ADD, - &tunnel_filter_conf); - else - ret = rte_eth_dev_filter_ctrl(res->port_id, - RTE_ETH_FILTER_TUNNEL, - RTE_ETH_FILTER_DELETE, - &tunnel_filter_conf); - if (ret < 0) - printf("cmd_tunnel_filter_parsed error: (%s)\n", - strerror(-ret)); - -} -cmdline_parse_token_string_t cmd_tunnel_filter_cmd = - TOKEN_STRING_INITIALIZER(struct cmd_tunnel_filter_result, - cmd, "tunnel_filter"); -cmdline_parse_token_string_t cmd_tunnel_filter_what = - TOKEN_STRING_INITIALIZER(struct cmd_tunnel_filter_result, - what, "add#rm"); -cmdline_parse_token_num_t cmd_tunnel_filter_port_id = - TOKEN_NUM_INITIALIZER(struct cmd_tunnel_filter_result, - port_id, UINT16); -cmdline_parse_token_etheraddr_t cmd_tunnel_filter_outer_mac = - TOKEN_ETHERADDR_INITIALIZER(struct cmd_tunnel_filter_result, - outer_mac); -cmdline_parse_token_etheraddr_t cmd_tunnel_filter_inner_mac = - TOKEN_ETHERADDR_INITIALIZER(struct cmd_tunnel_filter_result, - inner_mac); -cmdline_parse_token_num_t cmd_tunnel_filter_innner_vlan = - TOKEN_NUM_INITIALIZER(struct cmd_tunnel_filter_result, - inner_vlan, UINT16); -cmdline_parse_token_ipaddr_t cmd_tunnel_filter_ip_value = - TOKEN_IPADDR_INITIALIZER(struct cmd_tunnel_filter_result, - ip_value); -cmdline_parse_token_string_t cmd_tunnel_filter_tunnel_type = - TOKEN_STRING_INITIALIZER(struct cmd_tunnel_filter_result, - tunnel_type, "vxlan#nvgre#ipingre#vxlan-gpe"); - -cmdline_parse_token_string_t cmd_tunnel_filter_filter_type = - TOKEN_STRING_INITIALIZER(struct cmd_tunnel_filter_result, - filter_type, "oip#iip#imac-ivlan#imac-ivlan-tenid#imac-tenid#" - "imac#omac-imac-tenid"); -cmdline_parse_token_num_t cmd_tunnel_filter_tenant_id = - TOKEN_NUM_INITIALIZER(struct cmd_tunnel_filter_result, - tenant_id, UINT32); -cmdline_parse_token_num_t cmd_tunnel_filter_queue_num = - TOKEN_NUM_INITIALIZER(struct cmd_tunnel_filter_result, - queue_num, UINT16); - -cmdline_parse_inst_t cmd_tunnel_filter = { - .f = cmd_tunnel_filter_parsed, - .data = (void *)0, - .help_str = "tunnel_filter add|rm " - " vxlan|nvgre|ipingre oip|iip|imac-ivlan|" - "imac-ivlan-tenid|imac-tenid|imac|omac-imac-tenid " - ": Add/Rm tunnel filter of a port", - .tokens = { - (void *)&cmd_tunnel_filter_cmd, - (void *)&cmd_tunnel_filter_what, - (void *)&cmd_tunnel_filter_port_id, - (void *)&cmd_tunnel_filter_outer_mac, - (void *)&cmd_tunnel_filter_inner_mac, - (void *)&cmd_tunnel_filter_ip_value, - (void *)&cmd_tunnel_filter_innner_vlan, - (void *)&cmd_tunnel_filter_tunnel_type, - (void *)&cmd_tunnel_filter_filter_type, - (void *)&cmd_tunnel_filter_tenant_id, - (void *)&cmd_tunnel_filter_queue_num, - NULL, - }, -}; - /* *** CONFIGURE TUNNEL UDP PORT *** */ struct cmd_tunnel_udp_config { cmdline_fixed_string_t cmd; @@ -19164,7 +19003,6 @@ cmdline_parse_ctx_t main_ctx[] = { (cmdline_parse_inst_t *)&cmd_set_uc_all_hash_filter, (cmdline_parse_inst_t *)&cmd_vf_mac_addr_filter, (cmdline_parse_inst_t *)&cmd_queue_rate_limit, - (cmdline_parse_inst_t *)&cmd_tunnel_filter, (cmdline_parse_inst_t *)&cmd_tunnel_udp_config, (cmdline_parse_inst_t *)&cmd_global_config, (cmdline_parse_inst_t *)&cmd_set_mirror_mask, diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst index a531edc88c..a807cb9ad9 100644 --- a/doc/guides/rel_notes/deprecation.rst +++ b/doc/guides/rel_notes/deprecation.rst @@ -108,7 +108,7 @@ Deprecation Notices * ethdev: the legacy filter API, including ``rte_eth_dev_filter_supported()``, ``rte_eth_dev_filter_ctrl()`` as well - as filter types TUNNEL, FDIR, + as filter types FDIR, HASH and L2_TUNNEL, is superseded by the generic flow API (rte_flow) in PMDs that implement the latter. The legacy API will be removed in DPDK 20.11. diff --git a/drivers/net/bnxt/bnxt_ethdev.c b/drivers/net/bnxt/bnxt_ethdev.c index 2de8d003d2..8b68b5fe76 100644 --- a/drivers/net/bnxt/bnxt_ethdev.c +++ b/drivers/net/bnxt/bnxt_ethdev.c @@ -3409,10 +3409,6 @@ bnxt_filter_ctrl_op(struct rte_eth_dev *dev, return ret; switch (filter_type) { - case RTE_ETH_FILTER_TUNNEL: - PMD_DRV_LOG(ERR, - "filter type: %d: To be implemented\n", filter_type); - break; case RTE_ETH_FILTER_FDIR: ret = bnxt_fdir_filter(dev, filter_op, arg); break; diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c index aa87ad8dd5..2badd024f1 100644 --- a/drivers/net/i40e/i40e_ethdev.c +++ b/drivers/net/i40e/i40e_ethdev.c @@ -7863,145 +7863,6 @@ i40e_sw_tunnel_filter_del(struct i40e_pf *pf, return 0; } -int -i40e_dev_tunnel_filter_set(struct i40e_pf *pf, - struct rte_eth_tunnel_filter_conf *tunnel_filter, - uint8_t add) -{ - uint16_t ip_type; - uint32_t ipv4_addr, ipv4_addr_le; - uint8_t i, tun_type = 0; - /* internal varialbe to convert ipv6 byte order */ - uint32_t convert_ipv6[4]; - int val, ret = 0; - struct i40e_hw *hw = I40E_PF_TO_HW(pf); - struct i40e_vsi *vsi = pf->main_vsi; - struct i40e_aqc_cloud_filters_element_bb *cld_filter; - struct i40e_aqc_cloud_filters_element_bb *pfilter; - struct i40e_tunnel_rule *tunnel_rule = &pf->tunnel; - struct i40e_tunnel_filter *tunnel, *node; - struct i40e_tunnel_filter check_filter; /* Check if filter exists */ - - cld_filter = rte_zmalloc("tunnel_filter", - sizeof(struct i40e_aqc_add_rm_cloud_filt_elem_ext), - 0); - - if (NULL == cld_filter) { - PMD_DRV_LOG(ERR, "Failed to alloc memory."); - return -ENOMEM; - } - pfilter = cld_filter; - - rte_ether_addr_copy(&tunnel_filter->outer_mac, - (struct rte_ether_addr *)&pfilter->element.outer_mac); - rte_ether_addr_copy(&tunnel_filter->inner_mac, - (struct rte_ether_addr *)&pfilter->element.inner_mac); - - pfilter->element.inner_vlan = - rte_cpu_to_le_16(tunnel_filter->inner_vlan); - if (tunnel_filter->ip_type == RTE_TUNNEL_IPTYPE_IPV4) { - ip_type = I40E_AQC_ADD_CLOUD_FLAGS_IPV4; - ipv4_addr = rte_be_to_cpu_32(tunnel_filter->ip_addr.ipv4_addr); - ipv4_addr_le = rte_cpu_to_le_32(ipv4_addr); - rte_memcpy(&pfilter->element.ipaddr.v4.data, - &ipv4_addr_le, - sizeof(pfilter->element.ipaddr.v4.data)); - } else { - ip_type = I40E_AQC_ADD_CLOUD_FLAGS_IPV6; - for (i = 0; i < 4; i++) { - convert_ipv6[i] = - rte_cpu_to_le_32(rte_be_to_cpu_32(tunnel_filter->ip_addr.ipv6_addr[i])); - } - rte_memcpy(&pfilter->element.ipaddr.v6.data, - &convert_ipv6, - sizeof(pfilter->element.ipaddr.v6.data)); - } - - /* check tunneled type */ - switch (tunnel_filter->tunnel_type) { - case RTE_TUNNEL_TYPE_VXLAN: - tun_type = I40E_AQC_ADD_CLOUD_TNL_TYPE_VXLAN; - break; - case RTE_TUNNEL_TYPE_NVGRE: - tun_type = I40E_AQC_ADD_CLOUD_TNL_TYPE_NVGRE_OMAC; - break; - case RTE_TUNNEL_TYPE_IP_IN_GRE: - tun_type = I40E_AQC_ADD_CLOUD_TNL_TYPE_IP; - break; - case RTE_TUNNEL_TYPE_VXLAN_GPE: - tun_type = I40E_AQC_ADD_CLOUD_TNL_TYPE_VXLAN_GPE; - break; - default: - /* Other tunnel types is not supported. */ - PMD_DRV_LOG(ERR, "tunnel type is not supported."); - rte_free(cld_filter); - return -EINVAL; - } - - val = i40e_dev_get_filter_type(tunnel_filter->filter_type, - &pfilter->element.flags); - if (val < 0) { - rte_free(cld_filter); - return -EINVAL; - } - - pfilter->element.flags |= rte_cpu_to_le_16( - I40E_AQC_ADD_CLOUD_FLAGS_TO_QUEUE | - ip_type | (tun_type << I40E_AQC_ADD_CLOUD_TNL_TYPE_SHIFT)); - pfilter->element.tenant_id = rte_cpu_to_le_32(tunnel_filter->tenant_id); - pfilter->element.queue_number = - rte_cpu_to_le_16(tunnel_filter->queue_id); - - /* Check if there is the filter in SW list */ - memset(&check_filter, 0, sizeof(check_filter)); - i40e_tunnel_filter_convert(cld_filter, &check_filter); - node = i40e_sw_tunnel_filter_lookup(tunnel_rule, &check_filter.input); - if (add && node) { - PMD_DRV_LOG(ERR, "Conflict with existing tunnel rules!"); - rte_free(cld_filter); - return -EINVAL; - } - - if (!add && !node) { - PMD_DRV_LOG(ERR, "There's no corresponding tunnel filter!"); - rte_free(cld_filter); - return -EINVAL; - } - - if (add) { - ret = i40e_aq_add_cloud_filters(hw, - vsi->seid, &cld_filter->element, 1); - if (ret < 0) { - PMD_DRV_LOG(ERR, "Failed to add a tunnel filter."); - rte_free(cld_filter); - return -ENOTSUP; - } - tunnel = rte_zmalloc("tunnel_filter", sizeof(*tunnel), 0); - if (tunnel == NULL) { - PMD_DRV_LOG(ERR, "Failed to alloc memory."); - rte_free(cld_filter); - return -ENOMEM; - } - - rte_memcpy(tunnel, &check_filter, sizeof(check_filter)); - ret = i40e_sw_tunnel_filter_insert(pf, tunnel); - if (ret < 0) - rte_free(tunnel); - } else { - ret = i40e_aq_rem_cloud_filters(hw, vsi->seid, - &cld_filter->element, 1); - if (ret < 0) { - PMD_DRV_LOG(ERR, "Failed to delete a tunnel filter."); - rte_free(cld_filter); - return -ENOTSUP; - } - ret = i40e_sw_tunnel_filter_del(pf, &node->input); - } - - rte_free(cld_filter); - return ret; -} - #define I40E_AQC_REPLACE_CLOUD_CMD_INPUT_TR_WORD0 0x48 #define I40E_TR_VXLAN_GRE_KEY_MASK 0x4 #define I40E_TR_GENEVE_KEY_MASK 0x8 @@ -9004,40 +8865,6 @@ i40e_pf_config_rss(struct i40e_pf *pf) return i40e_hw_rss_hash_set(pf, &rss_conf); } -static int -i40e_tunnel_filter_param_check(struct i40e_pf *pf, - struct rte_eth_tunnel_filter_conf *filter) -{ - if (pf == NULL || filter == NULL) { - PMD_DRV_LOG(ERR, "Invalid parameter"); - return -EINVAL; - } - - if (filter->queue_id >= pf->dev_data->nb_rx_queues) { - PMD_DRV_LOG(ERR, "Invalid queue ID"); - return -EINVAL; - } - - if (filter->inner_vlan > RTE_ETHER_MAX_VLAN_ID) { - PMD_DRV_LOG(ERR, "Invalid inner VLAN ID"); - return -EINVAL; - } - - if ((filter->filter_type & ETH_TUNNEL_FILTER_OMAC) && - (rte_is_zero_ether_addr(&filter->outer_mac))) { - PMD_DRV_LOG(ERR, "Cannot add NULL outer MAC address"); - return -EINVAL; - } - - if ((filter->filter_type & ETH_TUNNEL_FILTER_IMAC) && - (rte_is_zero_ether_addr(&filter->inner_mac))) { - PMD_DRV_LOG(ERR, "Cannot add NULL inner MAC address"); - return -EINVAL; - } - - return 0; -} - #define I40E_GL_PRS_FVBM_MSK_ENA 0x80000000 #define I40E_GL_PRS_FVBM(_i) (0x00269760 + ((_i) * 4)) int @@ -9123,40 +8950,6 @@ i40e_filter_ctrl_global_config(struct rte_eth_dev *dev, return ret; } -static int -i40e_tunnel_filter_handle(struct rte_eth_dev *dev, - enum rte_filter_op filter_op, - void *arg) -{ - struct rte_eth_tunnel_filter_conf *filter; - struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private); - int ret = I40E_SUCCESS; - - filter = (struct rte_eth_tunnel_filter_conf *)(arg); - - if (i40e_tunnel_filter_param_check(pf, filter) < 0) - return I40E_ERR_PARAM; - - switch (filter_op) { - case RTE_ETH_FILTER_NOP: - if (!(pf->flags & I40E_FLAG_VXLAN)) - ret = I40E_NOT_SUPPORTED; - break; - case RTE_ETH_FILTER_ADD: - ret = i40e_dev_tunnel_filter_set(pf, filter, 1); - break; - case RTE_ETH_FILTER_DELETE: - ret = i40e_dev_tunnel_filter_set(pf, filter, 0); - break; - default: - PMD_DRV_LOG(ERR, "unknown operation %u", filter_op); - ret = I40E_ERR_PARAM; - break; - } - - return ret; -} - /* Get the symmetric hash enable configurations per port */ static void i40e_get_symmetric_hash_enable_per_port(struct i40e_hw *hw, uint8_t *enable) @@ -10465,9 +10258,6 @@ i40e_dev_filter_ctrl(struct rte_eth_dev *dev, case RTE_ETH_FILTER_HASH: ret = i40e_hash_filter_ctrl(dev, filter_op, arg); break; - case RTE_ETH_FILTER_TUNNEL: - ret = i40e_tunnel_filter_handle(dev, filter_op, arg); - break; case RTE_ETH_FILTER_FDIR: ret = i40e_fdir_ctrl_func(dev, filter_op, arg); break; diff --git a/drivers/net/qede/qede_filter.c b/drivers/net/qede/qede_filter.c index 0c47407edd..ba4e4d9e16 100644 --- a/drivers/net/qede/qede_filter.c +++ b/drivers/net/qede/qede_filter.c @@ -696,36 +696,6 @@ qede_geneve_enable(struct rte_eth_dev *eth_dev, uint8_t clss, return rc; } -static int -qede_ipgre_enable(struct rte_eth_dev *eth_dev, uint8_t clss, - bool enable) -{ - struct qede_dev *qdev = QEDE_INIT_QDEV(eth_dev); - struct ecore_dev *edev = QEDE_INIT_EDEV(qdev); - enum _ecore_status_t rc = ECORE_INVAL; - struct ecore_tunnel_info tunn; - - memset(&tunn, 0, sizeof(struct ecore_tunnel_info)); - tunn.ip_gre.b_update_mode = true; - tunn.ip_gre.b_mode_enabled = enable; - tunn.ip_gre.tun_cls = clss; - tunn.ip_gre.tun_cls = clss; - tunn.b_update_rx_cls = true; - tunn.b_update_tx_cls = true; - - rc = qede_tunnel_update(qdev, &tunn); - if (rc == ECORE_SUCCESS) { - qdev->ipgre.enable = enable; - DP_INFO(edev, "IPGRE is %s\n", - enable ? "enabled" : "disabled"); - } else { - DP_ERR(edev, "Failed to update tunn_clss %u\n", - clss); - } - - return rc; -} - int qede_udp_dst_port_del(struct rte_eth_dev *eth_dev, struct rte_eth_udp_tunnel *tunnel_udp) @@ -902,210 +872,6 @@ qede_udp_dst_port_add(struct rte_eth_dev *eth_dev, return 0; } -static void qede_get_ecore_tunn_params(uint32_t filter, uint32_t *type, - uint32_t *clss, char *str) -{ - uint16_t j; - *clss = MAX_ECORE_TUNN_CLSS; - - for (j = 0; j < RTE_DIM(qede_tunn_types); j++) { - if (filter == qede_tunn_types[j].rte_filter_type) { - *type = qede_tunn_types[j].qede_type; - *clss = qede_tunn_types[j].qede_tunn_clss; - strcpy(str, qede_tunn_types[j].string); - return; - } - } -} - -static int -qede_set_ucast_tunn_cmn_param(struct ecore_filter_ucast *ucast, - const struct rte_eth_tunnel_filter_conf *conf, - uint32_t type) -{ - /* Init commmon ucast params first */ - qede_set_ucast_cmn_params(ucast); - - /* Copy out the required fields based on classification type */ - ucast->type = type; - - switch (type) { - case ECORE_FILTER_VNI: - ucast->vni = conf->tenant_id; - break; - case ECORE_FILTER_INNER_VLAN: - ucast->vlan = conf->inner_vlan; - break; - case ECORE_FILTER_MAC: - memcpy(ucast->mac, conf->outer_mac.addr_bytes, - RTE_ETHER_ADDR_LEN); - break; - case ECORE_FILTER_INNER_MAC: - memcpy(ucast->mac, conf->inner_mac.addr_bytes, - RTE_ETHER_ADDR_LEN); - break; - case ECORE_FILTER_MAC_VNI_PAIR: - memcpy(ucast->mac, conf->outer_mac.addr_bytes, - RTE_ETHER_ADDR_LEN); - ucast->vni = conf->tenant_id; - break; - case ECORE_FILTER_INNER_MAC_VNI_PAIR: - memcpy(ucast->mac, conf->inner_mac.addr_bytes, - RTE_ETHER_ADDR_LEN); - ucast->vni = conf->tenant_id; - break; - case ECORE_FILTER_INNER_PAIR: - memcpy(ucast->mac, conf->inner_mac.addr_bytes, - RTE_ETHER_ADDR_LEN); - ucast->vlan = conf->inner_vlan; - break; - default: - return -EINVAL; - } - - return ECORE_SUCCESS; -} - -static int -_qede_tunn_filter_config(struct rte_eth_dev *eth_dev, - const struct rte_eth_tunnel_filter_conf *conf, - __rte_unused enum rte_filter_op filter_op, - enum ecore_tunn_clss *clss, - bool add) -{ - struct qede_dev *qdev = QEDE_INIT_QDEV(eth_dev); - struct ecore_dev *edev = QEDE_INIT_EDEV(qdev); - struct ecore_filter_ucast ucast = {0}; - enum ecore_filter_ucast_type type; - uint16_t filter_type = 0; - char str[80]; - int rc; - - filter_type = conf->filter_type; - /* Determine if the given filter classification is supported */ - qede_get_ecore_tunn_params(filter_type, &type, clss, str); - if (*clss == MAX_ECORE_TUNN_CLSS) { - DP_ERR(edev, "Unsupported filter type\n"); - return -EINVAL; - } - /* Init tunnel ucast params */ - rc = qede_set_ucast_tunn_cmn_param(&ucast, conf, type); - if (rc != ECORE_SUCCESS) { - DP_ERR(edev, "Unsupported Tunnel filter type 0x%x\n", - conf->filter_type); - return rc; - } - DP_INFO(edev, "Rule: \"%s\", op %d, type 0x%x\n", - str, filter_op, ucast.type); - - ucast.opcode = add ? ECORE_FILTER_ADD : ECORE_FILTER_REMOVE; - - /* Skip MAC/VLAN if filter is based on VNI */ - if (!(filter_type & ETH_TUNNEL_FILTER_TENID)) { - rc = qede_mac_int_ops(eth_dev, &ucast, add); - if (rc == 0 && add) { - /* Enable accept anyvlan */ - qede_config_accept_any_vlan(qdev, true); - } - } else { - rc = qede_ucast_filter(eth_dev, &ucast, add); - if (rc == 0) - rc = ecore_filter_ucast_cmd(edev, &ucast, - ECORE_SPQ_MODE_CB, NULL); - } - - return rc; -} - -static int -qede_tunn_enable(struct rte_eth_dev *eth_dev, uint8_t clss, - enum rte_eth_tunnel_type tunn_type, bool enable) -{ - int rc = -EINVAL; - - switch (tunn_type) { - case RTE_TUNNEL_TYPE_VXLAN: - rc = qede_vxlan_enable(eth_dev, clss, enable); - break; - case RTE_TUNNEL_TYPE_GENEVE: - rc = qede_geneve_enable(eth_dev, clss, enable); - break; - case RTE_TUNNEL_TYPE_IP_IN_GRE: - rc = qede_ipgre_enable(eth_dev, clss, enable); - break; - default: - rc = -EINVAL; - break; - } - - return rc; -} - -static int -qede_tunn_filter_config(struct rte_eth_dev *eth_dev, - enum rte_filter_op filter_op, - const struct rte_eth_tunnel_filter_conf *conf) -{ - struct qede_dev *qdev = QEDE_INIT_QDEV(eth_dev); - struct ecore_dev *edev = QEDE_INIT_EDEV(qdev); - enum ecore_tunn_clss clss = MAX_ECORE_TUNN_CLSS; - bool add; - int rc; - - PMD_INIT_FUNC_TRACE(edev); - - switch (filter_op) { - case RTE_ETH_FILTER_ADD: - add = true; - break; - case RTE_ETH_FILTER_DELETE: - add = false; - break; - default: - DP_ERR(edev, "Unsupported operation %d\n", filter_op); - return -EINVAL; - } - - if (IS_VF(edev)) - return qede_tunn_enable(eth_dev, - ECORE_TUNN_CLSS_MAC_VLAN, - conf->tunnel_type, add); - - rc = _qede_tunn_filter_config(eth_dev, conf, filter_op, &clss, add); - if (rc != ECORE_SUCCESS) - return rc; - - if (add) { - if (conf->tunnel_type == RTE_TUNNEL_TYPE_VXLAN) { - qdev->vxlan.num_filters++; - qdev->vxlan.filter_type = conf->filter_type; - } else { /* GENEVE */ - qdev->geneve.num_filters++; - qdev->geneve.filter_type = conf->filter_type; - } - - if (!qdev->vxlan.enable || !qdev->geneve.enable || - !qdev->ipgre.enable) - return qede_tunn_enable(eth_dev, clss, - conf->tunnel_type, - true); - } else { - if (conf->tunnel_type == RTE_TUNNEL_TYPE_VXLAN) - qdev->vxlan.num_filters--; - else /*GENEVE*/ - qdev->geneve.num_filters--; - - /* Disable VXLAN if VXLAN filters become 0 */ - if (qdev->vxlan.num_filters == 0 || - qdev->geneve.num_filters == 0) - return qede_tunn_enable(eth_dev, clss, - conf->tunnel_type, - false); - } - - return 0; -} - static int qede_flow_validate_attr(__rte_unused struct rte_eth_dev *dev, const struct rte_flow_attr *attr, @@ -1460,31 +1226,8 @@ int qede_dev_filter_ctrl(struct rte_eth_dev *eth_dev, { struct qede_dev *qdev = QEDE_INIT_QDEV(eth_dev); struct ecore_dev *edev = QEDE_INIT_EDEV(qdev); - struct rte_eth_tunnel_filter_conf *filter_conf = - (struct rte_eth_tunnel_filter_conf *)arg; switch (filter_type) { - case RTE_ETH_FILTER_TUNNEL: - switch (filter_conf->tunnel_type) { - case RTE_TUNNEL_TYPE_VXLAN: - case RTE_TUNNEL_TYPE_GENEVE: - case RTE_TUNNEL_TYPE_IP_IN_GRE: - DP_INFO(edev, - "Packet steering to the specified Rx queue" - " is not supported with UDP tunneling"); - return(qede_tunn_filter_config(eth_dev, filter_op, - filter_conf)); - case RTE_TUNNEL_TYPE_TEREDO: - case RTE_TUNNEL_TYPE_NVGRE: - case RTE_L2_TUNNEL_TYPE_E_TAG: - DP_ERR(edev, "Unsupported tunnel type %d\n", - filter_conf->tunnel_type); - return -EINVAL; - case RTE_TUNNEL_TYPE_NONE: - default: - return 0; - } - break; case RTE_ETH_FILTER_FDIR: return qede_fdir_filter_conf(eth_dev, filter_op, arg); case RTE_ETH_FILTER_GENERIC: diff --git a/drivers/net/sfc/sfc_ethdev.c b/drivers/net/sfc/sfc_ethdev.c index 4291a932e8..51d33f3710 100644 --- a/drivers/net/sfc/sfc_ethdev.c +++ b/drivers/net/sfc/sfc_ethdev.c @@ -1748,9 +1748,6 @@ sfc_dev_filter_ctrl(struct rte_eth_dev *dev, enum rte_filter_type filter_type, case RTE_ETH_FILTER_NONE: sfc_err(sa, "Global filters configuration not supported"); break; - case RTE_ETH_FILTER_TUNNEL: - sfc_err(sa, "Tunnel filters not supported"); - break; case RTE_ETH_FILTER_FDIR: sfc_err(sa, "Flow Director filters not supported"); break; From patchwork Sun Oct 18 14:09:06 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Rybchenko X-Patchwork-Id: 81267 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 464D5A04B0; Sun, 18 Oct 2020 16:13:35 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 91C91E268; Sun, 18 Oct 2020 16:09:45 +0200 (CEST) Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [67.231.154.164]) by dpdk.org (Postfix) with ESMTP id 42539C8B2 for ; Sun, 18 Oct 2020 16:09:30 +0200 (CEST) Received: from mx1-us1.ppe-hosted.com (unknown [10.110.50.150]) by dispatch1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id D94652004F; Sun, 18 Oct 2020 14:09:28 +0000 (UTC) Received: from us4-mdac16-44.at1.mdlocal (unknown [10.110.48.15]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id D778C800A3; Sun, 18 Oct 2020 14:09:28 +0000 (UTC) X-Virus-Scanned: Proofpoint Essentials engine Received: from mx1-us1.ppe-hosted.com (unknown [10.110.50.12]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id D6098100052; Sun, 18 Oct 2020 14:09:27 +0000 (UTC) Received: from webmail.solarflare.com (uk.solarflare.com [193.34.186.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 9C75D4005E; Sun, 18 Oct 2020 14:09:27 +0000 (UTC) Received: from ukex01.SolarFlarecom.com (10.17.10.4) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Sun, 18 Oct 2020 15:09:21 +0100 Received: from opal.uk.solarflarecom.com (10.17.10.1) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Sun, 18 Oct 2020 15:09:21 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (ukv-loginhost.uk.solarflarecom.com [10.17.10.39]) by opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id 09IE9L7f002055; Sun, 18 Oct 2020 15:09:21 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1]) by ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id AF1F51613A9; Sun, 18 Oct 2020 15:09:21 +0100 (BST) From: Andrew Rybchenko To: Wenzhuo Lu , Beilei Xing , Bernard Iremonger , Ray Kinsella , Neil Horman , Jeff Guo , Rasesh Mody , Shahed Shaikh , Andrew Rybchenko , Thomas Monjalon , Ferruh Yigit CC: Date: Sun, 18 Oct 2020 15:09:06 +0100 Message-ID: <1603030152-13451-10-git-send-email-arybchenko@solarflare.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1603030152-13451-1-git-send-email-arybchenko@solarflare.com> References: <1603030152-13451-1-git-send-email-arybchenko@solarflare.com> MIME-Version: 1.0 X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.6.1012-25732.003 X-TM-AS-Result: No-9.081500-8.000000-10 X-TMASE-MatchedRID: FRs2vsuWi3BqUF8PySBXcqiUivh0j2PvY/L2/AZJAWSYkF7ZtFfCU4wW IRmLVWq5NNN0dk/lb45w5T4Iaj538mJZXQNDzktSGjzBgnFZvQ6nU+NxqV3DDTygo3tTd/ax1KG 8hyHCM65oj7nB4dv1WHQsWqqg7/Rh3WMxx3WjnrQqsMfMfrOZRbpxXRtX1WLzOdl/GMFVBFtSYP /YanAIfsopD30c+vdoT2xAtcKLZ59WeM2C2IocFE/+sbQfCqQYEjZJ2wHBh6rSvnSpS9gcQGjzC 5xMWsA17EfuvO/3+PIkC5AZv2h0wKiOHwlYzcGc6GyDR2ZB+cai8D/o42y/ShLf1vz7ecPH5etK 57ziLXiKWP5eRxzbsFSCmfT2v3teDD20H1S9BwiHZXNSWjgdU308MksGfqucR2YNIFh+clGGgE0 qc4kdzffNndQFlnWv2hom6EaP1XcZagUy2as2F0RWpBb0G+2p+x+d6uPTzEMdXtyyzrIOt9lQtU Fiiij64uXUY9oObKfYlAhrLW5bRkhxZDLrVyH4+CjwEqX1p7nAmOfzKotTohS+f3d7BiKCPNePQ kIvZQsURB7MkIPtx17Qr3uDL0DCOpveZA740U79xyC38S1f/d740tDvjd+1gHhfJtGVOYSahugK owZiNZHTN7qI0mcePAbkc1sBhfqAXaIZA5v/TXT7rnt3EYkYAEfHuzEnemabKItl61J/yVE3WP5 nX017SSluJg5SbDF5zdAzex5xZpL8Jtrc2BxZAqE2qJGUg41Rfkn/wq9e00Rd5RXGOeuWD6d8jE xNVjuUTGVAhB5EbQ== X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10--9.081500-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.6.1012-25732.003 X-MDID: 1603030168-S9yn0wmTwoXm X-PPE-DISP: 1603030168;S9yn0wmTwoXm Subject: [dpdk-dev] [PATCH 09/14] ethdev: remove legacy HASH filter type support X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" RTE flow API should be used for filtering. Preserve RTE_ETH_FILTER_HASH since it is used in drivers internally in RTE flow API support. Signed-off-by: Andrew Rybchenko --- app/test-pmd/cmdline.c | 434 --------------------------- doc/guides/rel_notes/deprecation.rst | 4 +- drivers/net/i40e/i40e_ethdev.c | 268 ----------------- drivers/net/qede/qede_filter.c | 1 - drivers/net/sfc/sfc_ethdev.c | 3 - lib/librte_ethdev/rte_eth_ctrl.h | 57 ---- 6 files changed, 2 insertions(+), 765 deletions(-) diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c index f7169c7b9e..713e1cad83 100644 --- a/app/test-pmd/cmdline.c +++ b/app/test-pmd/cmdline.c @@ -1048,34 +1048,6 @@ static void cmd_help_long_parsed(void *parsed_result, " (raw|l2|l3|l4) (config)\n" " Configure flex payload selection.\n\n" - "get_sym_hash_ena_per_port (port_id)\n" - " get symmetric hash enable configuration per port.\n\n" - - "set_sym_hash_ena_per_port (port_id) (enable|disable)\n" - " set symmetric hash enable configuration per port" - " to enable or disable.\n\n" - - "get_hash_global_config (port_id)\n" - " Get the global configurations of hash filters.\n\n" - - "set_hash_global_config (port_id) (toeplitz|simple_xor|symmetric_toeplitz|default)" - " (ipv4|ipv4-frag|ipv4-tcp|ipv4-udp|ipv4-sctp|ipv4-other|ipv6|" - "ipv6-frag|ipv6-tcp|ipv6-udp|ipv6-sctp|ipv6-other|l2_payload)" - " (enable|disable)\n" - " Set the global configurations of hash filters.\n\n" - - "set_hash_input_set (port_id) (ipv4|ipv4-frag|" - "ipv4-tcp|ipv4-udp|ipv4-sctp|ipv4-other|ipv6|" - "ipv6-frag|ipv6-tcp|ipv6-udp|ipv6-sctp|ipv6-other|" - "l2_payload|) (ovlan|ivlan|src-ipv4|dst-ipv4|" - "src-ipv6|dst-ipv6|ipv4-tos|ipv4-proto|ipv6-tc|" - "ipv6-next-header|udp-src-port|udp-dst-port|" - "tcp-src-port|tcp-dst-port|sctp-src-port|" - "sctp-dst-port|sctp-veri-tag|udp-key|gre-key|fld-1st|" - "fld-2nd|fld-3rd|fld-4th|fld-5th|fld-6th|fld-7th|" - "fld-8th|none) (select|add)\n" - " Set the input set for hash.\n\n" - "set_fdir_input_set (port_id) " "(ipv4-frag|ipv4-tcp|ipv4-udp|ipv4-sctp|ipv4-other|" "ipv6-frag|ipv6-tcp|ipv6-udp|ipv6-sctp|ipv6-other|" @@ -11503,343 +11475,6 @@ cmdline_parse_inst_t cmd_set_flow_director_flex_payload = { extern cmdline_parse_inst_t cmd_flow; /* *** Classification Filters Control *** */ -/* *** Get symmetric hash enable per port *** */ -struct cmd_get_sym_hash_ena_per_port_result { - cmdline_fixed_string_t get_sym_hash_ena_per_port; - portid_t port_id; -}; - -static void -cmd_get_sym_hash_per_port_parsed(void *parsed_result, - __rte_unused struct cmdline *cl, - __rte_unused void *data) -{ - struct cmd_get_sym_hash_ena_per_port_result *res = parsed_result; - struct rte_eth_hash_filter_info info; - int ret; - - if (rte_eth_dev_filter_supported(res->port_id, - RTE_ETH_FILTER_HASH) < 0) { - printf("RTE_ETH_FILTER_HASH not supported on port: %d\n", - res->port_id); - return; - } - - memset(&info, 0, sizeof(info)); - info.info_type = RTE_ETH_HASH_FILTER_SYM_HASH_ENA_PER_PORT; - ret = rte_eth_dev_filter_ctrl(res->port_id, RTE_ETH_FILTER_HASH, - RTE_ETH_FILTER_GET, &info); - - if (ret < 0) { - printf("Cannot get symmetric hash enable per port " - "on port %u\n", res->port_id); - return; - } - - printf("Symmetric hash is %s on port %u\n", info.info.enable ? - "enabled" : "disabled", res->port_id); -} - -cmdline_parse_token_string_t cmd_get_sym_hash_ena_per_port_all = - TOKEN_STRING_INITIALIZER(struct cmd_get_sym_hash_ena_per_port_result, - get_sym_hash_ena_per_port, "get_sym_hash_ena_per_port"); -cmdline_parse_token_num_t cmd_get_sym_hash_ena_per_port_port_id = - TOKEN_NUM_INITIALIZER(struct cmd_get_sym_hash_ena_per_port_result, - port_id, UINT16); - -cmdline_parse_inst_t cmd_get_sym_hash_ena_per_port = { - .f = cmd_get_sym_hash_per_port_parsed, - .data = NULL, - .help_str = "get_sym_hash_ena_per_port ", - .tokens = { - (void *)&cmd_get_sym_hash_ena_per_port_all, - (void *)&cmd_get_sym_hash_ena_per_port_port_id, - NULL, - }, -}; - -/* *** Set symmetric hash enable per port *** */ -struct cmd_set_sym_hash_ena_per_port_result { - cmdline_fixed_string_t set_sym_hash_ena_per_port; - cmdline_fixed_string_t enable; - portid_t port_id; -}; - -static void -cmd_set_sym_hash_per_port_parsed(void *parsed_result, - __rte_unused struct cmdline *cl, - __rte_unused void *data) -{ - struct cmd_set_sym_hash_ena_per_port_result *res = parsed_result; - struct rte_eth_hash_filter_info info; - int ret; - - if (rte_eth_dev_filter_supported(res->port_id, - RTE_ETH_FILTER_HASH) < 0) { - printf("RTE_ETH_FILTER_HASH not supported on port: %d\n", - res->port_id); - return; - } - - memset(&info, 0, sizeof(info)); - info.info_type = RTE_ETH_HASH_FILTER_SYM_HASH_ENA_PER_PORT; - if (!strcmp(res->enable, "enable")) - info.info.enable = 1; - ret = rte_eth_dev_filter_ctrl(res->port_id, RTE_ETH_FILTER_HASH, - RTE_ETH_FILTER_SET, &info); - if (ret < 0) { - printf("Cannot set symmetric hash enable per port on " - "port %u\n", res->port_id); - return; - } - printf("Symmetric hash has been set to %s on port %u\n", - res->enable, res->port_id); -} - -cmdline_parse_token_string_t cmd_set_sym_hash_ena_per_port_all = - TOKEN_STRING_INITIALIZER(struct cmd_set_sym_hash_ena_per_port_result, - set_sym_hash_ena_per_port, "set_sym_hash_ena_per_port"); -cmdline_parse_token_num_t cmd_set_sym_hash_ena_per_port_port_id = - TOKEN_NUM_INITIALIZER(struct cmd_set_sym_hash_ena_per_port_result, - port_id, UINT16); -cmdline_parse_token_string_t cmd_set_sym_hash_ena_per_port_enable = - TOKEN_STRING_INITIALIZER(struct cmd_set_sym_hash_ena_per_port_result, - enable, "enable#disable"); - -cmdline_parse_inst_t cmd_set_sym_hash_ena_per_port = { - .f = cmd_set_sym_hash_per_port_parsed, - .data = NULL, - .help_str = "set_sym_hash_ena_per_port enable|disable", - .tokens = { - (void *)&cmd_set_sym_hash_ena_per_port_all, - (void *)&cmd_set_sym_hash_ena_per_port_port_id, - (void *)&cmd_set_sym_hash_ena_per_port_enable, - NULL, - }, -}; - -/* Get global config of hash function */ -struct cmd_get_hash_global_config_result { - cmdline_fixed_string_t get_hash_global_config; - portid_t port_id; -}; - -static char * -flowtype_to_str(uint16_t ftype) -{ - uint16_t i; - static struct { - char str[16]; - uint16_t ftype; - } ftype_table[] = { - {"ipv4", RTE_ETH_FLOW_IPV4}, - {"ipv4-frag", RTE_ETH_FLOW_FRAG_IPV4}, - {"ipv4-tcp", RTE_ETH_FLOW_NONFRAG_IPV4_TCP}, - {"ipv4-udp", RTE_ETH_FLOW_NONFRAG_IPV4_UDP}, - {"ipv4-sctp", RTE_ETH_FLOW_NONFRAG_IPV4_SCTP}, - {"ipv4-other", RTE_ETH_FLOW_NONFRAG_IPV4_OTHER}, - {"ipv6", RTE_ETH_FLOW_IPV6}, - {"ipv6-frag", RTE_ETH_FLOW_FRAG_IPV6}, - {"ipv6-tcp", RTE_ETH_FLOW_NONFRAG_IPV6_TCP}, - {"ipv6-udp", RTE_ETH_FLOW_NONFRAG_IPV6_UDP}, - {"ipv6-sctp", RTE_ETH_FLOW_NONFRAG_IPV6_SCTP}, - {"ipv6-other", RTE_ETH_FLOW_NONFRAG_IPV6_OTHER}, - {"l2_payload", RTE_ETH_FLOW_L2_PAYLOAD}, - {"port", RTE_ETH_FLOW_PORT}, - {"vxlan", RTE_ETH_FLOW_VXLAN}, - {"geneve", RTE_ETH_FLOW_GENEVE}, - {"nvgre", RTE_ETH_FLOW_NVGRE}, - {"vxlan-gpe", RTE_ETH_FLOW_VXLAN_GPE}, - }; - - for (i = 0; i < RTE_DIM(ftype_table); i++) { - if (ftype_table[i].ftype == ftype) - return ftype_table[i].str; - } - - return NULL; -} - -static void -cmd_get_hash_global_config_parsed(void *parsed_result, - __rte_unused struct cmdline *cl, - __rte_unused void *data) -{ - struct cmd_get_hash_global_config_result *res = parsed_result; - struct rte_eth_hash_filter_info info; - uint32_t idx, offset; - uint16_t i; - char *str; - int ret; - - if (rte_eth_dev_filter_supported(res->port_id, - RTE_ETH_FILTER_HASH) < 0) { - printf("RTE_ETH_FILTER_HASH not supported on port %d\n", - res->port_id); - return; - } - - memset(&info, 0, sizeof(info)); - info.info_type = RTE_ETH_HASH_FILTER_GLOBAL_CONFIG; - ret = rte_eth_dev_filter_ctrl(res->port_id, RTE_ETH_FILTER_HASH, - RTE_ETH_FILTER_GET, &info); - if (ret < 0) { - printf("Cannot get hash global configurations by port %d\n", - res->port_id); - return; - } - - switch (info.info.global_conf.hash_func) { - case RTE_ETH_HASH_FUNCTION_TOEPLITZ: - printf("Hash function is Toeplitz\n"); - break; - case RTE_ETH_HASH_FUNCTION_SIMPLE_XOR: - printf("Hash function is Simple XOR\n"); - break; - case RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ: - printf("Hash function is Symmetric Toeplitz\n"); - break; - default: - printf("Unknown hash function\n"); - break; - } - - for (i = 0; i < RTE_ETH_FLOW_MAX; i++) { - idx = i / UINT64_BIT; - offset = i % UINT64_BIT; - if (!(info.info.global_conf.valid_bit_mask[idx] & - (1ULL << offset))) - continue; - str = flowtype_to_str(i); - if (!str) - continue; - printf("Symmetric hash is %s globally for flow type %s " - "by port %d\n", - ((info.info.global_conf.sym_hash_enable_mask[idx] & - (1ULL << offset)) ? "enabled" : "disabled"), str, - res->port_id); - } -} - -cmdline_parse_token_string_t cmd_get_hash_global_config_all = - TOKEN_STRING_INITIALIZER(struct cmd_get_hash_global_config_result, - get_hash_global_config, "get_hash_global_config"); -cmdline_parse_token_num_t cmd_get_hash_global_config_port_id = - TOKEN_NUM_INITIALIZER(struct cmd_get_hash_global_config_result, - port_id, UINT16); - -cmdline_parse_inst_t cmd_get_hash_global_config = { - .f = cmd_get_hash_global_config_parsed, - .data = NULL, - .help_str = "get_hash_global_config ", - .tokens = { - (void *)&cmd_get_hash_global_config_all, - (void *)&cmd_get_hash_global_config_port_id, - NULL, - }, -}; - -/* Set global config of hash function */ -struct cmd_set_hash_global_config_result { - cmdline_fixed_string_t set_hash_global_config; - portid_t port_id; - cmdline_fixed_string_t hash_func; - cmdline_fixed_string_t flow_type; - cmdline_fixed_string_t enable; -}; - -static void -cmd_set_hash_global_config_parsed(void *parsed_result, - __rte_unused struct cmdline *cl, - __rte_unused void *data) -{ - struct cmd_set_hash_global_config_result *res = parsed_result; - struct rte_eth_hash_filter_info info; - uint32_t ftype, idx, offset; - int ret; - - if (rte_eth_dev_filter_supported(res->port_id, - RTE_ETH_FILTER_HASH) < 0) { - printf("RTE_ETH_FILTER_HASH not supported on port %d\n", - res->port_id); - return; - } - memset(&info, 0, sizeof(info)); - info.info_type = RTE_ETH_HASH_FILTER_GLOBAL_CONFIG; - if (!strcmp(res->hash_func, "toeplitz")) - info.info.global_conf.hash_func = - RTE_ETH_HASH_FUNCTION_TOEPLITZ; - else if (!strcmp(res->hash_func, "simple_xor")) - info.info.global_conf.hash_func = - RTE_ETH_HASH_FUNCTION_SIMPLE_XOR; - else if (!strcmp(res->hash_func, "symmetric_toeplitz")) - info.info.global_conf.hash_func = - RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ; - else if (!strcmp(res->hash_func, "default")) - info.info.global_conf.hash_func = - RTE_ETH_HASH_FUNCTION_DEFAULT; - - ftype = str2flowtype(res->flow_type); - idx = ftype / UINT64_BIT; - offset = ftype % UINT64_BIT; - info.info.global_conf.valid_bit_mask[idx] |= (1ULL << offset); - if (!strcmp(res->enable, "enable")) - info.info.global_conf.sym_hash_enable_mask[idx] |= - (1ULL << offset); - ret = rte_eth_dev_filter_ctrl(res->port_id, RTE_ETH_FILTER_HASH, - RTE_ETH_FILTER_SET, &info); - if (ret < 0) - printf("Cannot set global hash configurations by port %d\n", - res->port_id); - else - printf("Global hash configurations have been set " - "successfully by port %d\n", res->port_id); -} - -cmdline_parse_token_string_t cmd_set_hash_global_config_all = - TOKEN_STRING_INITIALIZER(struct cmd_set_hash_global_config_result, - set_hash_global_config, "set_hash_global_config"); -cmdline_parse_token_num_t cmd_set_hash_global_config_port_id = - TOKEN_NUM_INITIALIZER(struct cmd_set_hash_global_config_result, - port_id, UINT16); -cmdline_parse_token_string_t cmd_set_hash_global_config_hash_func = - TOKEN_STRING_INITIALIZER(struct cmd_set_hash_global_config_result, - hash_func, "toeplitz#simple_xor#symmetric_toeplitz#default"); -cmdline_parse_token_string_t cmd_set_hash_global_config_flow_type = - TOKEN_STRING_INITIALIZER(struct cmd_set_hash_global_config_result, - flow_type, - "ipv4#ipv4-frag#ipv4-tcp#ipv4-udp#ipv4-sctp#ipv4-other#ipv6#" - "ipv6-frag#ipv6-tcp#ipv6-udp#ipv6-sctp#ipv6-other#l2_payload"); -cmdline_parse_token_string_t cmd_set_hash_global_config_enable = - TOKEN_STRING_INITIALIZER(struct cmd_set_hash_global_config_result, - enable, "enable#disable"); - -cmdline_parse_inst_t cmd_set_hash_global_config = { - .f = cmd_set_hash_global_config_parsed, - .data = NULL, - .help_str = "set_hash_global_config " - "toeplitz|simple_xor|symmetric_toeplitz|default " - "ipv4|ipv4-frag|ipv4-tcp|ipv4-udp|ipv4-sctp|ipv4-other|" - "ipv6|ipv6-frag|ipv6-tcp|ipv6-udp|ipv6-sctp|ipv6-other|" - "l2_payload enable|disable", - .tokens = { - (void *)&cmd_set_hash_global_config_all, - (void *)&cmd_set_hash_global_config_port_id, - (void *)&cmd_set_hash_global_config_hash_func, - (void *)&cmd_set_hash_global_config_flow_type, - (void *)&cmd_set_hash_global_config_enable, - NULL, - }, -}; - -/* Set hash input set */ -struct cmd_set_hash_input_set_result { - cmdline_fixed_string_t set_hash_input_set; - portid_t port_id; - cmdline_fixed_string_t flow_type; - cmdline_fixed_string_t inset_field; - cmdline_fixed_string_t select; -}; static enum rte_eth_input_set_field str2inset(char *string) @@ -11891,70 +11526,6 @@ str2inset(char *string) return RTE_ETH_INPUT_SET_UNKNOWN; } -static void -cmd_set_hash_input_set_parsed(void *parsed_result, - __rte_unused struct cmdline *cl, - __rte_unused void *data) -{ - struct cmd_set_hash_input_set_result *res = parsed_result; - struct rte_eth_hash_filter_info info; - - memset(&info, 0, sizeof(info)); - info.info_type = RTE_ETH_HASH_FILTER_INPUT_SET_SELECT; - info.info.input_set_conf.flow_type = str2flowtype(res->flow_type); - info.info.input_set_conf.field[0] = str2inset(res->inset_field); - info.info.input_set_conf.inset_size = 1; - if (!strcmp(res->select, "select")) - info.info.input_set_conf.op = RTE_ETH_INPUT_SET_SELECT; - else if (!strcmp(res->select, "add")) - info.info.input_set_conf.op = RTE_ETH_INPUT_SET_ADD; - rte_eth_dev_filter_ctrl(res->port_id, RTE_ETH_FILTER_HASH, - RTE_ETH_FILTER_SET, &info); -} - -cmdline_parse_token_string_t cmd_set_hash_input_set_cmd = - TOKEN_STRING_INITIALIZER(struct cmd_set_hash_input_set_result, - set_hash_input_set, "set_hash_input_set"); -cmdline_parse_token_num_t cmd_set_hash_input_set_port_id = - TOKEN_NUM_INITIALIZER(struct cmd_set_hash_input_set_result, - port_id, UINT16); -cmdline_parse_token_string_t cmd_set_hash_input_set_flow_type = - TOKEN_STRING_INITIALIZER(struct cmd_set_hash_input_set_result, - flow_type, NULL); -cmdline_parse_token_string_t cmd_set_hash_input_set_field = - TOKEN_STRING_INITIALIZER(struct cmd_set_hash_input_set_result, - inset_field, - "ovlan#ivlan#src-ipv4#dst-ipv4#src-ipv6#dst-ipv6#" - "ipv4-tos#ipv4-proto#ipv6-tc#ipv6-next-header#udp-src-port#" - "udp-dst-port#tcp-src-port#tcp-dst-port#sctp-src-port#" - "sctp-dst-port#sctp-veri-tag#udp-key#gre-key#fld-1st#" - "fld-2nd#fld-3rd#fld-4th#fld-5th#fld-6th#fld-7th#" - "fld-8th#none"); -cmdline_parse_token_string_t cmd_set_hash_input_set_select = - TOKEN_STRING_INITIALIZER(struct cmd_set_hash_input_set_result, - select, "select#add"); - -cmdline_parse_inst_t cmd_set_hash_input_set = { - .f = cmd_set_hash_input_set_parsed, - .data = NULL, - .help_str = "set_hash_input_set " - "ipv4-frag|ipv4-tcp|ipv4-udp|ipv4-sctp|ipv4-other|" - "ipv6-frag|ipv6-tcp|ipv6-udp|ipv6-sctp|ipv6-other|l2_payload| " - "ovlan|ivlan|src-ipv4|dst-ipv4|src-ipv6|dst-ipv6|ipv4-tos|ipv4-proto|" - "ipv6-tc|ipv6-next-header|udp-src-port|udp-dst-port|tcp-src-port|" - "tcp-dst-port|sctp-src-port|sctp-dst-port|sctp-veri-tag|udp-key|" - "gre-key|fld-1st|fld-2nd|fld-3rd|fld-4th|fld-5th|fld-6th|" - "fld-7th|fld-8th|none select|add", - .tokens = { - (void *)&cmd_set_hash_input_set_cmd, - (void *)&cmd_set_hash_input_set_port_id, - (void *)&cmd_set_hash_input_set_flow_type, - (void *)&cmd_set_hash_input_set_field, - (void *)&cmd_set_hash_input_set_select, - NULL, - }, -}; - /* Set flow director input set */ struct cmd_set_fdir_input_set_result { cmdline_fixed_string_t set_fdir_input_set; @@ -19026,11 +18597,6 @@ cmdline_parse_ctx_t main_ctx[] = { (cmdline_parse_inst_t *)&cmd_set_flow_director_tunnel_mask, (cmdline_parse_inst_t *)&cmd_set_flow_director_flex_mask, (cmdline_parse_inst_t *)&cmd_set_flow_director_flex_payload, - (cmdline_parse_inst_t *)&cmd_get_sym_hash_ena_per_port, - (cmdline_parse_inst_t *)&cmd_set_sym_hash_ena_per_port, - (cmdline_parse_inst_t *)&cmd_get_hash_global_config, - (cmdline_parse_inst_t *)&cmd_set_hash_global_config, - (cmdline_parse_inst_t *)&cmd_set_hash_input_set, (cmdline_parse_inst_t *)&cmd_set_fdir_input_set, (cmdline_parse_inst_t *)&cmd_flow, (cmdline_parse_inst_t *)&cmd_show_port_meter_cap, diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst index a807cb9ad9..e245d04bf4 100644 --- a/doc/guides/rel_notes/deprecation.rst +++ b/doc/guides/rel_notes/deprecation.rst @@ -108,8 +108,8 @@ Deprecation Notices * ethdev: the legacy filter API, including ``rte_eth_dev_filter_supported()``, ``rte_eth_dev_filter_ctrl()`` as well - as filter types FDIR, - HASH and L2_TUNNEL, is superseded by the generic flow API (rte_flow) in + as filter types FDIR + and L2_TUNNEL, is superseded by the generic flow API (rte_flow) in PMDs that implement the latter. The legacy API will be removed in DPDK 20.11. diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c index 2badd024f1..cd57126aa5 100644 --- a/drivers/net/i40e/i40e_ethdev.c +++ b/drivers/net/i40e/i40e_ethdev.c @@ -8950,15 +8950,6 @@ i40e_filter_ctrl_global_config(struct rte_eth_dev *dev, return ret; } -/* Get the symmetric hash enable configurations per port */ -static void -i40e_get_symmetric_hash_enable_per_port(struct i40e_hw *hw, uint8_t *enable) -{ - uint32_t reg = i40e_read_rx_ctl(hw, I40E_PRTQF_CTL_0); - - *enable = reg & I40E_PRTQF_CTL_0_HSYM_ENA_MASK ? 1 : 0; -} - /* Set the symmetric hash enable configurations per port */ static void i40e_set_symmetric_hash_enable_per_port(struct i40e_hw *hw, uint8_t enable) @@ -8984,170 +8975,6 @@ i40e_set_symmetric_hash_enable_per_port(struct i40e_hw *hw, uint8_t enable) I40E_WRITE_FLUSH(hw); } -/* - * Get global configurations of hash function type and symmetric hash enable - * per flow type (pctype). Note that global configuration means it affects all - * the ports on the same NIC. - */ -static int -i40e_get_hash_filter_global_config(struct i40e_hw *hw, - struct rte_eth_hash_global_conf *g_cfg) -{ - struct i40e_adapter *adapter = (struct i40e_adapter *)hw->back; - uint32_t reg; - uint16_t i, j; - - memset(g_cfg, 0, sizeof(*g_cfg)); - reg = i40e_read_rx_ctl(hw, I40E_GLQF_CTL); - if (reg & I40E_GLQF_CTL_HTOEP_MASK) - g_cfg->hash_func = RTE_ETH_HASH_FUNCTION_TOEPLITZ; - else - g_cfg->hash_func = RTE_ETH_HASH_FUNCTION_SIMPLE_XOR; - PMD_DRV_LOG(DEBUG, "Hash function is %s", - (reg & I40E_GLQF_CTL_HTOEP_MASK) ? "Toeplitz" : "Simple XOR"); - - /* - * As i40e supports less than 64 flow types, only first 64 bits need to - * be checked. - */ - for (i = 1; i < RTE_SYM_HASH_MASK_ARRAY_SIZE; i++) { - g_cfg->valid_bit_mask[i] = 0ULL; - g_cfg->sym_hash_enable_mask[i] = 0ULL; - } - - g_cfg->valid_bit_mask[0] = adapter->flow_types_mask; - - for (i = RTE_ETH_FLOW_UNKNOWN + 1; i < UINT64_BIT; i++) { - if (!adapter->pctypes_tbl[i]) - continue; - for (j = I40E_FILTER_PCTYPE_INVALID + 1; - j < I40E_FILTER_PCTYPE_MAX; j++) { - if (adapter->pctypes_tbl[i] & (1ULL << j)) { - reg = i40e_read_rx_ctl(hw, I40E_GLQF_HSYM(j)); - if (reg & I40E_GLQF_HSYM_SYMH_ENA_MASK) { - g_cfg->sym_hash_enable_mask[0] |= - (1ULL << i); - } - } - } - } - - return 0; -} - -static int -i40e_hash_global_config_check(const struct i40e_adapter *adapter, - const struct rte_eth_hash_global_conf *g_cfg) -{ - uint32_t i; - uint64_t mask0, i40e_mask = adapter->flow_types_mask; - - if (g_cfg->hash_func != RTE_ETH_HASH_FUNCTION_TOEPLITZ && - g_cfg->hash_func != RTE_ETH_HASH_FUNCTION_SIMPLE_XOR && - g_cfg->hash_func != RTE_ETH_HASH_FUNCTION_DEFAULT) { - PMD_DRV_LOG(ERR, "Unsupported hash function type %d", - g_cfg->hash_func); - return -EINVAL; - } - - /* - * As i40e supports less than 64 flow types, only first 64 bits need to - * be checked. - */ - mask0 = g_cfg->valid_bit_mask[0]; - for (i = 0; i < RTE_SYM_HASH_MASK_ARRAY_SIZE; i++) { - if (i == 0) { - /* Check if any unsupported flow type configured */ - if ((mask0 | i40e_mask) ^ i40e_mask) - goto mask_err; - } else { - if (g_cfg->valid_bit_mask[i]) - goto mask_err; - } - } - - return 0; - -mask_err: - PMD_DRV_LOG(ERR, "i40e unsupported flow type bit(s) configured"); - - return -EINVAL; -} - -/* - * Set global configurations of hash function type and symmetric hash enable - * per flow type (pctype). Note any modifying global configuration will affect - * all the ports on the same NIC. - */ -static int -i40e_set_hash_filter_global_config(struct i40e_hw *hw, - struct rte_eth_hash_global_conf *g_cfg) -{ - struct i40e_adapter *adapter = (struct i40e_adapter *)hw->back; - struct i40e_pf *pf = &((struct i40e_adapter *)hw->back)->pf; - int ret; - uint16_t i, j; - uint32_t reg; - uint64_t mask0 = g_cfg->valid_bit_mask[0] & adapter->flow_types_mask; - - if (pf->support_multi_driver) { - PMD_DRV_LOG(ERR, "Hash global configuration is not supported."); - return -ENOTSUP; - } - - /* Check the input parameters */ - ret = i40e_hash_global_config_check(adapter, g_cfg); - if (ret < 0) - return ret; - - /* - * As i40e supports less than 64 flow types, only first 64 bits need to - * be configured. - */ - for (i = RTE_ETH_FLOW_UNKNOWN + 1; mask0 && i < UINT64_BIT; i++) { - if (mask0 & (1UL << i)) { - reg = (g_cfg->sym_hash_enable_mask[0] & (1ULL << i)) ? - I40E_GLQF_HSYM_SYMH_ENA_MASK : 0; - - for (j = I40E_FILTER_PCTYPE_INVALID + 1; - j < I40E_FILTER_PCTYPE_MAX; j++) { - if (adapter->pctypes_tbl[i] & (1ULL << j)) - i40e_write_global_rx_ctl(hw, - I40E_GLQF_HSYM(j), - reg); - } - } - } - - reg = i40e_read_rx_ctl(hw, I40E_GLQF_CTL); - if (g_cfg->hash_func == RTE_ETH_HASH_FUNCTION_TOEPLITZ) { - /* Toeplitz */ - if (reg & I40E_GLQF_CTL_HTOEP_MASK) { - PMD_DRV_LOG(DEBUG, - "Hash function already set to Toeplitz"); - goto out; - } - reg |= I40E_GLQF_CTL_HTOEP_MASK; - } else if (g_cfg->hash_func == RTE_ETH_HASH_FUNCTION_SIMPLE_XOR) { - /* Simple XOR */ - if (!(reg & I40E_GLQF_CTL_HTOEP_MASK)) { - PMD_DRV_LOG(DEBUG, - "Hash function already set to Simple XOR"); - goto out; - } - reg &= ~I40E_GLQF_CTL_HTOEP_MASK; - } else - /* Use the default, and keep it as it is */ - goto out; - - i40e_write_global_rx_ctl(hw, I40E_GLQF_CTL, reg); - -out: - I40E_WRITE_FLUSH(hw); - - return 0; -} - /** * Valid input sets for hash and flow director filters per PCTYPE */ @@ -9982,98 +9809,6 @@ i40e_fdir_filter_inset_select(struct i40e_pf *pf, return 0; } -static int -i40e_hash_filter_get(struct i40e_hw *hw, struct rte_eth_hash_filter_info *info) -{ - int ret = 0; - - if (!hw || !info) { - PMD_DRV_LOG(ERR, "Invalid pointer"); - return -EFAULT; - } - - switch (info->info_type) { - case RTE_ETH_HASH_FILTER_SYM_HASH_ENA_PER_PORT: - i40e_get_symmetric_hash_enable_per_port(hw, - &(info->info.enable)); - break; - case RTE_ETH_HASH_FILTER_GLOBAL_CONFIG: - ret = i40e_get_hash_filter_global_config(hw, - &(info->info.global_conf)); - break; - default: - PMD_DRV_LOG(ERR, "Hash filter info type (%d) not supported", - info->info_type); - ret = -EINVAL; - break; - } - - return ret; -} - -static int -i40e_hash_filter_set(struct i40e_hw *hw, struct rte_eth_hash_filter_info *info) -{ - int ret = 0; - - if (!hw || !info) { - PMD_DRV_LOG(ERR, "Invalid pointer"); - return -EFAULT; - } - - switch (info->info_type) { - case RTE_ETH_HASH_FILTER_SYM_HASH_ENA_PER_PORT: - i40e_set_symmetric_hash_enable_per_port(hw, info->info.enable); - break; - case RTE_ETH_HASH_FILTER_GLOBAL_CONFIG: - ret = i40e_set_hash_filter_global_config(hw, - &(info->info.global_conf)); - break; - case RTE_ETH_HASH_FILTER_INPUT_SET_SELECT: - ret = i40e_hash_filter_inset_select(hw, - &(info->info.input_set_conf)); - break; - - default: - PMD_DRV_LOG(ERR, "Hash filter info type (%d) not supported", - info->info_type); - ret = -EINVAL; - break; - } - - return ret; -} - -/* Operations for hash function */ -static int -i40e_hash_filter_ctrl(struct rte_eth_dev *dev, - enum rte_filter_op filter_op, - void *arg) -{ - struct i40e_hw *hw = I40E_DEV_PRIVATE_TO_HW(dev->data->dev_private); - int ret = 0; - - switch (filter_op) { - case RTE_ETH_FILTER_NOP: - break; - case RTE_ETH_FILTER_GET: - ret = i40e_hash_filter_get(hw, - (struct rte_eth_hash_filter_info *)arg); - break; - case RTE_ETH_FILTER_SET: - ret = i40e_hash_filter_set(hw, - (struct rte_eth_hash_filter_info *)arg); - break; - default: - PMD_DRV_LOG(WARNING, "Filter operation (%d) not supported", - filter_op); - ret = -ENOTSUP; - break; - } - - return ret; -} - /* Convert ethertype filter structure */ static int i40e_ethertype_filter_convert(const struct rte_eth_ethertype_filter *input, @@ -10255,9 +9990,6 @@ i40e_dev_filter_ctrl(struct rte_eth_dev *dev, /* For global configuration */ ret = i40e_filter_ctrl_global_config(dev, filter_op, arg); break; - case RTE_ETH_FILTER_HASH: - ret = i40e_hash_filter_ctrl(dev, filter_op, arg); - break; case RTE_ETH_FILTER_FDIR: ret = i40e_fdir_ctrl_func(dev, filter_op, arg); break; diff --git a/drivers/net/qede/qede_filter.c b/drivers/net/qede/qede_filter.c index ba4e4d9e16..283e7322cb 100644 --- a/drivers/net/qede/qede_filter.c +++ b/drivers/net/qede/qede_filter.c @@ -1241,7 +1241,6 @@ int qede_dev_filter_ctrl(struct rte_eth_dev *eth_dev, *(const void **)arg = &qede_flow_ops; return 0; - case RTE_ETH_FILTER_HASH: case RTE_ETH_FILTER_L2_TUNNEL: case RTE_ETH_FILTER_MAX: default: diff --git a/drivers/net/sfc/sfc_ethdev.c b/drivers/net/sfc/sfc_ethdev.c index 51d33f3710..c47f282450 100644 --- a/drivers/net/sfc/sfc_ethdev.c +++ b/drivers/net/sfc/sfc_ethdev.c @@ -1751,9 +1751,6 @@ sfc_dev_filter_ctrl(struct rte_eth_dev *dev, enum rte_filter_type filter_type, case RTE_ETH_FILTER_FDIR: sfc_err(sa, "Flow Director filters not supported"); break; - case RTE_ETH_FILTER_HASH: - sfc_err(sa, "Hash filters not supported"); - break; case RTE_ETH_FILTER_GENERIC: if (filter_op != RTE_ETH_FILTER_GET) { rc = EINVAL; diff --git a/lib/librte_ethdev/rte_eth_ctrl.h b/lib/librte_ethdev/rte_eth_ctrl.h index b4cc163e3e..4c9bd9b0fa 100644 --- a/lib/librte_ethdev/rte_eth_ctrl.h +++ b/lib/librte_ethdev/rte_eth_ctrl.h @@ -616,63 +616,6 @@ struct rte_eth_fdir_filter_info { } info; }; -/** - * Hash filter information types. - * - RTE_ETH_HASH_FILTER_SYM_HASH_ENA_PER_PORT is for getting/setting the - * information/configuration of 'symmetric hash enable' per port. - * - RTE_ETH_HASH_FILTER_GLOBAL_CONFIG is for getting/setting the global - * configurations of hash filters. Those global configurations are valid - * for all ports of the same NIC. - * - RTE_ETH_HASH_FILTER_INPUT_SET_SELECT is for setting the global - * hash input set fields - */ -enum rte_eth_hash_filter_info_type { - RTE_ETH_HASH_FILTER_INFO_TYPE_UNKNOWN = 0, - /** Symmetric hash enable per port */ - RTE_ETH_HASH_FILTER_SYM_HASH_ENA_PER_PORT, - /** Configure globally for hash filter */ - RTE_ETH_HASH_FILTER_GLOBAL_CONFIG, - /** Global Hash filter input set configuration */ - RTE_ETH_HASH_FILTER_INPUT_SET_SELECT, - RTE_ETH_HASH_FILTER_INFO_TYPE_MAX, -}; - -#define RTE_SYM_HASH_MASK_ARRAY_SIZE \ - (RTE_ALIGN(RTE_ETH_FLOW_MAX, UINT64_BIT)/UINT64_BIT) -/** - * A structure used to set or get global hash function configurations which - * include symmetric hash enable per flow type and hash function type. - * Each bit in sym_hash_enable_mask[] indicates if the symmetric hash of the - * corresponding flow type is enabled or not. - * Each bit in valid_bit_mask[] indicates if the corresponding bit in - * sym_hash_enable_mask[] is valid or not. For the configurations gotten, it - * also means if the flow type is supported by hardware or not. - */ -struct rte_eth_hash_global_conf { - enum rte_eth_hash_function hash_func; /**< Hash function type */ - /** Bit mask for symmetric hash enable per flow type */ - uint64_t sym_hash_enable_mask[RTE_SYM_HASH_MASK_ARRAY_SIZE]; - /** Bit mask indicates if the corresponding bit is valid */ - uint64_t valid_bit_mask[RTE_SYM_HASH_MASK_ARRAY_SIZE]; -}; - -/** - * A structure used to set or get hash filter information, to support filter - * type of 'RTE_ETH_FILTER_HASH' and its operations. - */ -struct rte_eth_hash_filter_info { - enum rte_eth_hash_filter_info_type info_type; /**< Information type */ - /** Details of hash filter information */ - union { - /** For RTE_ETH_HASH_FILTER_SYM_HASH_ENA_PER_PORT */ - uint8_t enable; - /** Global configurations of hash filter */ - struct rte_eth_hash_global_conf global_conf; - /** Global configurations of hash filter input set */ - struct rte_eth_input_set_conf input_set_conf; - } info; -}; - /** * l2 tunnel configuration. */ From patchwork Sun Oct 18 14:09:07 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Rybchenko X-Patchwork-Id: 81266 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 7C93EA04B0; Sun, 18 Oct 2020 16:13:13 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 1DB59E261; Sun, 18 Oct 2020 16:09:44 +0200 (CEST) Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [67.231.154.164]) by dpdk.org (Postfix) with ESMTP id 64E33C9BE for ; Sun, 18 Oct 2020 16:09:29 +0200 (CEST) Received: from mx1-us1.ppe-hosted.com (unknown [10.110.50.143]) by dispatch1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 0BE4920059; Sun, 18 Oct 2020 14:09:28 +0000 (UTC) Received: from us4-mdac16-58.at1.mdlocal (unknown [10.110.50.151]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 0A06B8009B; Sun, 18 Oct 2020 14:09:28 +0000 (UTC) X-Virus-Scanned: Proofpoint Essentials engine Received: from mx1-us1.ppe-hosted.com (unknown [10.110.50.12]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 8E6E04006E; Sun, 18 Oct 2020 14:09:27 +0000 (UTC) Received: from webmail.solarflare.com (uk.solarflare.com [193.34.186.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 559004005B; Sun, 18 Oct 2020 14:09:27 +0000 (UTC) Received: from ukex01.SolarFlarecom.com (10.17.10.4) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Sun, 18 Oct 2020 15:09:22 +0100 Received: from opal.uk.solarflarecom.com (10.17.10.1) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Sun, 18 Oct 2020 15:09:22 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (ukv-loginhost.uk.solarflarecom.com [10.17.10.39]) by opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id 09IE9MaH002058; Sun, 18 Oct 2020 15:09:22 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1]) by ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id 237961613A9; Sun, 18 Oct 2020 15:09:22 +0100 (BST) From: Andrew Rybchenko To: Wenzhuo Lu , Beilei Xing , Bernard Iremonger , Ray Kinsella , Neil Horman , Jeff Guo , Haiyue Wang , Rasesh Mody , Shahed Shaikh CC: Date: Sun, 18 Oct 2020 15:09:07 +0100 Message-ID: <1603030152-13451-11-git-send-email-arybchenko@solarflare.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1603030152-13451-1-git-send-email-arybchenko@solarflare.com> References: <1603030152-13451-1-git-send-email-arybchenko@solarflare.com> MIME-Version: 1.0 X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.6.1012-25732.003 X-TM-AS-Result: No-12.546300-8.000000-10 X-TMASE-MatchedRID: JXE/D59dZJ8eLqe5xuVHPqiUivh0j2PvY/L2/AZJAWSYkF7ZtFfCU4wW IRmLVWq5NNN0dk/lb45w5T4Iaj538mJZXQNDzktSGjzBgnFZvQ4P6OWzRxLAk0jINjnv2/BMH0G q6gh+ZlCbr1TE2UQIcdwzSNMHSlxQSkJz50w3SpFXq5HtSh5C5DsgUw68UQrYm5BJdUjD+FXp4z 9wZIUHUl+aQGZyt3ZNCAH9se4egZPoYlaEA2MZkQe06kQGFaIWL8Ia5qicU7sm3tlnC/E6VFJIz DmnG+R7zg2NZRYtOavQmVhqZyUK/N3ayerUAluezNIobH2DzGETTY+vgKQ1I9qUml4VvcDYBOp/ 8ODZzPwBEo6q9vmy/7Jz/M7YZ1g8Vdgv/fqHkl7HmyDJSEsI230tCKdnhB589yM15V5aWpj6C0e Ps7A07cNbTFVOzjU8BpV5LAw5Qw96QzO4HoVQBUXYzcsJWdzliExnoWnopHY= X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10--12.546300-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.6.1012-25732.003 X-MDID: 1603030168-A4Ha3F3S17RY X-PPE-DISP: 1603030168;A4Ha3F3S17RY Subject: [dpdk-dev] [PATCH 10/14] ethdev: remove legacy L2_TUNNEL filter type support X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" RTE flow API should be used for filtering. Preserve RTE_ETH_FILTER_L2_TUNNEL since it is used in drivers internally in RTE flow API support. rte_eth_l2_tunnel_conf structure is used in other ethdev API functions. Signed-off-by: Andrew Rybchenko Acked-by: Haiyue Wang --- app/test-pmd/cmdline.c | 123 --------------------------- doc/guides/rel_notes/deprecation.rst | 3 +- drivers/net/ixgbe/ixgbe_ethdev.c | 48 ----------- drivers/net/qede/qede_filter.c | 1 - 4 files changed, 1 insertion(+), 174 deletions(-) diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c index 713e1cad83..b031fb94b2 100644 --- a/app/test-pmd/cmdline.c +++ b/app/test-pmd/cmdline.c @@ -664,13 +664,6 @@ static void cmd_help_long_parsed(void *parsed_result, " Enable/disable E-tag based forwarding" " on a port\n\n" - "E-tag set filter add e-tag-id (value) dst-pool" - " (pool_id) port (port_id)\n" - " Add an E-tag forwarding filter on a port\n\n" - - "E-tag set filter del e-tag-id (value) port (port_id)\n" - " Delete an E-tag forwarding filter on a port\n\n" - "ddp add (port_id) (profile_path[,backup_profile_path])\n" " Load a profile package on a port\n\n" @@ -12199,120 +12192,6 @@ cmdline_parse_inst_t cmd_config_e_tag_forwarding_en_dis = { }, }; -/* E-tag filter configuration */ -static void -cmd_config_e_tag_filter_add_parsed( - void *parsed_result, - __rte_unused struct cmdline *cl, - __rte_unused void *data) -{ - struct cmd_config_e_tag_result *res = parsed_result; - struct rte_eth_l2_tunnel_conf entry; - int ret = 0; - - if (port_id_is_invalid(res->port_id, ENABLED_WARN)) - return; - - if (res->e_tag_id_val > 0x3fff) { - printf("e-tag-id must be equal or less than 0x3fff.\n"); - return; - } - - ret = rte_eth_dev_filter_supported(res->port_id, - RTE_ETH_FILTER_L2_TUNNEL); - if (ret < 0) { - printf("E-tag filter is not supported on port %u.\n", - res->port_id); - return; - } - - entry.l2_tunnel_type = RTE_L2_TUNNEL_TYPE_E_TAG; - entry.tunnel_id = res->e_tag_id_val; - entry.pool = res->dst_pool_val; - - ret = rte_eth_dev_filter_ctrl(res->port_id, - RTE_ETH_FILTER_L2_TUNNEL, - RTE_ETH_FILTER_ADD, - &entry); - if (ret < 0) - printf("E-tag filter programming error: (%s)\n", - strerror(-ret)); -} - -cmdline_parse_inst_t cmd_config_e_tag_filter_add = { - .f = cmd_config_e_tag_filter_add_parsed, - .data = NULL, - .help_str = "E-tag ... : E-tag filter add", - .tokens = { - (void *)&cmd_config_e_tag_e_tag, - (void *)&cmd_config_e_tag_set, - (void *)&cmd_config_e_tag_filter, - (void *)&cmd_config_e_tag_add, - (void *)&cmd_config_e_tag_e_tag_id, - (void *)&cmd_config_e_tag_e_tag_id_val, - (void *)&cmd_config_e_tag_dst_pool, - (void *)&cmd_config_e_tag_dst_pool_val, - (void *)&cmd_config_e_tag_port, - (void *)&cmd_config_e_tag_port_id, - NULL, - }, -}; - -static void -cmd_config_e_tag_filter_del_parsed( - void *parsed_result, - __rte_unused struct cmdline *cl, - __rte_unused void *data) -{ - struct cmd_config_e_tag_result *res = parsed_result; - struct rte_eth_l2_tunnel_conf entry; - int ret = 0; - - if (port_id_is_invalid(res->port_id, ENABLED_WARN)) - return; - - if (res->e_tag_id_val > 0x3fff) { - printf("e-tag-id must be less than 0x3fff.\n"); - return; - } - - ret = rte_eth_dev_filter_supported(res->port_id, - RTE_ETH_FILTER_L2_TUNNEL); - if (ret < 0) { - printf("E-tag filter is not supported on port %u.\n", - res->port_id); - return; - } - - entry.l2_tunnel_type = RTE_L2_TUNNEL_TYPE_E_TAG; - entry.tunnel_id = res->e_tag_id_val; - - ret = rte_eth_dev_filter_ctrl(res->port_id, - RTE_ETH_FILTER_L2_TUNNEL, - RTE_ETH_FILTER_DELETE, - &entry); - if (ret < 0) - printf("E-tag filter programming error: (%s)\n", - strerror(-ret)); -} - -cmdline_parse_inst_t cmd_config_e_tag_filter_del = { - .f = cmd_config_e_tag_filter_del_parsed, - .data = NULL, - .help_str = "E-tag ... : E-tag filter delete", - .tokens = { - (void *)&cmd_config_e_tag_e_tag, - (void *)&cmd_config_e_tag_set, - (void *)&cmd_config_e_tag_filter, - (void *)&cmd_config_e_tag_del, - (void *)&cmd_config_e_tag_e_tag_id, - (void *)&cmd_config_e_tag_e_tag_id_val, - (void *)&cmd_config_e_tag_port, - (void *)&cmd_config_e_tag_port_id, - NULL, - }, -}; - /* vf vlan anti spoof configuration */ /* Common result structure for vf vlan anti spoof */ @@ -18621,8 +18500,6 @@ cmdline_parse_ctx_t main_ctx[] = { (cmdline_parse_inst_t *)&cmd_config_e_tag_insertion_dis, (cmdline_parse_inst_t *)&cmd_config_e_tag_stripping_en_dis, (cmdline_parse_inst_t *)&cmd_config_e_tag_forwarding_en_dis, - (cmdline_parse_inst_t *)&cmd_config_e_tag_filter_add, - (cmdline_parse_inst_t *)&cmd_config_e_tag_filter_del, (cmdline_parse_inst_t *)&cmd_set_vf_vlan_anti_spoof, (cmdline_parse_inst_t *)&cmd_set_vf_mac_anti_spoof, (cmdline_parse_inst_t *)&cmd_set_vf_vlan_stripq, diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst index e245d04bf4..3d241c08e8 100644 --- a/doc/guides/rel_notes/deprecation.rst +++ b/doc/guides/rel_notes/deprecation.rst @@ -108,8 +108,7 @@ Deprecation Notices * ethdev: the legacy filter API, including ``rte_eth_dev_filter_supported()``, ``rte_eth_dev_filter_ctrl()`` as well - as filter types FDIR - and L2_TUNNEL, is superseded by the generic flow API (rte_flow) in + as filter types FDIR, is superseded by the generic flow API (rte_flow) in PMDs that implement the latter. The legacy API will be removed in DPDK 20.11. diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c index 8c02c0c859..2a0f1761ba 100644 --- a/drivers/net/ixgbe/ixgbe_ethdev.c +++ b/drivers/net/ixgbe/ixgbe_ethdev.c @@ -355,9 +355,6 @@ static int ixgbe_dev_l2_tunnel_offload_set struct rte_eth_l2_tunnel_conf *l2_tunnel, uint32_t mask, uint8_t en); -static int ixgbe_dev_l2_tunnel_filter_handle(struct rte_eth_dev *dev, - enum rte_filter_op filter_op, - void *arg); static int ixgbe_dev_udp_tunnel_port_add(struct rte_eth_dev *dev, struct rte_eth_udp_tunnel *udp_tunnel); @@ -6813,9 +6810,6 @@ ixgbe_dev_filter_ctrl(struct rte_eth_dev *dev, case RTE_ETH_FILTER_FDIR: ret = ixgbe_fdir_ctrl_func(dev, filter_op, arg); break; - case RTE_ETH_FILTER_L2_TUNNEL: - ret = ixgbe_dev_l2_tunnel_filter_handle(dev, filter_op, arg); - break; case RTE_ETH_FILTER_GENERIC: if (filter_op != RTE_ETH_FILTER_GET) return -EINVAL; @@ -7887,48 +7881,6 @@ ixgbe_dev_l2_tunnel_filter_del(struct rte_eth_dev *dev, return ret; } -/** - * ixgbe_dev_l2_tunnel_filter_handle - Handle operations for l2 tunnel filter. - * @dev: pointer to rte_eth_dev structure - * @filter_op:operation will be taken. - * @arg: a pointer to specific structure corresponding to the filter_op - */ -static int -ixgbe_dev_l2_tunnel_filter_handle(struct rte_eth_dev *dev, - enum rte_filter_op filter_op, - void *arg) -{ - int ret; - - if (filter_op == RTE_ETH_FILTER_NOP) - return 0; - - if (arg == NULL) { - PMD_DRV_LOG(ERR, "arg shouldn't be NULL for operation %u.", - filter_op); - return -EINVAL; - } - - switch (filter_op) { - case RTE_ETH_FILTER_ADD: - ret = ixgbe_dev_l2_tunnel_filter_add - (dev, - (struct rte_eth_l2_tunnel_conf *)arg, - FALSE); - break; - case RTE_ETH_FILTER_DELETE: - ret = ixgbe_dev_l2_tunnel_filter_del - (dev, - (struct rte_eth_l2_tunnel_conf *)arg); - break; - default: - PMD_DRV_LOG(ERR, "unsupported operation %u.", filter_op); - ret = -EINVAL; - break; - } - return ret; -} - static int ixgbe_e_tag_forwarding_en_dis(struct rte_eth_dev *dev, bool en) { diff --git a/drivers/net/qede/qede_filter.c b/drivers/net/qede/qede_filter.c index 283e7322cb..a9870338aa 100644 --- a/drivers/net/qede/qede_filter.c +++ b/drivers/net/qede/qede_filter.c @@ -1241,7 +1241,6 @@ int qede_dev_filter_ctrl(struct rte_eth_dev *eth_dev, *(const void **)arg = &qede_flow_ops; return 0; - case RTE_ETH_FILTER_L2_TUNNEL: case RTE_ETH_FILTER_MAX: default: DP_ERR(edev, "Unsupported filter type %d\n", From patchwork Sun Oct 18 14:09:08 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Rybchenko X-Patchwork-Id: 81268 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id C09D6A04B0; Sun, 18 Oct 2020 16:13:50 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 11D6CE271; Sun, 18 Oct 2020 16:09:47 +0200 (CEST) Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [67.231.154.164]) by dpdk.org (Postfix) with ESMTP id 6D082C9D6 for ; Sun, 18 Oct 2020 16:09:30 +0200 (CEST) Received: from mx1-us1.ppe-hosted.com (unknown [10.110.50.143]) by dispatch1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 1454B2005B; Sun, 18 Oct 2020 14:09:29 +0000 (UTC) Received: from us4-mdac16-58.at1.mdlocal (unknown [10.110.50.151]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 12D588009B; Sun, 18 Oct 2020 14:09:29 +0000 (UTC) X-Virus-Scanned: Proofpoint Essentials engine Received: from mx1-us1.ppe-hosted.com (unknown [10.110.50.12]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 6C34640058; Sun, 18 Oct 2020 14:09:28 +0000 (UTC) Received: from webmail.solarflare.com (uk.solarflare.com [193.34.186.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 34AD34005B; Sun, 18 Oct 2020 14:09:28 +0000 (UTC) Received: from ukex01.SolarFlarecom.com (10.17.10.4) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Sun, 18 Oct 2020 15:09:22 +0100 Received: from opal.uk.solarflarecom.com (10.17.10.1) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Sun, 18 Oct 2020 15:09:22 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (ukv-loginhost.uk.solarflarecom.com [10.17.10.39]) by opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id 09IE9M9B002061; Sun, 18 Oct 2020 15:09:22 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1]) by ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id 83FFC1613A9; Sun, 18 Oct 2020 15:09:22 +0100 (BST) From: Andrew Rybchenko To: Wenzhuo Lu , Beilei Xing , Bernard Iremonger , Jeff Guo , Andrew Rybchenko CC: Date: Sun, 18 Oct 2020 15:09:08 +0100 Message-ID: <1603030152-13451-12-git-send-email-arybchenko@solarflare.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1603030152-13451-1-git-send-email-arybchenko@solarflare.com> References: <1603030152-13451-1-git-send-email-arybchenko@solarflare.com> MIME-Version: 1.0 X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.6.1012-25732.003 X-TM-AS-Result: No-12.204100-8.000000-10 X-TMASE-MatchedRID: ohoUSlLQf7g3VOJ/TfTyYqiUivh0j2Pv6VTG9cZxEjIGmHr1eMxt2UAc 6DyoS2rIVvq8yHKcgGYZ8qPLmG6jLKHtjelygRNaT3nBCKOvAEsftukM6FmmNlVkJxysad/IwWa hHScmYz2au/g7THWIlSqMTOH4Gwd/NIzp/jaWjgWHZXNSWjgdU/bXnlulH5Mg4uxAgOavdLnWL+ uSWvz6yvhDXn1cOiK86/gEG4B+WmxUzR/yBHQjZiqwx8x+s5lFgcsVZH3dOCRXy6SPHzrw7tShv IchwjOu3Mb6qXoihXCHEeMTfR0Cex8TzIzimOwPC24oEZ6SpSkj80Za3RRg8FAXJT8OOXC8N8Vn 6FfcL/ayiXAVXPhGI6Hzz3neIafzbIanyU/Hs7M= X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10--12.204100-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.6.1012-25732.003 X-MDID: 1603030168-vkQl0RwqpC23 X-PPE-DISP: 1603030168;vkQl0RwqpC23 Subject: [dpdk-dev] [PATCH 11/14] ethdev: remove legacy global filter configuration support X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Signed-off-by: Andrew Rybchenko --- app/test-pmd/cmdline.c | 57 ---------------------------------- drivers/net/i40e/i40e_ethdev.c | 45 --------------------------- drivers/net/sfc/sfc_ethdev.c | 3 -- 3 files changed, 105 deletions(-) diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c index b031fb94b2..9abe8659f5 100644 --- a/app/test-pmd/cmdline.c +++ b/app/test-pmd/cmdline.c @@ -9295,62 +9295,6 @@ cmdline_parse_inst_t cmd_cfg_tunnel_udp_port = { }, }; -/* *** GLOBAL CONFIG *** */ -struct cmd_global_config_result { - cmdline_fixed_string_t cmd; - portid_t port_id; - cmdline_fixed_string_t cfg_type; - uint8_t len; -}; - -static void -cmd_global_config_parsed(void *parsed_result, - __rte_unused struct cmdline *cl, - __rte_unused void *data) -{ - struct cmd_global_config_result *res = parsed_result; - struct rte_eth_global_cfg conf; - int ret; - - memset(&conf, 0, sizeof(conf)); - conf.cfg_type = RTE_ETH_GLOBAL_CFG_TYPE_GRE_KEY_LEN; - conf.cfg.gre_key_len = res->len; - ret = rte_eth_dev_filter_ctrl(res->port_id, RTE_ETH_FILTER_NONE, - RTE_ETH_FILTER_SET, &conf); -#ifdef RTE_LIBRTE_I40E_PMD - if (ret == -ENOTSUP) - ret = rte_pmd_i40e_set_gre_key_len(res->port_id, res->len); -#endif - if (ret != 0) - printf("Global config error\n"); -} - -cmdline_parse_token_string_t cmd_global_config_cmd = - TOKEN_STRING_INITIALIZER(struct cmd_global_config_result, cmd, - "global_config"); -cmdline_parse_token_num_t cmd_global_config_port_id = - TOKEN_NUM_INITIALIZER(struct cmd_global_config_result, port_id, - UINT16); -cmdline_parse_token_string_t cmd_global_config_type = - TOKEN_STRING_INITIALIZER(struct cmd_global_config_result, - cfg_type, "gre-key-len"); -cmdline_parse_token_num_t cmd_global_config_gre_key_len = - TOKEN_NUM_INITIALIZER(struct cmd_global_config_result, - len, UINT8); - -cmdline_parse_inst_t cmd_global_config = { - .f = cmd_global_config_parsed, - .data = (void *)NULL, - .help_str = "global_config gre-key-len ", - .tokens = { - (void *)&cmd_global_config_cmd, - (void *)&cmd_global_config_port_id, - (void *)&cmd_global_config_type, - (void *)&cmd_global_config_gre_key_len, - NULL, - }, -}; - /* *** CONFIGURE VM MIRROR VLAN/POOL RULE *** */ struct cmd_set_mirror_mask_result { cmdline_fixed_string_t set; @@ -18454,7 +18398,6 @@ cmdline_parse_ctx_t main_ctx[] = { (cmdline_parse_inst_t *)&cmd_vf_mac_addr_filter, (cmdline_parse_inst_t *)&cmd_queue_rate_limit, (cmdline_parse_inst_t *)&cmd_tunnel_udp_config, - (cmdline_parse_inst_t *)&cmd_global_config, (cmdline_parse_inst_t *)&cmd_set_mirror_mask, (cmdline_parse_inst_t *)&cmd_set_mirror_link, (cmdline_parse_inst_t *)&cmd_reset_mirror_rule, diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c index cd57126aa5..9d6d482aba 100644 --- a/drivers/net/i40e/i40e_ethdev.c +++ b/drivers/net/i40e/i40e_ethdev.c @@ -8909,47 +8909,6 @@ i40e_dev_set_gre_key_len(struct i40e_hw *hw, uint8_t len) return ret; } -static int -i40e_dev_global_config_set(struct i40e_hw *hw, struct rte_eth_global_cfg *cfg) -{ - int ret = -EINVAL; - - if (!hw || !cfg) - return -EINVAL; - - switch (cfg->cfg_type) { - case RTE_ETH_GLOBAL_CFG_TYPE_GRE_KEY_LEN: - ret = i40e_dev_set_gre_key_len(hw, cfg->cfg.gre_key_len); - break; - default: - PMD_DRV_LOG(ERR, "Unknown config type %u", cfg->cfg_type); - break; - } - - return ret; -} - -static int -i40e_filter_ctrl_global_config(struct rte_eth_dev *dev, - enum rte_filter_op filter_op, - void *arg) -{ - struct i40e_hw *hw = I40E_DEV_PRIVATE_TO_HW(dev->data->dev_private); - int ret = I40E_ERR_PARAM; - - switch (filter_op) { - case RTE_ETH_FILTER_SET: - ret = i40e_dev_global_config_set(hw, - (struct rte_eth_global_cfg *)arg); - break; - default: - PMD_DRV_LOG(ERR, "unknown operation %u", filter_op); - break; - } - - return ret; -} - /* Set the symmetric hash enable configurations per port */ static void i40e_set_symmetric_hash_enable_per_port(struct i40e_hw *hw, uint8_t enable) @@ -9986,10 +9945,6 @@ i40e_dev_filter_ctrl(struct rte_eth_dev *dev, return -EINVAL; switch (filter_type) { - case RTE_ETH_FILTER_NONE: - /* For global configuration */ - ret = i40e_filter_ctrl_global_config(dev, filter_op, arg); - break; case RTE_ETH_FILTER_FDIR: ret = i40e_fdir_ctrl_func(dev, filter_op, arg); break; diff --git a/drivers/net/sfc/sfc_ethdev.c b/drivers/net/sfc/sfc_ethdev.c index c47f282450..1437af15e0 100644 --- a/drivers/net/sfc/sfc_ethdev.c +++ b/drivers/net/sfc/sfc_ethdev.c @@ -1745,9 +1745,6 @@ sfc_dev_filter_ctrl(struct rte_eth_dev *dev, enum rte_filter_type filter_type, sfc_log_init(sa, "entry"); switch (filter_type) { - case RTE_ETH_FILTER_NONE: - sfc_err(sa, "Global filters configuration not supported"); - break; case RTE_ETH_FILTER_FDIR: sfc_err(sa, "Flow Director filters not supported"); break; From patchwork Sun Oct 18 14:09:09 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Rybchenko X-Patchwork-Id: 81271 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 1F80AA04B0; Sun, 18 Oct 2020 16:14:58 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id AC72CE29F; Sun, 18 Oct 2020 16:09:51 +0200 (CEST) Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [67.231.154.164]) by dpdk.org (Postfix) with ESMTP id 2A32AD019 for ; Sun, 18 Oct 2020 16:09:33 +0200 (CEST) Received: from mx1-us1.ppe-hosted.com (unknown [10.110.50.144]) by dispatch1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id C693820051; Sun, 18 Oct 2020 14:09:31 +0000 (UTC) Received: from us4-mdac16-71.at1.mdlocal (unknown [10.110.50.187]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id C42D1800A4; Sun, 18 Oct 2020 14:09:31 +0000 (UTC) X-Virus-Scanned: Proofpoint Essentials engine Received: from mx1-us1.ppe-hosted.com (unknown [10.110.49.105]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id B20AA4004D; Sun, 18 Oct 2020 14:09:30 +0000 (UTC) Received: from webmail.solarflare.com (uk.solarflare.com [193.34.186.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 403319C0075; Sun, 18 Oct 2020 14:09:30 +0000 (UTC) Received: from ukex01.SolarFlarecom.com (10.17.10.4) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Sun, 18 Oct 2020 15:09:23 +0100 Received: from opal.uk.solarflarecom.com (10.17.10.1) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Sun, 18 Oct 2020 15:09:23 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (ukv-loginhost.uk.solarflarecom.com [10.17.10.39]) by opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id 09IE9Nib002064; Sun, 18 Oct 2020 15:09:23 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1]) by ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id 696F81613A9; Sun, 18 Oct 2020 15:09:23 +0100 (BST) From: Andrew Rybchenko To: Wenzhuo Lu , Beilei Xing , Bernard Iremonger , Ray Kinsella , Neil Horman , Ajit Khaparde , Somnath Kotur , John Daley , Hyong Youb Kim , Jeff Guo , Haiyue Wang , Matan Azrad , Shahaf Shuler , Viacheslav Ovsiienko , Rasesh Mody , Shahed Shaikh , Andrew Rybchenko , Thomas Monjalon , Ferruh Yigit CC: Date: Sun, 18 Oct 2020 15:09:09 +0100 Message-ID: <1603030152-13451-13-git-send-email-arybchenko@solarflare.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1603030152-13451-1-git-send-email-arybchenko@solarflare.com> References: <1603030152-13451-1-git-send-email-arybchenko@solarflare.com> MIME-Version: 1.0 X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.6.1012-25732.003 X-TM-AS-Result: No-20.927100-8.000000-10 X-TMASE-MatchedRID: JWrVUfqEc/g3VOJ/TfTyYsPRlYRmv+e2eouvej40T4gd0WOKRkwsh3Io zGa69omdrdoLblq9S5ra/g/NGTW3MlEVLebBSQmnT7O/YHJhINCosxQx1ZmPoyejgKDUPU+kjvb YUb02fd2EWGo5Z4NHnzIwngA0QaYQyVynYqyLE4lFeAr5guIYJi9Xl/s/QdUMDpCUEeEFm7ANih 9C4BdvuM/xOJyBBYo2DAzQpcIVpJ9LZMxjfOjQZJCB65RjRY3s8gryAriuOnJPvOpmjDN2kvk5s tlawMzyOj9NUJNmR6HqCtuhwLl/3TxTO0Mow+I2ndu3heVAxaNrLj3DxYBIN9Wb/MXO2XdL4Wj9 iaClAknUMLt6O2cSLvX5ePN7snT9MNC3Xj2tG7J1e7Xbb6Im2piRrzOxSJsaDO+DX+rUwfbKI7L BTiD0BFkJmyytHaS1vjUAj3ByHpsh3Xy1KnQIRAOuQN0haneGlHLUcNM85drbspKx4YOD3Sc5aF ljLyod2hXFEJGveWBnZcJaskOydudh/6qxREAqD3uYMxd01bdw8Aq1WXxkINSw0KJYcxFxNUIc8 ma/DM9jOSK6gdHeiqa2chQU3dVksXqem1oR8/9P/rG0HwqkGD2Zm52NqgyJVI7KaIl9Nhdt2O1+ BxhBG4nW3wzbPO88LrKzEYEs9p4ZagUy2as2F0RWpBb0G+2p9/plKg1lCsgGiFdFNUvOD+DGRKQ QH0piw/NjeNjBB/Cs5JgNYAFVjkPbYPqd/GaJFhmgoA99DoL8SjXSxldPUz8fBHJpFUzVyvFcoB pD/5ymIQEDymkBjVnJbES9mdxAarIyJX72yAueAiCmPx4NwGmRqNBHmBveg6X7YSXnSlqZv9WvR V/RbgtuKBGekqUpPjKoPgsq7cA= X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10--20.927100-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.6.1012-25732.003 X-MDID: 1603030171-yoHkkWLNpiP9 X-PPE-DISP: 1603030171;yoHkkWLNpiP9 Subject: [dpdk-dev] [PATCH 12/14] ethdev: remove legacy FDIR filter type support X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" RTE flow API should be used for filtering. Signed-off-by: Andrew Rybchenko Acked-by: Ajit Khaparde Acked-by: Haiyue Wang --- app/test-pmd/cmdline.c | 897 +++------------------------ app/test-pmd/config.c | 15 +- app/test-pmd/testpmd.h | 2 + doc/guides/rel_notes/deprecation.rst | 4 +- drivers/net/bnxt/bnxt_ethdev.c | 396 ------------ drivers/net/enic/enic.h | 7 - drivers/net/enic/enic_clsf.c | 168 ----- drivers/net/enic/enic_ethdev.c | 48 -- drivers/net/i40e/i40e_ethdev.c | 86 --- drivers/net/i40e/i40e_ethdev.h | 11 +- drivers/net/i40e/i40e_fdir.c | 539 ---------------- drivers/net/ixgbe/ixgbe_ethdev.c | 5 +- drivers/net/ixgbe/ixgbe_ethdev.h | 2 - drivers/net/ixgbe/ixgbe_fdir.c | 220 ------- drivers/net/mlx5/mlx5.h | 1 - drivers/net/mlx5/mlx5_flow.c | 516 --------------- drivers/net/mlx5/mlx5_flow.h | 8 - drivers/net/qede/qede_ethdev.h | 5 - drivers/net/qede/qede_filter.c | 171 ----- drivers/net/sfc/sfc_ethdev.c | 3 - lib/librte_ethdev/rte_eth_ctrl.h | 27 +- 21 files changed, 81 insertions(+), 3050 deletions(-) diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c index 9abe8659f5..9ce6c09567 100644 --- a/app/test-pmd/cmdline.c +++ b/app/test-pmd/cmdline.c @@ -959,62 +959,12 @@ static void cmd_help_long_parsed(void *parsed_result, "filters:\n" "--------\n\n" - "flow_director_filter (port_id) mode IP (add|del|update)" - " flow (ipv4-other|ipv4-frag|ipv6-other|ipv6-frag)" - " src (src_ip_address) dst (dst_ip_address)" - " tos (tos_value) proto (proto_value) ttl (ttl_value)" - " vlan (vlan_value) flexbytes (flexbytes_value)" - " (drop|fwd) pf|vf(vf_id) queue (queue_id)" - " fd_id (fd_id_value)\n" - " Add/Del an IP type flow director filter.\n\n" - - "flow_director_filter (port_id) mode IP (add|del|update)" - " flow (ipv4-tcp|ipv4-udp|ipv6-tcp|ipv6-udp)" - " src (src_ip_address) (src_port)" - " dst (dst_ip_address) (dst_port)" - " tos (tos_value) ttl (ttl_value)" - " vlan (vlan_value) flexbytes (flexbytes_value)" - " (drop|fwd) pf|vf(vf_id) queue (queue_id)" - " fd_id (fd_id_value)\n" - " Add/Del an UDP/TCP type flow director filter.\n\n" - - "flow_director_filter (port_id) mode IP (add|del|update)" - " flow (ipv4-sctp|ipv6-sctp)" - " src (src_ip_address) (src_port)" - " dst (dst_ip_address) (dst_port)" - " tag (verification_tag) " - " tos (tos_value) ttl (ttl_value)" - " vlan (vlan_value)" - " flexbytes (flexbytes_value) (drop|fwd)" - " pf|vf(vf_id) queue (queue_id) fd_id (fd_id_value)\n" - " Add/Del a SCTP type flow director filter.\n\n" - - "flow_director_filter (port_id) mode IP (add|del|update)" - " flow l2_payload ether (ethertype)" - " flexbytes (flexbytes_value) (drop|fwd)" - " pf|vf(vf_id) queue (queue_id) fd_id (fd_id_value)\n" - " Add/Del a l2 payload type flow director filter.\n\n" - - "flow_director_filter (port_id) mode MAC-VLAN (add|del|update)" - " mac (mac_address) vlan (vlan_value)" - " flexbytes (flexbytes_value) (drop|fwd)" - " queue (queue_id) fd_id (fd_id_value)\n" - " Add/Del a MAC-VLAN flow director filter.\n\n" - - "flow_director_filter (port_id) mode Tunnel (add|del|update)" - " mac (mac_address) vlan (vlan_value)" - " tunnel (NVGRE|VxLAN) tunnel-id (tunnel_id_value)" - " flexbytes (flexbytes_value) (drop|fwd)" - " queue (queue_id) fd_id (fd_id_value)\n" - " Add/Del a Tunnel flow director filter.\n\n" - +#ifdef RTE_LIBRTE_I40E_PMD "flow_director_filter (port_id) mode raw (add|del|update)" " flow (flow_id) (drop|fwd) queue (queue_id)" " fd_id (fd_id_value) packet (packet file name)\n" " Add/Del a raw type flow director filter.\n\n" - - "flush_flow_director (port_id)\n" - " Flush all flow director entries of a device.\n\n" +#endif "flow_director_mask (port_id) mode IP vlan (vlan_value)" " src_mask (ipv4_src) (ipv6_src) (src_port)" @@ -1041,17 +991,6 @@ static void cmd_help_long_parsed(void *parsed_result, " (raw|l2|l3|l4) (config)\n" " Configure flex payload selection.\n\n" - "set_fdir_input_set (port_id) " - "(ipv4-frag|ipv4-tcp|ipv4-udp|ipv4-sctp|ipv4-other|" - "ipv6-frag|ipv6-tcp|ipv6-udp|ipv6-sctp|ipv6-other|" - "l2_payload) (ivlan|ethertype|src-ipv4|dst-ipv4|src-ipv6|" - "dst-ipv6|ipv4-tos|ipv4-proto|ipv4-ttl|ipv6-tc|" - "ipv6-next-header|ipv6-hop-limits|udp-src-port|" - "udp-dst-port|tcp-src-port|tcp-dst-port|" - "sctp-src-port|sctp-dst-port|sctp-veri-tag|none)" - " (select|add)\n" - " Set the input set for FDir.\n\n" - "flow validate {port_id}" " [group {group_id}] [priority {level}]" " [ingress] [egress]" @@ -7628,9 +7567,11 @@ static void cmd_showportall_parsed(void *parsed_result, else if (!strcmp(res->what, "xstats")) RTE_ETH_FOREACH_DEV(i) nic_xstats_display(i); +#if defined(RTE_LIBRTE_I40E_PMD) || defined(RTE_LIBRTE_IXGBE_PMD) else if (!strcmp(res->what, "fdir")) RTE_ETH_FOREACH_DEV(i) fdir_get_infos(i); +#endif else if (!strcmp(res->what, "stat_qmap")) RTE_ETH_FOREACH_DEV(i) nic_stats_mapping_display(i); @@ -7694,8 +7635,10 @@ static void cmd_showport_parsed(void *parsed_result, nic_stats_display(res->portnum); else if (!strcmp(res->what, "xstats")) nic_xstats_display(res->portnum); +#if defined(RTE_LIBRTE_I40E_PMD) || defined(RTE_LIBRTE_IXGBE_PMD) else if (!strcmp(res->what, "fdir")) fdir_get_infos(res->portnum); +#endif else if (!strcmp(res->what, "stat_qmap")) nic_stats_mapping_display(res->portnum); else if (!strcmp(res->what, "dcb_tc")) @@ -10157,51 +10100,6 @@ cmdline_parse_inst_t cmd_show_queue_region_info_all = { /* *** Filters Control *** */ -/* *** deal with flow director filter *** */ -struct cmd_flow_director_result { - cmdline_fixed_string_t flow_director_filter; - portid_t port_id; - cmdline_fixed_string_t mode; - cmdline_fixed_string_t mode_value; - cmdline_fixed_string_t ops; - cmdline_fixed_string_t flow; - cmdline_fixed_string_t flow_type; - cmdline_fixed_string_t ether; - uint16_t ether_type; - cmdline_fixed_string_t src; - cmdline_ipaddr_t ip_src; - uint16_t port_src; - cmdline_fixed_string_t dst; - cmdline_ipaddr_t ip_dst; - uint16_t port_dst; - cmdline_fixed_string_t verify_tag; - uint32_t verify_tag_value; - cmdline_fixed_string_t tos; - uint8_t tos_value; - cmdline_fixed_string_t proto; - uint8_t proto_value; - cmdline_fixed_string_t ttl; - uint8_t ttl_value; - cmdline_fixed_string_t vlan; - uint16_t vlan_value; - cmdline_fixed_string_t flexbytes; - cmdline_fixed_string_t flexbytes_value; - cmdline_fixed_string_t pf_vf; - cmdline_fixed_string_t drop; - cmdline_fixed_string_t queue; - uint16_t queue_id; - cmdline_fixed_string_t fd_id; - uint32_t fd_id_value; - cmdline_fixed_string_t mac; - struct rte_ether_addr mac_addr; - cmdline_fixed_string_t tunnel; - cmdline_fixed_string_t tunnel_type; - cmdline_fixed_string_t tunnel_id; - uint32_t tunnel_id_value; - cmdline_fixed_string_t packet; - char filepath[]; -}; - static inline int parse_flexbytes(const char *q_arg, uint8_t *flexbytes, uint16_t max_num) { @@ -10275,26 +10173,6 @@ str2flowtype(char *string) return RTE_ETH_FLOW_UNKNOWN; } -static enum rte_eth_fdir_tunnel_type -str2fdir_tunneltype(char *string) -{ - uint8_t i = 0; - - static const struct { - char str[32]; - enum rte_eth_fdir_tunnel_type type; - } tunneltype_str[] = { - {"NVGRE", RTE_FDIR_TUNNEL_TYPE_NVGRE}, - {"VxLAN", RTE_FDIR_TUNNEL_TYPE_VXLAN}, - }; - - for (i = 0; i < RTE_DIM(tunneltype_str); i++) { - if (!strcmp(tunneltype_str[i].str, string)) - return tunneltype_str[i].type; - } - return RTE_FDIR_TUNNEL_TYPE_UNKNOWN; -} - #define IPV4_ADDR_TO_UINT(ip_addr, ip) \ do { \ if ((ip_addr).family == AF_INET) \ @@ -10317,252 +10195,83 @@ do { \ } \ } while (0) +#ifdef RTE_LIBRTE_I40E_PMD + +/* *** deal with flow director filter *** */ +struct cmd_flow_director_result { + cmdline_fixed_string_t flow_director_filter; + portid_t port_id; + cmdline_fixed_string_t mode; + cmdline_fixed_string_t mode_value; + cmdline_fixed_string_t ops; + cmdline_fixed_string_t flow; + cmdline_fixed_string_t flow_type; + cmdline_fixed_string_t drop; + cmdline_fixed_string_t queue; + uint16_t queue_id; + cmdline_fixed_string_t fd_id; + uint32_t fd_id_value; + cmdline_fixed_string_t packet; + char filepath[]; +}; + static void cmd_flow_director_filter_parsed(void *parsed_result, __rte_unused struct cmdline *cl, __rte_unused void *data) { struct cmd_flow_director_result *res = parsed_result; - struct rte_eth_fdir_filter entry; - uint8_t flexbytes[RTE_ETH_FDIR_MAX_FLEXLEN]; - char *end; - unsigned long vf_id; int ret = 0; + struct rte_pmd_i40e_flow_type_mapping + mapping[RTE_PMD_I40E_FLOW_TYPE_MAX]; + struct rte_pmd_i40e_pkt_template_conf conf; + uint16_t flow_type = str2flowtype(res->flow_type); + uint16_t i, port = res->port_id; + uint8_t add; - ret = rte_eth_dev_filter_supported(res->port_id, RTE_ETH_FILTER_FDIR); - if (ret < 0) { - printf("flow director is not supported on port %u.\n", - res->port_id); - return; - } - memset(flexbytes, 0, sizeof(flexbytes)); - memset(&entry, 0, sizeof(struct rte_eth_fdir_filter)); - - if (fdir_conf.mode == RTE_FDIR_MODE_PERFECT_MAC_VLAN) { - if (strcmp(res->mode_value, "MAC-VLAN")) { - printf("Please set mode to MAC-VLAN.\n"); - return; - } - } else if (fdir_conf.mode == RTE_FDIR_MODE_PERFECT_TUNNEL) { - if (strcmp(res->mode_value, "Tunnel")) { - printf("Please set mode to Tunnel.\n"); - return; - } - } else { - if (!strcmp(res->mode_value, "raw")) { -#ifdef RTE_LIBRTE_I40E_PMD - struct rte_pmd_i40e_flow_type_mapping - mapping[RTE_PMD_I40E_FLOW_TYPE_MAX]; - struct rte_pmd_i40e_pkt_template_conf conf; - uint16_t flow_type = str2flowtype(res->flow_type); - uint16_t i, port = res->port_id; - uint8_t add; - - memset(&conf, 0, sizeof(conf)); + memset(&conf, 0, sizeof(conf)); - if (flow_type == RTE_ETH_FLOW_UNKNOWN) { - printf("Invalid flow type specified.\n"); - return; - } - ret = rte_pmd_i40e_flow_type_mapping_get(res->port_id, - mapping); - if (ret) - return; - if (mapping[flow_type].pctype == 0ULL) { - printf("Invalid flow type specified.\n"); - return; - } - for (i = 0; i < RTE_PMD_I40E_PCTYPE_MAX; i++) { - if (mapping[flow_type].pctype & (1ULL << i)) { - conf.input.pctype = i; - break; - } - } - - conf.input.packet = open_file(res->filepath, - &conf.input.length); - if (!conf.input.packet) - return; - if (!strcmp(res->drop, "drop")) - conf.action.behavior = - RTE_PMD_I40E_PKT_TEMPLATE_REJECT; - else - conf.action.behavior = - RTE_PMD_I40E_PKT_TEMPLATE_ACCEPT; - conf.action.report_status = - RTE_PMD_I40E_PKT_TEMPLATE_REPORT_ID; - conf.action.rx_queue = res->queue_id; - conf.soft_id = res->fd_id_value; - add = strcmp(res->ops, "del") ? 1 : 0; - ret = rte_pmd_i40e_flow_add_del_packet_template(port, - &conf, - add); - if (ret < 0) - printf("flow director config error: (%s)\n", - strerror(-ret)); - close_file(conf.input.packet); -#endif - return; - } else if (strcmp(res->mode_value, "IP")) { - printf("Please set mode to IP or raw.\n"); - return; - } - entry.input.flow_type = str2flowtype(res->flow_type); - } - - ret = parse_flexbytes(res->flexbytes_value, - flexbytes, - RTE_ETH_FDIR_MAX_FLEXLEN); - if (ret < 0) { - printf("error: Cannot parse flexbytes input.\n"); + if (flow_type == RTE_ETH_FLOW_UNKNOWN) { + printf("Invalid flow type specified.\n"); return; } - - switch (entry.input.flow_type) { - case RTE_ETH_FLOW_FRAG_IPV4: - case RTE_ETH_FLOW_NONFRAG_IPV4_OTHER: - entry.input.flow.ip4_flow.proto = res->proto_value; - /* fall-through */ - case RTE_ETH_FLOW_NONFRAG_IPV4_UDP: - case RTE_ETH_FLOW_NONFRAG_IPV4_TCP: - IPV4_ADDR_TO_UINT(res->ip_dst, - entry.input.flow.ip4_flow.dst_ip); - IPV4_ADDR_TO_UINT(res->ip_src, - entry.input.flow.ip4_flow.src_ip); - entry.input.flow.ip4_flow.tos = res->tos_value; - entry.input.flow.ip4_flow.ttl = res->ttl_value; - /* need convert to big endian. */ - entry.input.flow.udp4_flow.dst_port = - rte_cpu_to_be_16(res->port_dst); - entry.input.flow.udp4_flow.src_port = - rte_cpu_to_be_16(res->port_src); - break; - case RTE_ETH_FLOW_NONFRAG_IPV4_SCTP: - IPV4_ADDR_TO_UINT(res->ip_dst, - entry.input.flow.sctp4_flow.ip.dst_ip); - IPV4_ADDR_TO_UINT(res->ip_src, - entry.input.flow.sctp4_flow.ip.src_ip); - entry.input.flow.ip4_flow.tos = res->tos_value; - entry.input.flow.ip4_flow.ttl = res->ttl_value; - /* need convert to big endian. */ - entry.input.flow.sctp4_flow.dst_port = - rte_cpu_to_be_16(res->port_dst); - entry.input.flow.sctp4_flow.src_port = - rte_cpu_to_be_16(res->port_src); - entry.input.flow.sctp4_flow.verify_tag = - rte_cpu_to_be_32(res->verify_tag_value); - break; - case RTE_ETH_FLOW_FRAG_IPV6: - case RTE_ETH_FLOW_NONFRAG_IPV6_OTHER: - entry.input.flow.ipv6_flow.proto = res->proto_value; - /* fall-through */ - case RTE_ETH_FLOW_NONFRAG_IPV6_UDP: - case RTE_ETH_FLOW_NONFRAG_IPV6_TCP: - IPV6_ADDR_TO_ARRAY(res->ip_dst, - entry.input.flow.ipv6_flow.dst_ip); - IPV6_ADDR_TO_ARRAY(res->ip_src, - entry.input.flow.ipv6_flow.src_ip); - entry.input.flow.ipv6_flow.tc = res->tos_value; - entry.input.flow.ipv6_flow.hop_limits = res->ttl_value; - /* need convert to big endian. */ - entry.input.flow.udp6_flow.dst_port = - rte_cpu_to_be_16(res->port_dst); - entry.input.flow.udp6_flow.src_port = - rte_cpu_to_be_16(res->port_src); - break; - case RTE_ETH_FLOW_NONFRAG_IPV6_SCTP: - IPV6_ADDR_TO_ARRAY(res->ip_dst, - entry.input.flow.sctp6_flow.ip.dst_ip); - IPV6_ADDR_TO_ARRAY(res->ip_src, - entry.input.flow.sctp6_flow.ip.src_ip); - entry.input.flow.ipv6_flow.tc = res->tos_value; - entry.input.flow.ipv6_flow.hop_limits = res->ttl_value; - /* need convert to big endian. */ - entry.input.flow.sctp6_flow.dst_port = - rte_cpu_to_be_16(res->port_dst); - entry.input.flow.sctp6_flow.src_port = - rte_cpu_to_be_16(res->port_src); - entry.input.flow.sctp6_flow.verify_tag = - rte_cpu_to_be_32(res->verify_tag_value); - break; - case RTE_ETH_FLOW_L2_PAYLOAD: - entry.input.flow.l2_flow.ether_type = - rte_cpu_to_be_16(res->ether_type); - break; - default: - break; - } - - if (fdir_conf.mode == RTE_FDIR_MODE_PERFECT_MAC_VLAN) - rte_memcpy(&entry.input.flow.mac_vlan_flow.mac_addr, - &res->mac_addr, - sizeof(struct rte_ether_addr)); - - if (fdir_conf.mode == RTE_FDIR_MODE_PERFECT_TUNNEL) { - rte_memcpy(&entry.input.flow.tunnel_flow.mac_addr, - &res->mac_addr, - sizeof(struct rte_ether_addr)); - entry.input.flow.tunnel_flow.tunnel_type = - str2fdir_tunneltype(res->tunnel_type); - entry.input.flow.tunnel_flow.tunnel_id = - rte_cpu_to_be_32(res->tunnel_id_value); + ret = rte_pmd_i40e_flow_type_mapping_get(res->port_id, + mapping); + if (ret) + return; + if (mapping[flow_type].pctype == 0ULL) { + printf("Invalid flow type specified.\n"); + return; } - - rte_memcpy(entry.input.flow_ext.flexbytes, - flexbytes, - RTE_ETH_FDIR_MAX_FLEXLEN); - - entry.input.flow_ext.vlan_tci = rte_cpu_to_be_16(res->vlan_value); - - entry.action.flex_off = 0; /*use 0 by default */ - if (!strcmp(res->drop, "drop")) - entry.action.behavior = RTE_ETH_FDIR_REJECT; - else - entry.action.behavior = RTE_ETH_FDIR_ACCEPT; - - if (fdir_conf.mode != RTE_FDIR_MODE_PERFECT_MAC_VLAN && - fdir_conf.mode != RTE_FDIR_MODE_PERFECT_TUNNEL) { - if (!strcmp(res->pf_vf, "pf")) - entry.input.flow_ext.is_vf = 0; - else if (!strncmp(res->pf_vf, "vf", 2)) { - struct rte_eth_dev_info dev_info; - - ret = eth_dev_info_get_print_err(res->port_id, - &dev_info); - if (ret != 0) - return; - - errno = 0; - vf_id = strtoul(res->pf_vf + 2, &end, 10); - if (errno != 0 || *end != '\0' || - vf_id >= dev_info.max_vfs) { - printf("invalid parameter %s.\n", res->pf_vf); - return; - } - entry.input.flow_ext.is_vf = 1; - entry.input.flow_ext.dst_id = (uint16_t)vf_id; - } else { - printf("invalid parameter %s.\n", res->pf_vf); - return; + for (i = 0; i < RTE_PMD_I40E_PCTYPE_MAX; i++) { + if (mapping[flow_type].pctype & (1ULL << i)) { + conf.input.pctype = i; + break; } } - /* set to report FD ID by default */ - entry.action.report_status = RTE_ETH_FDIR_REPORT_ID; - entry.action.rx_queue = res->queue_id; - entry.soft_id = res->fd_id_value; - if (!strcmp(res->ops, "add")) - ret = rte_eth_dev_filter_ctrl(res->port_id, RTE_ETH_FILTER_FDIR, - RTE_ETH_FILTER_ADD, &entry); - else if (!strcmp(res->ops, "del")) - ret = rte_eth_dev_filter_ctrl(res->port_id, RTE_ETH_FILTER_FDIR, - RTE_ETH_FILTER_DELETE, &entry); + conf.input.packet = open_file(res->filepath, + &conf.input.length); + if (!conf.input.packet) + return; + if (!strcmp(res->drop, "drop")) + conf.action.behavior = + RTE_PMD_I40E_PKT_TEMPLATE_REJECT; else - ret = rte_eth_dev_filter_ctrl(res->port_id, RTE_ETH_FILTER_FDIR, - RTE_ETH_FILTER_UPDATE, &entry); + conf.action.behavior = + RTE_PMD_I40E_PKT_TEMPLATE_ACCEPT; + conf.action.report_status = + RTE_PMD_I40E_PKT_TEMPLATE_REPORT_ID; + conf.action.rx_queue = res->queue_id; + conf.soft_id = res->fd_id_value; + add = strcmp(res->ops, "del") ? 1 : 0; + ret = rte_pmd_i40e_flow_add_del_packet_template(port, + &conf, + add); if (ret < 0) - printf("flow director programming error: (%s)\n", - strerror(-ret)); + printf("flow director config error: (%s)\n", + strerror(-ret)); + close_file(conf.input.packet); } cmdline_parse_token_string_t cmd_flow_director_filter = @@ -10580,72 +10289,9 @@ cmdline_parse_token_string_t cmd_flow_director_flow = cmdline_parse_token_string_t cmd_flow_director_flow_type = TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result, flow_type, NULL); -cmdline_parse_token_string_t cmd_flow_director_ether = - TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result, - ether, "ether"); -cmdline_parse_token_num_t cmd_flow_director_ether_type = - TOKEN_NUM_INITIALIZER(struct cmd_flow_director_result, - ether_type, UINT16); -cmdline_parse_token_string_t cmd_flow_director_src = - TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result, - src, "src"); -cmdline_parse_token_ipaddr_t cmd_flow_director_ip_src = - TOKEN_IPADDR_INITIALIZER(struct cmd_flow_director_result, - ip_src); -cmdline_parse_token_num_t cmd_flow_director_port_src = - TOKEN_NUM_INITIALIZER(struct cmd_flow_director_result, - port_src, UINT16); -cmdline_parse_token_string_t cmd_flow_director_dst = - TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result, - dst, "dst"); -cmdline_parse_token_ipaddr_t cmd_flow_director_ip_dst = - TOKEN_IPADDR_INITIALIZER(struct cmd_flow_director_result, - ip_dst); -cmdline_parse_token_num_t cmd_flow_director_port_dst = - TOKEN_NUM_INITIALIZER(struct cmd_flow_director_result, - port_dst, UINT16); -cmdline_parse_token_string_t cmd_flow_director_verify_tag = - TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result, - verify_tag, "verify_tag"); -cmdline_parse_token_num_t cmd_flow_director_verify_tag_value = - TOKEN_NUM_INITIALIZER(struct cmd_flow_director_result, - verify_tag_value, UINT32); -cmdline_parse_token_string_t cmd_flow_director_tos = - TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result, - tos, "tos"); -cmdline_parse_token_num_t cmd_flow_director_tos_value = - TOKEN_NUM_INITIALIZER(struct cmd_flow_director_result, - tos_value, UINT8); -cmdline_parse_token_string_t cmd_flow_director_proto = - TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result, - proto, "proto"); -cmdline_parse_token_num_t cmd_flow_director_proto_value = - TOKEN_NUM_INITIALIZER(struct cmd_flow_director_result, - proto_value, UINT8); -cmdline_parse_token_string_t cmd_flow_director_ttl = - TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result, - ttl, "ttl"); -cmdline_parse_token_num_t cmd_flow_director_ttl_value = - TOKEN_NUM_INITIALIZER(struct cmd_flow_director_result, - ttl_value, UINT8); -cmdline_parse_token_string_t cmd_flow_director_vlan = - TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result, - vlan, "vlan"); -cmdline_parse_token_num_t cmd_flow_director_vlan_value = - TOKEN_NUM_INITIALIZER(struct cmd_flow_director_result, - vlan_value, UINT16); -cmdline_parse_token_string_t cmd_flow_director_flexbytes = - TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result, - flexbytes, "flexbytes"); -cmdline_parse_token_string_t cmd_flow_director_flexbytes_value = - TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result, - flexbytes_value, NULL); cmdline_parse_token_string_t cmd_flow_director_drop = TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result, drop, "drop#fwd"); -cmdline_parse_token_string_t cmd_flow_director_pf_vf = - TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result, - pf_vf, NULL); cmdline_parse_token_string_t cmd_flow_director_queue = TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result, queue, "queue"); @@ -10662,36 +10308,9 @@ cmdline_parse_token_num_t cmd_flow_director_fd_id_value = cmdline_parse_token_string_t cmd_flow_director_mode = TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result, mode, "mode"); -cmdline_parse_token_string_t cmd_flow_director_mode_ip = - TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result, - mode_value, "IP"); -cmdline_parse_token_string_t cmd_flow_director_mode_mac_vlan = - TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result, - mode_value, "MAC-VLAN"); -cmdline_parse_token_string_t cmd_flow_director_mode_tunnel = - TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result, - mode_value, "Tunnel"); cmdline_parse_token_string_t cmd_flow_director_mode_raw = TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result, mode_value, "raw"); -cmdline_parse_token_string_t cmd_flow_director_mac = - TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result, - mac, "mac"); -cmdline_parse_token_etheraddr_t cmd_flow_director_mac_addr = - TOKEN_ETHERADDR_INITIALIZER(struct cmd_flow_director_result, - mac_addr); -cmdline_parse_token_string_t cmd_flow_director_tunnel = - TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result, - tunnel, "tunnel"); -cmdline_parse_token_string_t cmd_flow_director_tunnel_type = - TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result, - tunnel_type, "NVGRE#VxLAN"); -cmdline_parse_token_string_t cmd_flow_director_tunnel_id = - TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result, - tunnel_id, "tunnel-id"); -cmdline_parse_token_num_t cmd_flow_director_tunnel_id_value = - TOKEN_NUM_INITIALIZER(struct cmd_flow_director_result, - tunnel_id_value, UINT32); cmdline_parse_token_string_t cmd_flow_director_packet = TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result, packet, "packet"); @@ -10699,208 +10318,6 @@ cmdline_parse_token_string_t cmd_flow_director_filepath = TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result, filepath, NULL); -cmdline_parse_inst_t cmd_add_del_ip_flow_director = { - .f = cmd_flow_director_filter_parsed, - .data = NULL, - .help_str = "flow_director_filter mode IP add|del|update flow" - " ipv4-other|ipv4-frag|ipv4-tcp|ipv4-udp|ipv4-sctp|" - "ipv6-other|ipv6-frag|ipv6-tcp|ipv6-udp|ipv6-sctp|" - "l2_payload src dst tos " - "proto ttl vlan " - "flexbytes drop|fw queue " - "fd_id : " - "Add or delete an ip flow director entry on NIC", - .tokens = { - (void *)&cmd_flow_director_filter, - (void *)&cmd_flow_director_port_id, - (void *)&cmd_flow_director_mode, - (void *)&cmd_flow_director_mode_ip, - (void *)&cmd_flow_director_ops, - (void *)&cmd_flow_director_flow, - (void *)&cmd_flow_director_flow_type, - (void *)&cmd_flow_director_src, - (void *)&cmd_flow_director_ip_src, - (void *)&cmd_flow_director_dst, - (void *)&cmd_flow_director_ip_dst, - (void *)&cmd_flow_director_tos, - (void *)&cmd_flow_director_tos_value, - (void *)&cmd_flow_director_proto, - (void *)&cmd_flow_director_proto_value, - (void *)&cmd_flow_director_ttl, - (void *)&cmd_flow_director_ttl_value, - (void *)&cmd_flow_director_vlan, - (void *)&cmd_flow_director_vlan_value, - (void *)&cmd_flow_director_flexbytes, - (void *)&cmd_flow_director_flexbytes_value, - (void *)&cmd_flow_director_drop, - (void *)&cmd_flow_director_pf_vf, - (void *)&cmd_flow_director_queue, - (void *)&cmd_flow_director_queue_id, - (void *)&cmd_flow_director_fd_id, - (void *)&cmd_flow_director_fd_id_value, - NULL, - }, -}; - -cmdline_parse_inst_t cmd_add_del_udp_flow_director = { - .f = cmd_flow_director_filter_parsed, - .data = NULL, - .help_str = "flow_director_filter ... : Add or delete an udp/tcp flow " - "director entry on NIC", - .tokens = { - (void *)&cmd_flow_director_filter, - (void *)&cmd_flow_director_port_id, - (void *)&cmd_flow_director_mode, - (void *)&cmd_flow_director_mode_ip, - (void *)&cmd_flow_director_ops, - (void *)&cmd_flow_director_flow, - (void *)&cmd_flow_director_flow_type, - (void *)&cmd_flow_director_src, - (void *)&cmd_flow_director_ip_src, - (void *)&cmd_flow_director_port_src, - (void *)&cmd_flow_director_dst, - (void *)&cmd_flow_director_ip_dst, - (void *)&cmd_flow_director_port_dst, - (void *)&cmd_flow_director_tos, - (void *)&cmd_flow_director_tos_value, - (void *)&cmd_flow_director_ttl, - (void *)&cmd_flow_director_ttl_value, - (void *)&cmd_flow_director_vlan, - (void *)&cmd_flow_director_vlan_value, - (void *)&cmd_flow_director_flexbytes, - (void *)&cmd_flow_director_flexbytes_value, - (void *)&cmd_flow_director_drop, - (void *)&cmd_flow_director_pf_vf, - (void *)&cmd_flow_director_queue, - (void *)&cmd_flow_director_queue_id, - (void *)&cmd_flow_director_fd_id, - (void *)&cmd_flow_director_fd_id_value, - NULL, - }, -}; - -cmdline_parse_inst_t cmd_add_del_sctp_flow_director = { - .f = cmd_flow_director_filter_parsed, - .data = NULL, - .help_str = "flow_director_filter ... : Add or delete a sctp flow " - "director entry on NIC", - .tokens = { - (void *)&cmd_flow_director_filter, - (void *)&cmd_flow_director_port_id, - (void *)&cmd_flow_director_mode, - (void *)&cmd_flow_director_mode_ip, - (void *)&cmd_flow_director_ops, - (void *)&cmd_flow_director_flow, - (void *)&cmd_flow_director_flow_type, - (void *)&cmd_flow_director_src, - (void *)&cmd_flow_director_ip_src, - (void *)&cmd_flow_director_port_src, - (void *)&cmd_flow_director_dst, - (void *)&cmd_flow_director_ip_dst, - (void *)&cmd_flow_director_port_dst, - (void *)&cmd_flow_director_verify_tag, - (void *)&cmd_flow_director_verify_tag_value, - (void *)&cmd_flow_director_tos, - (void *)&cmd_flow_director_tos_value, - (void *)&cmd_flow_director_ttl, - (void *)&cmd_flow_director_ttl_value, - (void *)&cmd_flow_director_vlan, - (void *)&cmd_flow_director_vlan_value, - (void *)&cmd_flow_director_flexbytes, - (void *)&cmd_flow_director_flexbytes_value, - (void *)&cmd_flow_director_drop, - (void *)&cmd_flow_director_pf_vf, - (void *)&cmd_flow_director_queue, - (void *)&cmd_flow_director_queue_id, - (void *)&cmd_flow_director_fd_id, - (void *)&cmd_flow_director_fd_id_value, - NULL, - }, -}; - -cmdline_parse_inst_t cmd_add_del_l2_flow_director = { - .f = cmd_flow_director_filter_parsed, - .data = NULL, - .help_str = "flow_director_filter ... : Add or delete a L2 flow " - "director entry on NIC", - .tokens = { - (void *)&cmd_flow_director_filter, - (void *)&cmd_flow_director_port_id, - (void *)&cmd_flow_director_mode, - (void *)&cmd_flow_director_mode_ip, - (void *)&cmd_flow_director_ops, - (void *)&cmd_flow_director_flow, - (void *)&cmd_flow_director_flow_type, - (void *)&cmd_flow_director_ether, - (void *)&cmd_flow_director_ether_type, - (void *)&cmd_flow_director_flexbytes, - (void *)&cmd_flow_director_flexbytes_value, - (void *)&cmd_flow_director_drop, - (void *)&cmd_flow_director_pf_vf, - (void *)&cmd_flow_director_queue, - (void *)&cmd_flow_director_queue_id, - (void *)&cmd_flow_director_fd_id, - (void *)&cmd_flow_director_fd_id_value, - NULL, - }, -}; - -cmdline_parse_inst_t cmd_add_del_mac_vlan_flow_director = { - .f = cmd_flow_director_filter_parsed, - .data = NULL, - .help_str = "flow_director_filter ... : Add or delete a MAC VLAN flow " - "director entry on NIC", - .tokens = { - (void *)&cmd_flow_director_filter, - (void *)&cmd_flow_director_port_id, - (void *)&cmd_flow_director_mode, - (void *)&cmd_flow_director_mode_mac_vlan, - (void *)&cmd_flow_director_ops, - (void *)&cmd_flow_director_mac, - (void *)&cmd_flow_director_mac_addr, - (void *)&cmd_flow_director_vlan, - (void *)&cmd_flow_director_vlan_value, - (void *)&cmd_flow_director_flexbytes, - (void *)&cmd_flow_director_flexbytes_value, - (void *)&cmd_flow_director_drop, - (void *)&cmd_flow_director_queue, - (void *)&cmd_flow_director_queue_id, - (void *)&cmd_flow_director_fd_id, - (void *)&cmd_flow_director_fd_id_value, - NULL, - }, -}; - -cmdline_parse_inst_t cmd_add_del_tunnel_flow_director = { - .f = cmd_flow_director_filter_parsed, - .data = NULL, - .help_str = "flow_director_filter ... : Add or delete a tunnel flow " - "director entry on NIC", - .tokens = { - (void *)&cmd_flow_director_filter, - (void *)&cmd_flow_director_port_id, - (void *)&cmd_flow_director_mode, - (void *)&cmd_flow_director_mode_tunnel, - (void *)&cmd_flow_director_ops, - (void *)&cmd_flow_director_mac, - (void *)&cmd_flow_director_mac_addr, - (void *)&cmd_flow_director_vlan, - (void *)&cmd_flow_director_vlan_value, - (void *)&cmd_flow_director_tunnel, - (void *)&cmd_flow_director_tunnel_type, - (void *)&cmd_flow_director_tunnel_id, - (void *)&cmd_flow_director_tunnel_id_value, - (void *)&cmd_flow_director_flexbytes, - (void *)&cmd_flow_director_flexbytes_value, - (void *)&cmd_flow_director_drop, - (void *)&cmd_flow_director_queue, - (void *)&cmd_flow_director_queue_id, - (void *)&cmd_flow_director_fd_id, - (void *)&cmd_flow_director_fd_id_value, - NULL, - }, -}; - cmdline_parse_inst_t cmd_add_del_raw_flow_director = { .f = cmd_flow_director_filter_parsed, .data = NULL, @@ -10925,51 +10342,7 @@ cmdline_parse_inst_t cmd_add_del_raw_flow_director = { }, }; -struct cmd_flush_flow_director_result { - cmdline_fixed_string_t flush_flow_director; - portid_t port_id; -}; - -cmdline_parse_token_string_t cmd_flush_flow_director_flush = - TOKEN_STRING_INITIALIZER(struct cmd_flush_flow_director_result, - flush_flow_director, "flush_flow_director"); -cmdline_parse_token_num_t cmd_flush_flow_director_port_id = - TOKEN_NUM_INITIALIZER(struct cmd_flush_flow_director_result, - port_id, UINT16); - -static void -cmd_flush_flow_director_parsed(void *parsed_result, - __rte_unused struct cmdline *cl, - __rte_unused void *data) -{ - struct cmd_flow_director_result *res = parsed_result; - int ret = 0; - - ret = rte_eth_dev_filter_supported(res->port_id, RTE_ETH_FILTER_FDIR); - if (ret < 0) { - printf("flow director is not supported on port %u.\n", - res->port_id); - return; - } - - ret = rte_eth_dev_filter_ctrl(res->port_id, RTE_ETH_FILTER_FDIR, - RTE_ETH_FILTER_FLUSH, NULL); - if (ret < 0) - printf("flow director table flushing error: (%s)\n", - strerror(-ret)); -} - -cmdline_parse_inst_t cmd_flush_flow_director = { - .f = cmd_flush_flow_director_parsed, - .data = NULL, - .help_str = "flush_flow_director : " - "Flush all flow director entries of a device on NIC", - .tokens = { - (void *)&cmd_flush_flow_director_flush, - (void *)&cmd_flush_flow_director_port_id, - NULL, - }, -}; +#endif /* RTE_LIBRTE_I40E_PMD */ /* *** deal with flow director mask *** */ struct cmd_flow_director_mask_result { @@ -11411,132 +10784,6 @@ cmdline_parse_inst_t cmd_set_flow_director_flex_payload = { /* Generic flow interface command. */ extern cmdline_parse_inst_t cmd_flow; -/* *** Classification Filters Control *** */ - -static enum rte_eth_input_set_field -str2inset(char *string) -{ - uint16_t i; - - static const struct { - char str[32]; - enum rte_eth_input_set_field inset; - } inset_table[] = { - {"ethertype", RTE_ETH_INPUT_SET_L2_ETHERTYPE}, - {"ovlan", RTE_ETH_INPUT_SET_L2_OUTER_VLAN}, - {"ivlan", RTE_ETH_INPUT_SET_L2_INNER_VLAN}, - {"src-ipv4", RTE_ETH_INPUT_SET_L3_SRC_IP4}, - {"dst-ipv4", RTE_ETH_INPUT_SET_L3_DST_IP4}, - {"ipv4-tos", RTE_ETH_INPUT_SET_L3_IP4_TOS}, - {"ipv4-proto", RTE_ETH_INPUT_SET_L3_IP4_PROTO}, - {"ipv4-ttl", RTE_ETH_INPUT_SET_L3_IP4_TTL}, - {"src-ipv6", RTE_ETH_INPUT_SET_L3_SRC_IP6}, - {"dst-ipv6", RTE_ETH_INPUT_SET_L3_DST_IP6}, - {"ipv6-tc", RTE_ETH_INPUT_SET_L3_IP6_TC}, - {"ipv6-next-header", RTE_ETH_INPUT_SET_L3_IP6_NEXT_HEADER}, - {"ipv6-hop-limits", RTE_ETH_INPUT_SET_L3_IP6_HOP_LIMITS}, - {"udp-src-port", RTE_ETH_INPUT_SET_L4_UDP_SRC_PORT}, - {"udp-dst-port", RTE_ETH_INPUT_SET_L4_UDP_DST_PORT}, - {"tcp-src-port", RTE_ETH_INPUT_SET_L4_TCP_SRC_PORT}, - {"tcp-dst-port", RTE_ETH_INPUT_SET_L4_TCP_DST_PORT}, - {"sctp-src-port", RTE_ETH_INPUT_SET_L4_SCTP_SRC_PORT}, - {"sctp-dst-port", RTE_ETH_INPUT_SET_L4_SCTP_DST_PORT}, - {"sctp-veri-tag", RTE_ETH_INPUT_SET_L4_SCTP_VERIFICATION_TAG}, - {"udp-key", RTE_ETH_INPUT_SET_TUNNEL_L4_UDP_KEY}, - {"gre-key", RTE_ETH_INPUT_SET_TUNNEL_GRE_KEY}, - {"fld-1st", RTE_ETH_INPUT_SET_FLEX_PAYLOAD_1ST_WORD}, - {"fld-2nd", RTE_ETH_INPUT_SET_FLEX_PAYLOAD_2ND_WORD}, - {"fld-3rd", RTE_ETH_INPUT_SET_FLEX_PAYLOAD_3RD_WORD}, - {"fld-4th", RTE_ETH_INPUT_SET_FLEX_PAYLOAD_4TH_WORD}, - {"fld-5th", RTE_ETH_INPUT_SET_FLEX_PAYLOAD_5TH_WORD}, - {"fld-6th", RTE_ETH_INPUT_SET_FLEX_PAYLOAD_6TH_WORD}, - {"fld-7th", RTE_ETH_INPUT_SET_FLEX_PAYLOAD_7TH_WORD}, - {"fld-8th", RTE_ETH_INPUT_SET_FLEX_PAYLOAD_8TH_WORD}, - {"none", RTE_ETH_INPUT_SET_NONE}, - }; - - for (i = 0; i < RTE_DIM(inset_table); i++) { - if (!strcmp(string, inset_table[i].str)) - return inset_table[i].inset; - } - - return RTE_ETH_INPUT_SET_UNKNOWN; -} - -/* Set flow director input set */ -struct cmd_set_fdir_input_set_result { - cmdline_fixed_string_t set_fdir_input_set; - portid_t port_id; - cmdline_fixed_string_t flow_type; - cmdline_fixed_string_t inset_field; - cmdline_fixed_string_t select; -}; - -static void -cmd_set_fdir_input_set_parsed(void *parsed_result, - __rte_unused struct cmdline *cl, - __rte_unused void *data) -{ - struct cmd_set_fdir_input_set_result *res = parsed_result; - struct rte_eth_fdir_filter_info info; - - memset(&info, 0, sizeof(info)); - info.info_type = RTE_ETH_FDIR_FILTER_INPUT_SET_SELECT; - info.info.input_set_conf.flow_type = str2flowtype(res->flow_type); - info.info.input_set_conf.field[0] = str2inset(res->inset_field); - info.info.input_set_conf.inset_size = 1; - if (!strcmp(res->select, "select")) - info.info.input_set_conf.op = RTE_ETH_INPUT_SET_SELECT; - else if (!strcmp(res->select, "add")) - info.info.input_set_conf.op = RTE_ETH_INPUT_SET_ADD; - rte_eth_dev_filter_ctrl(res->port_id, RTE_ETH_FILTER_FDIR, - RTE_ETH_FILTER_SET, &info); -} - -cmdline_parse_token_string_t cmd_set_fdir_input_set_cmd = - TOKEN_STRING_INITIALIZER(struct cmd_set_fdir_input_set_result, - set_fdir_input_set, "set_fdir_input_set"); -cmdline_parse_token_num_t cmd_set_fdir_input_set_port_id = - TOKEN_NUM_INITIALIZER(struct cmd_set_fdir_input_set_result, - port_id, UINT16); -cmdline_parse_token_string_t cmd_set_fdir_input_set_flow_type = - TOKEN_STRING_INITIALIZER(struct cmd_set_fdir_input_set_result, - flow_type, - "ipv4-frag#ipv4-tcp#ipv4-udp#ipv4-sctp#ipv4-other#" - "ipv6-frag#ipv6-tcp#ipv6-udp#ipv6-sctp#ipv6-other#l2_payload"); -cmdline_parse_token_string_t cmd_set_fdir_input_set_field = - TOKEN_STRING_INITIALIZER(struct cmd_set_fdir_input_set_result, - inset_field, - "ivlan#ethertype#src-ipv4#dst-ipv4#src-ipv6#dst-ipv6#" - "ipv4-tos#ipv4-proto#ipv4-ttl#ipv6-tc#ipv6-next-header#" - "ipv6-hop-limits#udp-src-port#udp-dst-port#" - "tcp-src-port#tcp-dst-port#sctp-src-port#sctp-dst-port#" - "sctp-veri-tag#none"); -cmdline_parse_token_string_t cmd_set_fdir_input_set_select = - TOKEN_STRING_INITIALIZER(struct cmd_set_fdir_input_set_result, - select, "select#add"); - -cmdline_parse_inst_t cmd_set_fdir_input_set = { - .f = cmd_set_fdir_input_set_parsed, - .data = NULL, - .help_str = "set_fdir_input_set " - "ipv4-frag|ipv4-tcp|ipv4-udp|ipv4-sctp|ipv4-other|" - "ipv6-frag|ipv6-tcp|ipv6-udp|ipv6-sctp|ipv6-other|l2_payload " - "ivlan|ethertype|src-ipv4|dst-ipv4|src-ipv6|dst-ipv6|" - "ipv4-tos|ipv4-proto|ipv4-ttl|ipv6-tc|ipv6-next-header|" - "ipv6-hop-limits|udp-src-port|udp-dst-port|" - "tcp-src-port|tcp-dst-port|sctp-src-port|sctp-dst-port|" - "sctp-veri-tag|none select|add", - .tokens = { - (void *)&cmd_set_fdir_input_set_cmd, - (void *)&cmd_set_fdir_input_set_port_id, - (void *)&cmd_set_fdir_input_set_flow_type, - (void *)&cmd_set_fdir_input_set_field, - (void *)&cmd_set_fdir_input_set_select, - NULL, - }, -}; - /* *** ADD/REMOVE A MULTICAST MAC ADDRESS TO/FROM A PORT *** */ struct cmd_mcast_addr_result { cmdline_fixed_string_t mcast_addr_cmd; @@ -18406,20 +17653,14 @@ cmdline_parse_ctx_t main_ctx[] = { (cmdline_parse_inst_t *)&cmd_config_rss_hash_key, (cmdline_parse_inst_t *)&cmd_dump, (cmdline_parse_inst_t *)&cmd_dump_one, - (cmdline_parse_inst_t *)&cmd_add_del_ip_flow_director, - (cmdline_parse_inst_t *)&cmd_add_del_udp_flow_director, - (cmdline_parse_inst_t *)&cmd_add_del_sctp_flow_director, - (cmdline_parse_inst_t *)&cmd_add_del_l2_flow_director, - (cmdline_parse_inst_t *)&cmd_add_del_mac_vlan_flow_director, - (cmdline_parse_inst_t *)&cmd_add_del_tunnel_flow_director, +#ifdef RTE_LIBRTE_I40E_PMD (cmdline_parse_inst_t *)&cmd_add_del_raw_flow_director, - (cmdline_parse_inst_t *)&cmd_flush_flow_director, +#endif (cmdline_parse_inst_t *)&cmd_set_flow_director_ip_mask, (cmdline_parse_inst_t *)&cmd_set_flow_director_mac_vlan_mask, (cmdline_parse_inst_t *)&cmd_set_flow_director_tunnel_mask, (cmdline_parse_inst_t *)&cmd_set_flow_director_flex_mask, (cmdline_parse_inst_t *)&cmd_set_flow_director_flex_payload, - (cmdline_parse_inst_t *)&cmd_set_fdir_input_set, (cmdline_parse_inst_t *)&cmd_flow, (cmdline_parse_inst_t *)&cmd_show_port_meter_cap, (cmdline_parse_inst_t *)&cmd_add_port_meter_profile_srtcm, diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c index ba17f3b0c2..8c01c0891b 100644 --- a/app/test-pmd/config.c +++ b/app/test-pmd/config.c @@ -4711,6 +4711,8 @@ flowtype_to_str(uint16_t flow_type) return NULL; } +#if defined(RTE_LIBRTE_I40E_PMD) || defined(RTE_LIBRTE_IXGBE_PMD) + static inline void print_fdir_flex_mask(struct rte_eth_fdir_flex_conf *flex_conf, uint32_t num) { @@ -4750,16 +4752,7 @@ static int get_fdir_info(portid_t port_id, struct rte_eth_fdir_info *fdir_info, struct rte_eth_fdir_stats *fdir_stat) { - int ret; - - ret = rte_eth_dev_filter_supported(port_id, RTE_ETH_FILTER_FDIR); - if (!ret) { - rte_eth_dev_filter_ctrl(port_id, RTE_ETH_FILTER_FDIR, - RTE_ETH_FILTER_INFO, fdir_info); - rte_eth_dev_filter_ctrl(port_id, RTE_ETH_FILTER_FDIR, - RTE_ETH_FILTER_STATS, fdir_stat); - return 0; - } + int ret = -ENOTSUP; #ifdef RTE_LIBRTE_I40E_PMD if (ret == -ENOTSUP) { @@ -4857,6 +4850,8 @@ fdir_get_infos(portid_t port_id) fdir_stats_border, fdir_stats_border); } +#endif /* RTE_LIBRTE_I40E_PMD || RTE_LIBRTE_IXGBE_PMD */ + void fdir_set_flex_mask(portid_t port_id, struct rte_eth_fdir_flex_mask *cfg) { diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h index 833ca149cd..d8cbf07c4f 100644 --- a/app/test-pmd/testpmd.h +++ b/app/test-pmd/testpmd.h @@ -921,7 +921,9 @@ int all_ports_stopped(void); int port_is_stopped(portid_t port_id); int port_is_started(portid_t port_id); void pmd_test_exit(void); +#if defined(RTE_LIBRTE_I40E_PMD) || defined(RTE_LIBRTE_IXGBE_PMD) void fdir_get_infos(portid_t port_id); +#endif void fdir_set_flex_mask(portid_t port_id, struct rte_eth_fdir_flex_mask *cfg); void fdir_set_flex_payload(portid_t port_id, diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst index 3d241c08e8..18a748bc88 100644 --- a/doc/guides/rel_notes/deprecation.rst +++ b/doc/guides/rel_notes/deprecation.rst @@ -107,8 +107,8 @@ Deprecation Notices * ethdev: the legacy filter API, including - ``rte_eth_dev_filter_supported()``, ``rte_eth_dev_filter_ctrl()`` as well - as filter types FDIR, is superseded by the generic flow API (rte_flow) in + ``rte_eth_dev_filter_supported()``, ``rte_eth_dev_filter_ctrl()`` + is superseded by the generic flow API (rte_flow) in PMDs that implement the latter. The legacy API will be removed in DPDK 20.11. diff --git a/drivers/net/bnxt/bnxt_ethdev.c b/drivers/net/bnxt/bnxt_ethdev.c index 8b68b5fe76..a59fd2e17d 100644 --- a/drivers/net/bnxt/bnxt_ethdev.c +++ b/drivers/net/bnxt/bnxt_ethdev.c @@ -2987,399 +2987,6 @@ bnxt_tx_descriptor_status_op(void *tx_queue, uint16_t offset) return RTE_ETH_TX_DESC_FULL; } -static int -bnxt_parse_fdir_filter(struct bnxt *bp, - struct rte_eth_fdir_filter *fdir, - struct bnxt_filter_info *filter) -{ - enum rte_fdir_mode fdir_mode = - bp->eth_dev->data->dev_conf.fdir_conf.mode; - struct bnxt_vnic_info *vnic0, *vnic; - struct bnxt_filter_info *filter1; - uint32_t en = 0; - int i; - - if (fdir_mode == RTE_FDIR_MODE_PERFECT_TUNNEL) - return -EINVAL; - - filter->l2_ovlan = fdir->input.flow_ext.vlan_tci; - en |= EM_FLOW_ALLOC_INPUT_EN_OVLAN_VID; - - switch (fdir->input.flow_type) { - case RTE_ETH_FLOW_IPV4: - case RTE_ETH_FLOW_NONFRAG_IPV4_OTHER: - /* FALLTHROUGH */ - filter->src_ipaddr[0] = fdir->input.flow.ip4_flow.src_ip; - en |= NTUPLE_FLTR_ALLOC_INPUT_EN_SRC_IPADDR; - filter->dst_ipaddr[0] = fdir->input.flow.ip4_flow.dst_ip; - en |= NTUPLE_FLTR_ALLOC_INPUT_EN_DST_IPADDR; - filter->ip_protocol = fdir->input.flow.ip4_flow.proto; - en |= NTUPLE_FLTR_ALLOC_IN_EN_IP_PROTO; - filter->ip_addr_type = - NTUPLE_FLTR_ALLOC_INPUT_IP_ADDR_TYPE_IPV4; - filter->src_ipaddr_mask[0] = 0xffffffff; - en |= NTUPLE_FLTR_ALLOC_INPUT_EN_SRC_IPADDR_MASK; - filter->dst_ipaddr_mask[0] = 0xffffffff; - en |= NTUPLE_FLTR_ALLOC_INPUT_EN_DST_IPADDR_MASK; - filter->ethertype = 0x800; - filter->enables |= NTUPLE_FLTR_ALLOC_INPUT_EN_ETHERTYPE; - break; - case RTE_ETH_FLOW_NONFRAG_IPV4_TCP: - filter->src_port = fdir->input.flow.tcp4_flow.src_port; - en |= NTUPLE_FLTR_ALLOC_INPUT_EN_SRC_PORT; - filter->dst_port = fdir->input.flow.tcp4_flow.dst_port; - en |= NTUPLE_FLTR_ALLOC_INPUT_EN_DST_PORT; - filter->dst_port_mask = 0xffff; - en |= NTUPLE_FLTR_ALLOC_INPUT_EN_DST_PORT_MASK; - filter->src_port_mask = 0xffff; - en |= NTUPLE_FLTR_ALLOC_INPUT_EN_SRC_PORT_MASK; - filter->src_ipaddr[0] = fdir->input.flow.tcp4_flow.ip.src_ip; - en |= NTUPLE_FLTR_ALLOC_INPUT_EN_SRC_IPADDR; - filter->dst_ipaddr[0] = fdir->input.flow.tcp4_flow.ip.dst_ip; - en |= NTUPLE_FLTR_ALLOC_INPUT_EN_DST_IPADDR; - filter->ip_protocol = 6; - en |= NTUPLE_FLTR_ALLOC_IN_EN_IP_PROTO; - filter->ip_addr_type = - NTUPLE_FLTR_ALLOC_INPUT_IP_ADDR_TYPE_IPV4; - filter->src_ipaddr_mask[0] = 0xffffffff; - en |= NTUPLE_FLTR_ALLOC_INPUT_EN_SRC_IPADDR_MASK; - filter->dst_ipaddr_mask[0] = 0xffffffff; - en |= NTUPLE_FLTR_ALLOC_INPUT_EN_DST_IPADDR_MASK; - filter->ethertype = 0x800; - filter->enables |= NTUPLE_FLTR_ALLOC_INPUT_EN_ETHERTYPE; - break; - case RTE_ETH_FLOW_NONFRAG_IPV4_UDP: - filter->src_port = fdir->input.flow.udp4_flow.src_port; - en |= NTUPLE_FLTR_ALLOC_INPUT_EN_SRC_PORT; - filter->dst_port = fdir->input.flow.udp4_flow.dst_port; - en |= NTUPLE_FLTR_ALLOC_INPUT_EN_DST_PORT; - filter->dst_port_mask = 0xffff; - en |= NTUPLE_FLTR_ALLOC_INPUT_EN_DST_PORT_MASK; - filter->src_port_mask = 0xffff; - en |= NTUPLE_FLTR_ALLOC_INPUT_EN_SRC_PORT_MASK; - filter->src_ipaddr[0] = fdir->input.flow.udp4_flow.ip.src_ip; - en |= NTUPLE_FLTR_ALLOC_INPUT_EN_SRC_IPADDR; - filter->dst_ipaddr[0] = fdir->input.flow.udp4_flow.ip.dst_ip; - en |= NTUPLE_FLTR_ALLOC_INPUT_EN_DST_IPADDR; - filter->ip_protocol = 17; - en |= NTUPLE_FLTR_ALLOC_IN_EN_IP_PROTO; - filter->ip_addr_type = - NTUPLE_FLTR_ALLOC_INPUT_IP_ADDR_TYPE_IPV4; - filter->src_ipaddr_mask[0] = 0xffffffff; - en |= NTUPLE_FLTR_ALLOC_INPUT_EN_SRC_IPADDR_MASK; - filter->dst_ipaddr_mask[0] = 0xffffffff; - en |= NTUPLE_FLTR_ALLOC_INPUT_EN_DST_IPADDR_MASK; - filter->ethertype = 0x800; - filter->enables |= NTUPLE_FLTR_ALLOC_INPUT_EN_ETHERTYPE; - break; - case RTE_ETH_FLOW_IPV6: - case RTE_ETH_FLOW_NONFRAG_IPV6_OTHER: - /* FALLTHROUGH */ - filter->ip_addr_type = - NTUPLE_FLTR_ALLOC_INPUT_IP_ADDR_TYPE_IPV6; - filter->ip_protocol = fdir->input.flow.ipv6_flow.proto; - en |= NTUPLE_FLTR_ALLOC_IN_EN_IP_PROTO; - rte_memcpy(filter->src_ipaddr, - fdir->input.flow.ipv6_flow.src_ip, 16); - en |= NTUPLE_FLTR_ALLOC_INPUT_EN_SRC_IPADDR; - rte_memcpy(filter->dst_ipaddr, - fdir->input.flow.ipv6_flow.dst_ip, 16); - en |= NTUPLE_FLTR_ALLOC_INPUT_EN_DST_IPADDR; - memset(filter->dst_ipaddr_mask, 0xff, 16); - en |= NTUPLE_FLTR_ALLOC_INPUT_EN_DST_IPADDR_MASK; - memset(filter->src_ipaddr_mask, 0xff, 16); - en |= NTUPLE_FLTR_ALLOC_INPUT_EN_SRC_IPADDR_MASK; - filter->ethertype = 0x86dd; - filter->enables |= NTUPLE_FLTR_ALLOC_INPUT_EN_ETHERTYPE; - break; - case RTE_ETH_FLOW_NONFRAG_IPV6_TCP: - filter->src_port = fdir->input.flow.tcp6_flow.src_port; - en |= NTUPLE_FLTR_ALLOC_INPUT_EN_SRC_PORT; - filter->dst_port = fdir->input.flow.tcp6_flow.dst_port; - en |= NTUPLE_FLTR_ALLOC_INPUT_EN_DST_PORT; - filter->dst_port_mask = 0xffff; - en |= NTUPLE_FLTR_ALLOC_INPUT_EN_DST_PORT_MASK; - filter->src_port_mask = 0xffff; - en |= NTUPLE_FLTR_ALLOC_INPUT_EN_SRC_PORT_MASK; - filter->ip_addr_type = - NTUPLE_FLTR_ALLOC_INPUT_IP_ADDR_TYPE_IPV6; - filter->ip_protocol = fdir->input.flow.tcp6_flow.ip.proto; - en |= NTUPLE_FLTR_ALLOC_IN_EN_IP_PROTO; - rte_memcpy(filter->src_ipaddr, - fdir->input.flow.tcp6_flow.ip.src_ip, 16); - en |= NTUPLE_FLTR_ALLOC_INPUT_EN_SRC_IPADDR; - rte_memcpy(filter->dst_ipaddr, - fdir->input.flow.tcp6_flow.ip.dst_ip, 16); - en |= NTUPLE_FLTR_ALLOC_INPUT_EN_DST_IPADDR; - memset(filter->dst_ipaddr_mask, 0xff, 16); - en |= NTUPLE_FLTR_ALLOC_INPUT_EN_DST_IPADDR_MASK; - memset(filter->src_ipaddr_mask, 0xff, 16); - en |= NTUPLE_FLTR_ALLOC_INPUT_EN_SRC_IPADDR_MASK; - filter->ethertype = 0x86dd; - filter->enables |= NTUPLE_FLTR_ALLOC_INPUT_EN_ETHERTYPE; - break; - case RTE_ETH_FLOW_NONFRAG_IPV6_UDP: - filter->src_port = fdir->input.flow.udp6_flow.src_port; - en |= NTUPLE_FLTR_ALLOC_INPUT_EN_SRC_PORT; - filter->dst_port = fdir->input.flow.udp6_flow.dst_port; - en |= NTUPLE_FLTR_ALLOC_INPUT_EN_DST_PORT; - filter->dst_port_mask = 0xffff; - en |= NTUPLE_FLTR_ALLOC_INPUT_EN_DST_PORT_MASK; - filter->src_port_mask = 0xffff; - en |= NTUPLE_FLTR_ALLOC_INPUT_EN_SRC_PORT_MASK; - filter->ip_addr_type = - NTUPLE_FLTR_ALLOC_INPUT_IP_ADDR_TYPE_IPV6; - filter->ip_protocol = fdir->input.flow.udp6_flow.ip.proto; - en |= NTUPLE_FLTR_ALLOC_IN_EN_IP_PROTO; - rte_memcpy(filter->src_ipaddr, - fdir->input.flow.udp6_flow.ip.src_ip, 16); - en |= NTUPLE_FLTR_ALLOC_INPUT_EN_SRC_IPADDR; - rte_memcpy(filter->dst_ipaddr, - fdir->input.flow.udp6_flow.ip.dst_ip, 16); - en |= NTUPLE_FLTR_ALLOC_INPUT_EN_DST_IPADDR; - memset(filter->dst_ipaddr_mask, 0xff, 16); - en |= NTUPLE_FLTR_ALLOC_INPUT_EN_DST_IPADDR_MASK; - memset(filter->src_ipaddr_mask, 0xff, 16); - en |= NTUPLE_FLTR_ALLOC_INPUT_EN_SRC_IPADDR_MASK; - filter->ethertype = 0x86dd; - filter->enables |= NTUPLE_FLTR_ALLOC_INPUT_EN_ETHERTYPE; - break; - case RTE_ETH_FLOW_L2_PAYLOAD: - filter->ethertype = fdir->input.flow.l2_flow.ether_type; - en |= NTUPLE_FLTR_ALLOC_INPUT_EN_ETHERTYPE; - break; - case RTE_ETH_FLOW_VXLAN: - if (fdir->action.behavior == RTE_ETH_FDIR_REJECT) - return -EINVAL; - filter->vni = fdir->input.flow.tunnel_flow.tunnel_id; - filter->tunnel_type = - CFA_NTUPLE_FILTER_ALLOC_REQ_TUNNEL_TYPE_VXLAN; - en |= HWRM_CFA_NTUPLE_FILTER_ALLOC_INPUT_ENABLES_TUNNEL_TYPE; - break; - case RTE_ETH_FLOW_NVGRE: - if (fdir->action.behavior == RTE_ETH_FDIR_REJECT) - return -EINVAL; - filter->vni = fdir->input.flow.tunnel_flow.tunnel_id; - filter->tunnel_type = - CFA_NTUPLE_FILTER_ALLOC_REQ_TUNNEL_TYPE_NVGRE; - en |= HWRM_CFA_NTUPLE_FILTER_ALLOC_INPUT_ENABLES_TUNNEL_TYPE; - break; - case RTE_ETH_FLOW_UNKNOWN: - case RTE_ETH_FLOW_RAW: - case RTE_ETH_FLOW_FRAG_IPV4: - case RTE_ETH_FLOW_NONFRAG_IPV4_SCTP: - case RTE_ETH_FLOW_FRAG_IPV6: - case RTE_ETH_FLOW_NONFRAG_IPV6_SCTP: - case RTE_ETH_FLOW_IPV6_EX: - case RTE_ETH_FLOW_IPV6_TCP_EX: - case RTE_ETH_FLOW_IPV6_UDP_EX: - case RTE_ETH_FLOW_GENEVE: - /* FALLTHROUGH */ - default: - return -EINVAL; - } - - vnic0 = BNXT_GET_DEFAULT_VNIC(bp); - vnic = &bp->vnic_info[fdir->action.rx_queue]; - if (vnic == NULL) { - PMD_DRV_LOG(ERR, "Invalid queue %d\n", fdir->action.rx_queue); - return -EINVAL; - } - - if (fdir_mode == RTE_FDIR_MODE_PERFECT_MAC_VLAN) { - rte_memcpy(filter->dst_macaddr, - fdir->input.flow.mac_vlan_flow.mac_addr.addr_bytes, 6); - en |= NTUPLE_FLTR_ALLOC_INPUT_EN_DST_MACADDR; - } - - if (fdir->action.behavior == RTE_ETH_FDIR_REJECT) { - filter->flags = HWRM_CFA_NTUPLE_FILTER_ALLOC_INPUT_FLAGS_DROP; - filter1 = STAILQ_FIRST(&vnic0->filter); - //filter1 = bnxt_get_l2_filter(bp, filter, vnic0); - } else { - filter->dst_id = vnic->fw_vnic_id; - for (i = 0; i < RTE_ETHER_ADDR_LEN; i++) - if (filter->dst_macaddr[i] == 0x00) - filter1 = STAILQ_FIRST(&vnic0->filter); - else - filter1 = bnxt_get_l2_filter(bp, filter, vnic); - } - - if (filter1 == NULL) - return -EINVAL; - - en |= HWRM_CFA_NTUPLE_FILTER_ALLOC_INPUT_ENABLES_L2_FILTER_ID; - filter->fw_l2_filter_id = filter1->fw_l2_filter_id; - - filter->enables = en; - - return 0; -} - -static struct bnxt_filter_info * -bnxt_match_fdir(struct bnxt *bp, struct bnxt_filter_info *nf, - struct bnxt_vnic_info **mvnic) -{ - struct bnxt_filter_info *mf = NULL; - int i; - - for (i = bp->nr_vnics - 1; i >= 0; i--) { - struct bnxt_vnic_info *vnic = &bp->vnic_info[i]; - - STAILQ_FOREACH(mf, &vnic->filter, next) { - if (mf->filter_type == nf->filter_type && - mf->flags == nf->flags && - mf->src_port == nf->src_port && - mf->src_port_mask == nf->src_port_mask && - mf->dst_port == nf->dst_port && - mf->dst_port_mask == nf->dst_port_mask && - mf->ip_protocol == nf->ip_protocol && - mf->ip_addr_type == nf->ip_addr_type && - mf->ethertype == nf->ethertype && - mf->vni == nf->vni && - mf->tunnel_type == nf->tunnel_type && - mf->l2_ovlan == nf->l2_ovlan && - mf->l2_ovlan_mask == nf->l2_ovlan_mask && - mf->l2_ivlan == nf->l2_ivlan && - mf->l2_ivlan_mask == nf->l2_ivlan_mask && - !memcmp(mf->l2_addr, nf->l2_addr, - RTE_ETHER_ADDR_LEN) && - !memcmp(mf->l2_addr_mask, nf->l2_addr_mask, - RTE_ETHER_ADDR_LEN) && - !memcmp(mf->src_macaddr, nf->src_macaddr, - RTE_ETHER_ADDR_LEN) && - !memcmp(mf->dst_macaddr, nf->dst_macaddr, - RTE_ETHER_ADDR_LEN) && - !memcmp(mf->src_ipaddr, nf->src_ipaddr, - sizeof(nf->src_ipaddr)) && - !memcmp(mf->src_ipaddr_mask, nf->src_ipaddr_mask, - sizeof(nf->src_ipaddr_mask)) && - !memcmp(mf->dst_ipaddr, nf->dst_ipaddr, - sizeof(nf->dst_ipaddr)) && - !memcmp(mf->dst_ipaddr_mask, nf->dst_ipaddr_mask, - sizeof(nf->dst_ipaddr_mask))) { - if (mvnic) - *mvnic = vnic; - return mf; - } - } - } - return NULL; -} - -static int -bnxt_fdir_filter(struct rte_eth_dev *dev, - enum rte_filter_op filter_op, - void *arg) -{ - struct bnxt *bp = dev->data->dev_private; - struct rte_eth_fdir_filter *fdir = (struct rte_eth_fdir_filter *)arg; - struct bnxt_filter_info *filter, *match; - struct bnxt_vnic_info *vnic, *mvnic; - int ret = 0, i; - - if (filter_op == RTE_ETH_FILTER_NOP) - return 0; - - if (arg == NULL && filter_op != RTE_ETH_FILTER_FLUSH) - return -EINVAL; - - switch (filter_op) { - case RTE_ETH_FILTER_ADD: - case RTE_ETH_FILTER_DELETE: - /* FALLTHROUGH */ - filter = bnxt_get_unused_filter(bp); - if (filter == NULL) { - PMD_DRV_LOG(ERR, - "Not enough resources for a new flow.\n"); - return -ENOMEM; - } - - ret = bnxt_parse_fdir_filter(bp, fdir, filter); - if (ret != 0) - goto free_filter; - filter->filter_type = HWRM_CFA_NTUPLE_FILTER; - - if (fdir->action.behavior == RTE_ETH_FDIR_REJECT) - vnic = &bp->vnic_info[0]; - else - vnic = &bp->vnic_info[fdir->action.rx_queue]; - - match = bnxt_match_fdir(bp, filter, &mvnic); - if (match != NULL && filter_op == RTE_ETH_FILTER_ADD) { - if (match->dst_id == vnic->fw_vnic_id) { - PMD_DRV_LOG(ERR, "Flow already exists.\n"); - ret = -EEXIST; - goto free_filter; - } else { - match->dst_id = vnic->fw_vnic_id; - ret = bnxt_hwrm_set_ntuple_filter(bp, - match->dst_id, - match); - STAILQ_REMOVE(&mvnic->filter, match, - bnxt_filter_info, next); - STAILQ_INSERT_TAIL(&vnic->filter, match, next); - PMD_DRV_LOG(ERR, - "Filter with matching pattern exist\n"); - PMD_DRV_LOG(ERR, - "Updated it to new destination q\n"); - goto free_filter; - } - } - if (match == NULL && filter_op == RTE_ETH_FILTER_DELETE) { - PMD_DRV_LOG(ERR, "Flow does not exist.\n"); - ret = -ENOENT; - goto free_filter; - } - - if (filter_op == RTE_ETH_FILTER_ADD) { - ret = bnxt_hwrm_set_ntuple_filter(bp, - filter->dst_id, - filter); - if (ret) - goto free_filter; - STAILQ_INSERT_TAIL(&vnic->filter, filter, next); - } else { - ret = bnxt_hwrm_clear_ntuple_filter(bp, match); - STAILQ_REMOVE(&vnic->filter, match, - bnxt_filter_info, next); - bnxt_free_filter(bp, match); - bnxt_free_filter(bp, filter); - } - break; - case RTE_ETH_FILTER_FLUSH: - for (i = bp->nr_vnics - 1; i >= 0; i--) { - struct bnxt_vnic_info *vnic = &bp->vnic_info[i]; - - STAILQ_FOREACH(filter, &vnic->filter, next) { - if (filter->filter_type == - HWRM_CFA_NTUPLE_FILTER) { - ret = - bnxt_hwrm_clear_ntuple_filter(bp, - filter); - STAILQ_REMOVE(&vnic->filter, filter, - bnxt_filter_info, next); - } - } - } - return ret; - case RTE_ETH_FILTER_UPDATE: - case RTE_ETH_FILTER_STATS: - case RTE_ETH_FILTER_INFO: - PMD_DRV_LOG(ERR, "operation %u not implemented", filter_op); - break; - default: - PMD_DRV_LOG(ERR, "unknown operation %u", filter_op); - ret = -EINVAL; - break; - } - return ret; - -free_filter: - bnxt_free_filter(bp, filter); - return ret; -} - int bnxt_filter_ctrl_op(struct rte_eth_dev *dev, enum rte_filter_type filter_type, @@ -3409,9 +3016,6 @@ bnxt_filter_ctrl_op(struct rte_eth_dev *dev, return ret; switch (filter_type) { - case RTE_ETH_FILTER_FDIR: - ret = bnxt_fdir_filter(dev, filter_op, arg); - break; case RTE_ETH_FILTER_GENERIC: if (filter_op != RTE_ETH_FILTER_GET) return -EINVAL; diff --git a/drivers/net/enic/enic.h b/drivers/net/enic/enic.h index 5f0ae395da..079f194275 100644 --- a/drivers/net/enic/enic.h +++ b/drivers/net/enic/enic.h @@ -394,12 +394,6 @@ enic_ring_incr(uint32_t n_descriptors, uint32_t idx) } int dev_is_enic(struct rte_eth_dev *dev); -void enic_fdir_stats_get(struct enic *enic, - struct rte_eth_fdir_stats *stats); -int enic_fdir_add_fltr(struct enic *enic, - struct rte_eth_fdir_filter *params); -int enic_fdir_del_fltr(struct enic *enic, - struct rte_eth_fdir_filter *params); void enic_free_wq(void *txq); int enic_alloc_intr_resources(struct enic *enic); int enic_setup_finish(struct enic *enic); @@ -464,7 +458,6 @@ bool enic_use_vector_rx_handler(struct rte_eth_dev *eth_dev); void enic_pick_rx_handler(struct rte_eth_dev *eth_dev); void enic_pick_tx_handler(struct rte_eth_dev *eth_dev); void enic_fdir_info(struct enic *enic); -void enic_fdir_info_get(struct enic *enic, struct rte_eth_fdir_info *stats); int enic_vf_representor_init(struct rte_eth_dev *eth_dev, void *init_params); int enic_vf_representor_uninit(struct rte_eth_dev *ethdev); int enic_fm_allocate_switch_domain(struct enic *pf); diff --git a/drivers/net/enic/enic_clsf.c b/drivers/net/enic/enic_clsf.c index e206123ba5..1c837a4d09 100644 --- a/drivers/net/enic/enic_clsf.c +++ b/drivers/net/enic/enic_clsf.c @@ -42,17 +42,6 @@ static void copy_fltr_v2(struct filter_v2 *fltr, const struct rte_eth_fdir_input *input, const struct rte_eth_fdir_masks *masks); -void enic_fdir_stats_get(struct enic *enic, struct rte_eth_fdir_stats *stats) -{ - *stats = enic->fdir.stats; -} - -void enic_fdir_info_get(struct enic *enic, struct rte_eth_fdir_info *info) -{ - info->mode = (enum rte_fdir_mode)enic->fdir.modes; - info->flow_types_mask[0] = enic->fdir.types_mask; -} - void enic_fdir_info(struct enic *enic) { enic->fdir.modes = (uint32_t)RTE_FDIR_MODE_PERFECT; @@ -305,163 +294,6 @@ copy_fltr_v2(struct filter_v2 *fltr, const struct rte_eth_fdir_input *input, } } -int enic_fdir_del_fltr(struct enic *enic, struct rte_eth_fdir_filter *params) -{ - int32_t pos; - struct enic_fdir_node *key; - /* See if the key is in the table */ - pos = rte_hash_del_key(enic->fdir.hash, params); - switch (pos) { - case -EINVAL: - case -ENOENT: - enic->fdir.stats.f_remove++; - return -EINVAL; - default: - /* The entry is present in the table */ - key = enic->fdir.nodes[pos]; - - /* Delete the filter */ - vnic_dev_classifier(enic->vdev, CLSF_DEL, - &key->fltr_id, NULL, NULL); - rte_free(key); - enic->fdir.nodes[pos] = NULL; - enic->fdir.stats.free++; - enic->fdir.stats.remove++; - break; - } - return 0; -} - -int enic_fdir_add_fltr(struct enic *enic, struct rte_eth_fdir_filter *params) -{ - struct enic_fdir_node *key; - struct filter_v2 fltr; - int32_t pos; - uint8_t do_free = 0; - uint16_t old_fltr_id = 0; - uint32_t flowtype_supported; - uint16_t flex_bytes; - uint16_t queue; - struct filter_action_v2 action; - - memset(&fltr, 0, sizeof(fltr)); - memset(&action, 0, sizeof(action)); - flowtype_supported = enic->fdir.types_mask - & (1 << params->input.flow_type); - - flex_bytes = ((params->input.flow_ext.flexbytes[1] << 8 & 0xFF00) | - (params->input.flow_ext.flexbytes[0] & 0xFF)); - - if (!enic->fdir.hash || - (params->input.flow_ext.vlan_tci & 0xFFF) || - !flowtype_supported || flex_bytes || - params->action.behavior /* drop */) { - enic->fdir.stats.f_add++; - return -ENOTSUP; - } - - /* Get the enicpmd RQ from the DPDK Rx queue */ - queue = enic_rte_rq_idx_to_sop_idx(params->action.rx_queue); - - if (!enic->rq[queue].in_use) - return -EINVAL; - - /* See if the key is already there in the table */ - pos = rte_hash_del_key(enic->fdir.hash, params); - switch (pos) { - case -EINVAL: - enic->fdir.stats.f_add++; - return -EINVAL; - case -ENOENT: - /* Add a new classifier entry */ - if (!enic->fdir.stats.free) { - enic->fdir.stats.f_add++; - return -ENOSPC; - } - key = rte_zmalloc("enic_fdir_node", - sizeof(struct enic_fdir_node), 0); - if (!key) { - enic->fdir.stats.f_add++; - return -ENOMEM; - } - break; - default: - /* The entry is already present in the table. - * Check if there is a change in queue - */ - key = enic->fdir.nodes[pos]; - enic->fdir.nodes[pos] = NULL; - if (unlikely(key->rq_index == queue)) { - /* Nothing to be done */ - enic->fdir.stats.f_add++; - pos = rte_hash_add_key(enic->fdir.hash, params); - if (pos < 0) { - dev_err(enic, "Add hash key failed\n"); - return pos; - } - enic->fdir.nodes[pos] = key; - dev_warning(enic, - "FDIR rule is already present\n"); - return 0; - } - - if (likely(enic->fdir.stats.free)) { - /* Add the filter and then delete the old one. - * This is to avoid packets from going into the - * default queue during the window between - * delete and add - */ - do_free = 1; - old_fltr_id = key->fltr_id; - } else { - /* No free slots in the classifier. - * Delete the filter and add the modified one later - */ - vnic_dev_classifier(enic->vdev, CLSF_DEL, - &key->fltr_id, NULL, NULL); - enic->fdir.stats.free++; - } - - break; - } - - key->filter = *params; - key->rq_index = queue; - - enic->fdir.copy_fltr_fn(&fltr, ¶ms->input, - &enic->rte_dev->data->dev_conf.fdir_conf.mask); - action.type = FILTER_ACTION_RQ_STEERING; - action.rq_idx = queue; - - if (!vnic_dev_classifier(enic->vdev, CLSF_ADD, &queue, &fltr, - &action)) { - key->fltr_id = queue; - } else { - dev_err(enic, "Add classifier entry failed\n"); - enic->fdir.stats.f_add++; - rte_free(key); - return -1; - } - - if (do_free) - vnic_dev_classifier(enic->vdev, CLSF_DEL, &old_fltr_id, NULL, - NULL); - else{ - enic->fdir.stats.free--; - enic->fdir.stats.add++; - } - - pos = rte_hash_add_key(enic->fdir.hash, params); - if (pos < 0) { - enic->fdir.stats.f_add++; - dev_err(enic, "Add hash key failed\n"); - return pos; - } - - enic->fdir.nodes[pos] = key; - return 0; -} - void enic_clsf_destroy(struct enic *enic) { uint32_t index; diff --git a/drivers/net/enic/enic_ethdev.c b/drivers/net/enic/enic_ethdev.c index 8d0054ffec..d041a6bee9 100644 --- a/drivers/net/enic/enic_ethdev.c +++ b/drivers/net/enic/enic_ethdev.c @@ -72,51 +72,6 @@ static const struct vic_speed_capa { RTE_LOG_REGISTER(enic_pmd_logtype, pmd.net.enic, INFO); -static int -enicpmd_fdir_ctrl_func(struct rte_eth_dev *eth_dev, - enum rte_filter_op filter_op, void *arg) -{ - struct enic *enic = pmd_priv(eth_dev); - int ret = 0; - - ENICPMD_FUNC_TRACE(); - if (filter_op == RTE_ETH_FILTER_NOP) - return 0; - - if (arg == NULL && filter_op != RTE_ETH_FILTER_FLUSH) - return -EINVAL; - - switch (filter_op) { - case RTE_ETH_FILTER_ADD: - case RTE_ETH_FILTER_UPDATE: - ret = enic_fdir_add_fltr(enic, - (struct rte_eth_fdir_filter *)arg); - break; - - case RTE_ETH_FILTER_DELETE: - ret = enic_fdir_del_fltr(enic, - (struct rte_eth_fdir_filter *)arg); - break; - - case RTE_ETH_FILTER_STATS: - enic_fdir_stats_get(enic, (struct rte_eth_fdir_stats *)arg); - break; - - case RTE_ETH_FILTER_FLUSH: - dev_warning(enic, "unsupported operation %u", filter_op); - ret = -ENOTSUP; - break; - case RTE_ETH_FILTER_INFO: - enic_fdir_info_get(enic, (struct rte_eth_fdir_info *)arg); - break; - default: - dev_err(enic, "unknown operation %u", filter_op); - ret = -EINVAL; - break; - } - return ret; -} - static int enicpmd_dev_filter_ctrl(struct rte_eth_dev *dev, enum rte_filter_type filter_type, @@ -143,9 +98,6 @@ enicpmd_dev_filter_ctrl(struct rte_eth_dev *dev, else *(const void **)arg = &enic_flow_ops; break; - case RTE_ETH_FILTER_FDIR: - ret = enicpmd_fdir_ctrl_func(dev, filter_op, arg); - break; default: dev_warning(enic, "Filter type (%d) not supported", filter_type); diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c index 9d6d482aba..f54769c29d 100644 --- a/drivers/net/i40e/i40e_ethdev.c +++ b/drivers/net/i40e/i40e_ethdev.c @@ -9685,89 +9685,6 @@ i40e_hash_filter_inset_select(struct i40e_hw *hw, return 0; } -int -i40e_fdir_filter_inset_select(struct i40e_pf *pf, - struct rte_eth_input_set_conf *conf) -{ - struct i40e_hw *hw = I40E_PF_TO_HW(pf); - enum i40e_filter_pctype pctype; - uint64_t input_set, inset_reg = 0; - uint32_t mask_reg[I40E_INSET_MASK_NUM_REG] = {0}; - int ret, i, num; - - if (!hw || !conf) { - PMD_DRV_LOG(ERR, "Invalid pointer"); - return -EFAULT; - } - if (conf->op != RTE_ETH_INPUT_SET_SELECT && - conf->op != RTE_ETH_INPUT_SET_ADD) { - PMD_DRV_LOG(ERR, "Unsupported input set operation"); - return -EINVAL; - } - - pctype = i40e_flowtype_to_pctype(pf->adapter, conf->flow_type); - - if (pctype == I40E_FILTER_PCTYPE_INVALID) { - PMD_DRV_LOG(ERR, "invalid flow_type input."); - return -EINVAL; - } - - ret = i40e_parse_input_set(&input_set, pctype, conf->field, - conf->inset_size); - if (ret) { - PMD_DRV_LOG(ERR, "Failed to parse input set"); - return -EINVAL; - } - - /* get inset value in register */ - inset_reg = i40e_read_rx_ctl(hw, I40E_PRTQF_FD_INSET(pctype, 1)); - inset_reg <<= I40E_32_BIT_WIDTH; - inset_reg |= i40e_read_rx_ctl(hw, I40E_PRTQF_FD_INSET(pctype, 0)); - - /* Can not change the inset reg for flex payload for fdir, - * it is done by writing I40E_PRTQF_FD_FLXINSET - * in i40e_set_flex_mask_on_pctype. - */ - if (conf->op == RTE_ETH_INPUT_SET_SELECT) - inset_reg &= I40E_REG_INSET_FLEX_PAYLOAD_WORDS; - else - input_set |= pf->fdir.input_set[pctype]; - num = i40e_generate_inset_mask_reg(input_set, mask_reg, - I40E_INSET_MASK_NUM_REG); - if (num < 0) - return -EINVAL; - if (pf->support_multi_driver && num > 0) { - PMD_DRV_LOG(ERR, "FDIR bit mask is not supported."); - return -ENOTSUP; - } - - inset_reg |= i40e_translate_input_set_reg(hw->mac.type, input_set); - - i40e_check_write_reg(hw, I40E_PRTQF_FD_INSET(pctype, 0), - (uint32_t)(inset_reg & UINT32_MAX)); - i40e_check_write_reg(hw, I40E_PRTQF_FD_INSET(pctype, 1), - (uint32_t)((inset_reg >> - I40E_32_BIT_WIDTH) & UINT32_MAX)); - - if (!pf->support_multi_driver) { - for (i = 0; i < num; i++) - i40e_check_write_global_reg(hw, - I40E_GLQF_FD_MSK(i, pctype), - mask_reg[i]); - /*clear unused mask registers of the pctype */ - for (i = num; i < I40E_INSET_MASK_NUM_REG; i++) - i40e_check_write_global_reg(hw, - I40E_GLQF_FD_MSK(i, pctype), - 0); - } else { - PMD_DRV_LOG(ERR, "FDIR bit mask is not supported."); - } - I40E_WRITE_FLUSH(hw); - - pf->fdir.input_set[pctype] = input_set; - return 0; -} - /* Convert ethertype filter structure */ static int i40e_ethertype_filter_convert(const struct rte_eth_ethertype_filter *input, @@ -9945,9 +9862,6 @@ i40e_dev_filter_ctrl(struct rte_eth_dev *dev, return -EINVAL; switch (filter_type) { - case RTE_ETH_FILTER_FDIR: - ret = i40e_fdir_ctrl_func(dev, filter_op, arg); - break; case RTE_ETH_FILTER_GENERIC: if (filter_op != RTE_ETH_FILTER_GET) return -EINVAL; diff --git a/drivers/net/i40e/i40e_ethdev.h b/drivers/net/i40e/i40e_ethdev.h index 458219c784..e74f758f6a 100644 --- a/drivers/net/i40e/i40e_ethdev.h +++ b/drivers/net/i40e/i40e_ethdev.h @@ -664,8 +664,7 @@ struct i40e_fdir_action { }; /* A structure used to define the flow director filter entry by filter_ctrl API - * It supports RTE_ETH_FILTER_FDIR with RTE_ETH_FILTER_ADD and - * RTE_ETH_FILTER_DELETE operations. + * It supports RTE_ETH_FILTER_FDIR data representation. */ struct i40e_fdir_filter_conf { uint32_t soft_id; @@ -1368,17 +1367,12 @@ void i40e_fdir_info_get(struct rte_eth_dev *dev, struct rte_eth_fdir_info *fdir); void i40e_fdir_stats_get(struct rte_eth_dev *dev, struct rte_eth_fdir_stats *stat); -int i40e_fdir_ctrl_func(struct rte_eth_dev *dev, - enum rte_filter_op filter_op, - void *arg); int i40e_select_filter_input_set(struct i40e_hw *hw, struct rte_eth_input_set_conf *conf, enum rte_filter_type filter); void i40e_fdir_filter_restore(struct i40e_pf *pf); int i40e_hash_filter_inset_select(struct i40e_hw *hw, struct rte_eth_input_set_conf *conf); -int i40e_fdir_filter_inset_select(struct i40e_pf *pf, - struct rte_eth_input_set_conf *conf); int i40e_pf_host_send_msg_to_vf(struct i40e_pf_vf *vf, uint32_t opcode, uint32_t retval, uint8_t *msg, uint16_t msglen); @@ -1406,9 +1400,6 @@ uint64_t i40e_get_default_input_set(uint16_t pctype); int i40e_ethertype_filter_set(struct i40e_pf *pf, struct rte_eth_ethertype_filter *filter, bool add); -int i40e_add_del_fdir_filter(struct rte_eth_dev *dev, - const struct rte_eth_fdir_filter *filter, - bool add); struct rte_flow * i40e_fdir_entry_pool_get(struct i40e_fdir_info *fdir_info); void i40e_fdir_entry_pool_put(struct i40e_fdir_info *fdir_info, diff --git a/drivers/net/i40e/i40e_fdir.c b/drivers/net/i40e/i40e_fdir.c index aa8e729495..b61e605364 100644 --- a/drivers/net/i40e/i40e_fdir.c +++ b/drivers/net/i40e/i40e_fdir.c @@ -85,10 +85,6 @@ (1ULL << RTE_ETH_FLOW_NONFRAG_IPV6_OTHER) | \ (1ULL << RTE_ETH_FLOW_L2_PAYLOAD)) -static int i40e_fdir_filter_programming(struct i40e_pf *pf, - enum i40e_filter_pctype pctype, - const struct rte_eth_fdir_filter *filter, - bool add); static int i40e_fdir_filter_convert(const struct i40e_fdir_filter_conf *input, struct i40e_fdir_filter *filter); static struct i40e_fdir_filter * @@ -731,263 +727,6 @@ i40e_fdir_configure(struct rte_eth_dev *dev) return ret; } -static inline int -i40e_fdir_fill_eth_ip_head(const struct rte_eth_fdir_input *fdir_input, - unsigned char *raw_pkt, - bool vlan) -{ - static uint8_t vlan_frame[] = {0x81, 0, 0, 0}; - uint16_t *ether_type; - uint8_t len = 2 * sizeof(struct rte_ether_addr); - struct rte_ipv4_hdr *ip; - struct rte_ipv6_hdr *ip6; - static const uint8_t next_proto[] = { - [RTE_ETH_FLOW_FRAG_IPV4] = IPPROTO_IP, - [RTE_ETH_FLOW_NONFRAG_IPV4_TCP] = IPPROTO_TCP, - [RTE_ETH_FLOW_NONFRAG_IPV4_UDP] = IPPROTO_UDP, - [RTE_ETH_FLOW_NONFRAG_IPV4_SCTP] = IPPROTO_SCTP, - [RTE_ETH_FLOW_NONFRAG_IPV4_OTHER] = IPPROTO_IP, - [RTE_ETH_FLOW_FRAG_IPV6] = IPPROTO_NONE, - [RTE_ETH_FLOW_NONFRAG_IPV6_TCP] = IPPROTO_TCP, - [RTE_ETH_FLOW_NONFRAG_IPV6_UDP] = IPPROTO_UDP, - [RTE_ETH_FLOW_NONFRAG_IPV6_SCTP] = IPPROTO_SCTP, - [RTE_ETH_FLOW_NONFRAG_IPV6_OTHER] = IPPROTO_NONE, - }; - - raw_pkt += 2 * sizeof(struct rte_ether_addr); - if (vlan && fdir_input->flow_ext.vlan_tci) { - rte_memcpy(raw_pkt, vlan_frame, sizeof(vlan_frame)); - rte_memcpy(raw_pkt + sizeof(uint16_t), - &fdir_input->flow_ext.vlan_tci, - sizeof(uint16_t)); - raw_pkt += sizeof(vlan_frame); - len += sizeof(vlan_frame); - } - ether_type = (uint16_t *)raw_pkt; - raw_pkt += sizeof(uint16_t); - len += sizeof(uint16_t); - - switch (fdir_input->flow_type) { - case RTE_ETH_FLOW_L2_PAYLOAD: - *ether_type = fdir_input->flow.l2_flow.ether_type; - break; - case RTE_ETH_FLOW_NONFRAG_IPV4_TCP: - case RTE_ETH_FLOW_NONFRAG_IPV4_UDP: - case RTE_ETH_FLOW_NONFRAG_IPV4_SCTP: - case RTE_ETH_FLOW_NONFRAG_IPV4_OTHER: - case RTE_ETH_FLOW_FRAG_IPV4: - ip = (struct rte_ipv4_hdr *)raw_pkt; - - *ether_type = rte_cpu_to_be_16(RTE_ETHER_TYPE_IPV4); - ip->version_ihl = I40E_FDIR_IP_DEFAULT_VERSION_IHL; - /* set len to by default */ - ip->total_length = rte_cpu_to_be_16(I40E_FDIR_IP_DEFAULT_LEN); - ip->next_proto_id = fdir_input->flow.ip4_flow.proto ? - fdir_input->flow.ip4_flow.proto : - next_proto[fdir_input->flow_type]; - ip->time_to_live = fdir_input->flow.ip4_flow.ttl ? - fdir_input->flow.ip4_flow.ttl : - I40E_FDIR_IP_DEFAULT_TTL; - ip->type_of_service = fdir_input->flow.ip4_flow.tos; - /* - * The source and destination fields in the transmitted packet - * need to be presented in a reversed order with respect - * to the expected received packets. - */ - ip->src_addr = fdir_input->flow.ip4_flow.dst_ip; - ip->dst_addr = fdir_input->flow.ip4_flow.src_ip; - len += sizeof(struct rte_ipv4_hdr); - break; - case RTE_ETH_FLOW_NONFRAG_IPV6_TCP: - case RTE_ETH_FLOW_NONFRAG_IPV6_UDP: - case RTE_ETH_FLOW_NONFRAG_IPV6_SCTP: - case RTE_ETH_FLOW_NONFRAG_IPV6_OTHER: - case RTE_ETH_FLOW_FRAG_IPV6: - ip6 = (struct rte_ipv6_hdr *)raw_pkt; - - *ether_type = rte_cpu_to_be_16(RTE_ETHER_TYPE_IPV6); - ip6->vtc_flow = - rte_cpu_to_be_32(I40E_FDIR_IPv6_DEFAULT_VTC_FLOW | - (fdir_input->flow.ipv6_flow.tc << - I40E_FDIR_IPv6_TC_OFFSET)); - ip6->payload_len = - rte_cpu_to_be_16(I40E_FDIR_IPv6_PAYLOAD_LEN); - ip6->proto = fdir_input->flow.ipv6_flow.proto ? - fdir_input->flow.ipv6_flow.proto : - next_proto[fdir_input->flow_type]; - ip6->hop_limits = fdir_input->flow.ipv6_flow.hop_limits ? - fdir_input->flow.ipv6_flow.hop_limits : - I40E_FDIR_IPv6_DEFAULT_HOP_LIMITS; - /* - * The source and destination fields in the transmitted packet - * need to be presented in a reversed order with respect - * to the expected received packets. - */ - rte_memcpy(&(ip6->src_addr), - &(fdir_input->flow.ipv6_flow.dst_ip), - IPV6_ADDR_LEN); - rte_memcpy(&(ip6->dst_addr), - &(fdir_input->flow.ipv6_flow.src_ip), - IPV6_ADDR_LEN); - len += sizeof(struct rte_ipv6_hdr); - break; - default: - PMD_DRV_LOG(ERR, "unknown flow type %u.", - fdir_input->flow_type); - return -1; - } - return len; -} - - -/* - * i40e_fdir_construct_pkt - construct packet based on fields in input - * @pf: board private structure - * @fdir_input: input set of the flow director entry - * @raw_pkt: a packet to be constructed - */ -static int -i40e_fdir_construct_pkt(struct i40e_pf *pf, - const struct rte_eth_fdir_input *fdir_input, - unsigned char *raw_pkt) -{ - unsigned char *payload, *ptr; - struct rte_udp_hdr *udp; - struct rte_tcp_hdr *tcp; - struct rte_sctp_hdr *sctp; - uint8_t size, dst = 0; - uint8_t i, pit_idx, set_idx = I40E_FLXPLD_L4_IDX; /* use l4 by default*/ - int len; - - /* fill the ethernet and IP head */ - len = i40e_fdir_fill_eth_ip_head(fdir_input, raw_pkt, - !!fdir_input->flow_ext.vlan_tci); - if (len < 0) - return -EINVAL; - - /* fill the L4 head */ - switch (fdir_input->flow_type) { - case RTE_ETH_FLOW_NONFRAG_IPV4_UDP: - udp = (struct rte_udp_hdr *)(raw_pkt + len); - payload = (unsigned char *)udp + sizeof(struct rte_udp_hdr); - /* - * The source and destination fields in the transmitted packet - * need to be presented in a reversed order with respect - * to the expected received packets. - */ - udp->src_port = fdir_input->flow.udp4_flow.dst_port; - udp->dst_port = fdir_input->flow.udp4_flow.src_port; - udp->dgram_len = rte_cpu_to_be_16(I40E_FDIR_UDP_DEFAULT_LEN); - break; - - case RTE_ETH_FLOW_NONFRAG_IPV4_TCP: - tcp = (struct rte_tcp_hdr *)(raw_pkt + len); - payload = (unsigned char *)tcp + sizeof(struct rte_tcp_hdr); - /* - * The source and destination fields in the transmitted packet - * need to be presented in a reversed order with respect - * to the expected received packets. - */ - tcp->src_port = fdir_input->flow.tcp4_flow.dst_port; - tcp->dst_port = fdir_input->flow.tcp4_flow.src_port; - tcp->data_off = I40E_FDIR_TCP_DEFAULT_DATAOFF; - break; - - case RTE_ETH_FLOW_NONFRAG_IPV4_SCTP: - sctp = (struct rte_sctp_hdr *)(raw_pkt + len); - payload = (unsigned char *)sctp + sizeof(struct rte_sctp_hdr); - /* - * The source and destination fields in the transmitted packet - * need to be presented in a reversed order with respect - * to the expected received packets. - */ - sctp->src_port = fdir_input->flow.sctp4_flow.dst_port; - sctp->dst_port = fdir_input->flow.sctp4_flow.src_port; - sctp->tag = fdir_input->flow.sctp4_flow.verify_tag; - break; - - case RTE_ETH_FLOW_NONFRAG_IPV4_OTHER: - case RTE_ETH_FLOW_FRAG_IPV4: - payload = raw_pkt + len; - set_idx = I40E_FLXPLD_L3_IDX; - break; - - case RTE_ETH_FLOW_NONFRAG_IPV6_UDP: - udp = (struct rte_udp_hdr *)(raw_pkt + len); - payload = (unsigned char *)udp + sizeof(struct rte_udp_hdr); - /* - * The source and destination fields in the transmitted packet - * need to be presented in a reversed order with respect - * to the expected received packets. - */ - udp->src_port = fdir_input->flow.udp6_flow.dst_port; - udp->dst_port = fdir_input->flow.udp6_flow.src_port; - udp->dgram_len = rte_cpu_to_be_16(I40E_FDIR_IPv6_PAYLOAD_LEN); - break; - - case RTE_ETH_FLOW_NONFRAG_IPV6_TCP: - tcp = (struct rte_tcp_hdr *)(raw_pkt + len); - payload = (unsigned char *)tcp + sizeof(struct rte_tcp_hdr); - /* - * The source and destination fields in the transmitted packet - * need to be presented in a reversed order with respect - * to the expected received packets. - */ - tcp->data_off = I40E_FDIR_TCP_DEFAULT_DATAOFF; - tcp->src_port = fdir_input->flow.udp6_flow.dst_port; - tcp->dst_port = fdir_input->flow.udp6_flow.src_port; - break; - - case RTE_ETH_FLOW_NONFRAG_IPV6_SCTP: - sctp = (struct rte_sctp_hdr *)(raw_pkt + len); - payload = (unsigned char *)sctp + sizeof(struct rte_sctp_hdr); - /* - * The source and destination fields in the transmitted packet - * need to be presented in a reversed order with respect - * to the expected received packets. - */ - sctp->src_port = fdir_input->flow.sctp6_flow.dst_port; - sctp->dst_port = fdir_input->flow.sctp6_flow.src_port; - sctp->tag = fdir_input->flow.sctp6_flow.verify_tag; - break; - - case RTE_ETH_FLOW_NONFRAG_IPV6_OTHER: - case RTE_ETH_FLOW_FRAG_IPV6: - payload = raw_pkt + len; - set_idx = I40E_FLXPLD_L3_IDX; - break; - case RTE_ETH_FLOW_L2_PAYLOAD: - payload = raw_pkt + len; - /* - * ARP packet is a special case on which the payload - * starts after the whole ARP header - */ - if (fdir_input->flow.l2_flow.ether_type == - rte_cpu_to_be_16(RTE_ETHER_TYPE_ARP)) - payload += sizeof(struct rte_arp_hdr); - set_idx = I40E_FLXPLD_L2_IDX; - break; - default: - PMD_DRV_LOG(ERR, "unknown flow type %u.", fdir_input->flow_type); - return -EINVAL; - } - - /* fill the flexbytes to payload */ - for (i = 0; i < I40E_MAX_FLXPLD_FIED; i++) { - pit_idx = set_idx * I40E_MAX_FLXPLD_FIED + i; - size = pf->fdir.flex_set[pit_idx].size; - if (size == 0) - continue; - dst = pf->fdir.flex_set[pit_idx].dst_offset * sizeof(uint16_t); - ptr = payload + - pf->fdir.flex_set[pit_idx].src_offset * sizeof(uint16_t); - rte_memcpy(ptr, - &fdir_input->flow_ext.flexbytes[dst], - size * sizeof(uint16_t)); - } - - return 0; -} static struct i40e_customized_pctype * i40e_flow_fdir_find_customized_pctype(struct i40e_pf *pf, uint8_t pctype) @@ -1703,68 +1442,6 @@ i40e_fdir_entry_pool_put(struct i40e_fdir_info *fdir_info, rte_bitmap_set(fdir_info->fdir_flow_pool.bitmap, f->idx); } -/* - * i40e_add_del_fdir_filter - add or remove a flow director filter. - * @pf: board private structure - * @filter: fdir filter entry - * @add: 0 - delete, 1 - add - */ -int -i40e_add_del_fdir_filter(struct rte_eth_dev *dev, - const struct rte_eth_fdir_filter *filter, - bool add) -{ - struct i40e_hw *hw = I40E_DEV_PRIVATE_TO_HW(dev->data->dev_private); - struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private); - unsigned char *pkt = (unsigned char *)pf->fdir.prg_pkt[0]; - enum i40e_filter_pctype pctype; - int ret = 0; - - if (dev->data->dev_conf.fdir_conf.mode != RTE_FDIR_MODE_PERFECT) { - PMD_DRV_LOG(ERR, "FDIR is not enabled, please" - " check the mode in fdir_conf."); - return -ENOTSUP; - } - - pctype = i40e_flowtype_to_pctype(pf->adapter, filter->input.flow_type); - if (pctype == I40E_FILTER_PCTYPE_INVALID) { - PMD_DRV_LOG(ERR, "invalid flow_type input."); - return -EINVAL; - } - if (filter->action.rx_queue >= pf->dev_data->nb_rx_queues) { - PMD_DRV_LOG(ERR, "Invalid queue ID"); - return -EINVAL; - } - if (filter->input.flow_ext.is_vf && - filter->input.flow_ext.dst_id >= pf->vf_num) { - PMD_DRV_LOG(ERR, "Invalid VF ID"); - return -EINVAL; - } - - memset(pkt, 0, I40E_FDIR_PKT_LEN); - - ret = i40e_fdir_construct_pkt(pf, &filter->input, pkt); - if (ret < 0) { - PMD_DRV_LOG(ERR, "construct packet for fdir fails."); - return ret; - } - - if (hw->mac.type == I40E_MAC_X722) { - /* get translated pctype value in fd pctype register */ - pctype = (enum i40e_filter_pctype)i40e_read_rx_ctl( - hw, I40E_GLQF_FD_PCTYPES((int)pctype)); - } - - ret = i40e_fdir_filter_programming(pf, pctype, filter, add); - if (ret < 0) { - PMD_DRV_LOG(ERR, "fdir programming fails for PCTYPE(%u).", - pctype); - return ret; - } - - return ret; -} - static inline unsigned char * i40e_find_available_buffer(struct rte_eth_dev *dev) { @@ -1939,141 +1616,6 @@ i40e_flow_add_del_fdir_filter(struct rte_eth_dev *dev, return ret; } -/* - * i40e_fdir_filter_programming - Program a flow director filter rule. - * Is done by Flow Director Programming Descriptor followed by packet - * structure that contains the filter fields need to match. - * @pf: board private structure - * @pctype: pctype - * @filter: fdir filter entry - * @add: 0 - delete, 1 - add - */ -static int -i40e_fdir_filter_programming(struct i40e_pf *pf, - enum i40e_filter_pctype pctype, - const struct rte_eth_fdir_filter *filter, - bool add) -{ - struct i40e_tx_queue *txq = pf->fdir.txq; - struct i40e_rx_queue *rxq = pf->fdir.rxq; - const struct rte_eth_fdir_action *fdir_action = &filter->action; - volatile struct i40e_tx_desc *txdp; - volatile struct i40e_filter_program_desc *fdirdp; - uint32_t td_cmd; - uint16_t vsi_id, i; - uint8_t dest; - - PMD_DRV_LOG(INFO, "filling filter programming descriptor."); - fdirdp = (volatile struct i40e_filter_program_desc *) - (&(txq->tx_ring[txq->tx_tail])); - - fdirdp->qindex_flex_ptype_vsi = - rte_cpu_to_le_32((fdir_action->rx_queue << - I40E_TXD_FLTR_QW0_QINDEX_SHIFT) & - I40E_TXD_FLTR_QW0_QINDEX_MASK); - - fdirdp->qindex_flex_ptype_vsi |= - rte_cpu_to_le_32((fdir_action->flex_off << - I40E_TXD_FLTR_QW0_FLEXOFF_SHIFT) & - I40E_TXD_FLTR_QW0_FLEXOFF_MASK); - - fdirdp->qindex_flex_ptype_vsi |= - rte_cpu_to_le_32((pctype << - I40E_TXD_FLTR_QW0_PCTYPE_SHIFT) & - I40E_TXD_FLTR_QW0_PCTYPE_MASK); - - if (filter->input.flow_ext.is_vf) - vsi_id = pf->vfs[filter->input.flow_ext.dst_id].vsi->vsi_id; - else - /* Use LAN VSI Id by default */ - vsi_id = pf->main_vsi->vsi_id; - fdirdp->qindex_flex_ptype_vsi |= - rte_cpu_to_le_32(((uint32_t)vsi_id << - I40E_TXD_FLTR_QW0_DEST_VSI_SHIFT) & - I40E_TXD_FLTR_QW0_DEST_VSI_MASK); - - fdirdp->dtype_cmd_cntindex = - rte_cpu_to_le_32(I40E_TX_DESC_DTYPE_FILTER_PROG); - - if (add) - fdirdp->dtype_cmd_cntindex |= rte_cpu_to_le_32( - I40E_FILTER_PROGRAM_DESC_PCMD_ADD_UPDATE << - I40E_TXD_FLTR_QW1_PCMD_SHIFT); - else - fdirdp->dtype_cmd_cntindex |= rte_cpu_to_le_32( - I40E_FILTER_PROGRAM_DESC_PCMD_REMOVE << - I40E_TXD_FLTR_QW1_PCMD_SHIFT); - - if (fdir_action->behavior == RTE_ETH_FDIR_REJECT) - dest = I40E_FILTER_PROGRAM_DESC_DEST_DROP_PACKET; - else if (fdir_action->behavior == RTE_ETH_FDIR_ACCEPT) - dest = I40E_FILTER_PROGRAM_DESC_DEST_DIRECT_PACKET_QINDEX; - else if (fdir_action->behavior == RTE_ETH_FDIR_PASSTHRU) - dest = I40E_FILTER_PROGRAM_DESC_DEST_DIRECT_PACKET_OTHER; - else { - PMD_DRV_LOG(ERR, "Failed to program FDIR filter:" - " unsupported fdir behavior."); - return -EINVAL; - } - - fdirdp->dtype_cmd_cntindex |= rte_cpu_to_le_32((dest << - I40E_TXD_FLTR_QW1_DEST_SHIFT) & - I40E_TXD_FLTR_QW1_DEST_MASK); - - fdirdp->dtype_cmd_cntindex |= - rte_cpu_to_le_32((fdir_action->report_status<< - I40E_TXD_FLTR_QW1_FD_STATUS_SHIFT) & - I40E_TXD_FLTR_QW1_FD_STATUS_MASK); - - fdirdp->dtype_cmd_cntindex |= - rte_cpu_to_le_32(I40E_TXD_FLTR_QW1_CNT_ENA_MASK); - fdirdp->dtype_cmd_cntindex |= - rte_cpu_to_le_32( - ((uint32_t)pf->fdir.match_counter_index << - I40E_TXD_FLTR_QW1_CNTINDEX_SHIFT) & - I40E_TXD_FLTR_QW1_CNTINDEX_MASK); - - fdirdp->fd_id = rte_cpu_to_le_32(filter->soft_id); - - PMD_DRV_LOG(INFO, "filling transmit descriptor."); - txdp = &(txq->tx_ring[txq->tx_tail + 1]); - txdp->buffer_addr = rte_cpu_to_le_64(pf->fdir.dma_addr[0]); - td_cmd = I40E_TX_DESC_CMD_EOP | - I40E_TX_DESC_CMD_RS | - I40E_TX_DESC_CMD_DUMMY; - - txdp->cmd_type_offset_bsz = - i40e_build_ctob(td_cmd, 0, I40E_FDIR_PKT_LEN, 0); - - txq->tx_tail += 2; /* set 2 descriptors above, fdirdp and txdp */ - if (txq->tx_tail >= txq->nb_tx_desc) - txq->tx_tail = 0; - /* Update the tx tail register */ - rte_wmb(); - I40E_PCI_REG_WRITE(txq->qtx_tail, txq->tx_tail); - for (i = 0; i < I40E_FDIR_MAX_WAIT_US; i++) { - if ((txdp->cmd_type_offset_bsz & - rte_cpu_to_le_64(I40E_TXD_QW1_DTYPE_MASK)) == - rte_cpu_to_le_64(I40E_TX_DESC_DTYPE_DESC_DONE)) - break; - rte_delay_us(1); - } - if (i >= I40E_FDIR_MAX_WAIT_US) { - PMD_DRV_LOG(ERR, "Failed to program FDIR filter:" - " time out to get DD on tx queue."); - return -ETIMEDOUT; - } - /* totally delay 10 ms to check programming status*/ - for (; i < I40E_FDIR_MAX_WAIT_US; i++) { - if (i40e_check_fdir_programming_status(rxq) >= 0) - return 0; - rte_delay_us(1); - } - PMD_DRV_LOG(ERR, - "Failed to program FDIR filter: programming status reported."); - return -ETIMEDOUT; -} - /* * i40e_flow_fdir_filter_programming - Program a flow director filter rule. * Is done by Flow Director Programming Descriptor followed by packet @@ -2401,87 +1943,6 @@ i40e_fdir_stats_get(struct rte_eth_dev *dev, struct rte_eth_fdir_stats *stat) I40E_PFQF_FDSTAT_BEST_CNT_SHIFT); } -static int -i40e_fdir_filter_set(struct rte_eth_dev *dev, - struct rte_eth_fdir_filter_info *info) -{ - struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private); - int ret = 0; - - if (!info) { - PMD_DRV_LOG(ERR, "Invalid pointer"); - return -EFAULT; - } - - switch (info->info_type) { - case RTE_ETH_FDIR_FILTER_INPUT_SET_SELECT: - ret = i40e_fdir_filter_inset_select(pf, - &(info->info.input_set_conf)); - break; - default: - PMD_DRV_LOG(ERR, "FD filter info type (%d) not supported", - info->info_type); - return -EINVAL; - } - - return ret; -} - -/* - * i40e_fdir_ctrl_func - deal with all operations on flow director. - * @pf: board private structure - * @filter_op:operation will be taken. - * @arg: a pointer to specific structure corresponding to the filter_op - */ -int -i40e_fdir_ctrl_func(struct rte_eth_dev *dev, - enum rte_filter_op filter_op, - void *arg) -{ - struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private); - int ret = 0; - - if ((pf->flags & I40E_FLAG_FDIR) == 0) - return -ENOTSUP; - - if (filter_op == RTE_ETH_FILTER_NOP) - return 0; - - if (arg == NULL && filter_op != RTE_ETH_FILTER_FLUSH) - return -EINVAL; - - switch (filter_op) { - case RTE_ETH_FILTER_ADD: - ret = i40e_add_del_fdir_filter(dev, - (struct rte_eth_fdir_filter *)arg, - TRUE); - break; - case RTE_ETH_FILTER_DELETE: - ret = i40e_add_del_fdir_filter(dev, - (struct rte_eth_fdir_filter *)arg, - FALSE); - break; - case RTE_ETH_FILTER_FLUSH: - ret = i40e_fdir_flush(dev); - break; - case RTE_ETH_FILTER_INFO: - i40e_fdir_info_get(dev, (struct rte_eth_fdir_info *)arg); - break; - case RTE_ETH_FILTER_SET: - ret = i40e_fdir_filter_set(dev, - (struct rte_eth_fdir_filter_info *)arg); - break; - case RTE_ETH_FILTER_STATS: - i40e_fdir_stats_get(dev, (struct rte_eth_fdir_stats *)arg); - break; - default: - PMD_DRV_LOG(ERR, "unknown operation %u.", filter_op); - ret = -EINVAL; - break; - } - return ret; -} - /* Restore flow director filter */ void i40e_fdir_filter_restore(struct i40e_pf *pf) diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c index 2a0f1761ba..e82f7baa2b 100644 --- a/drivers/net/ixgbe/ixgbe_ethdev.c +++ b/drivers/net/ixgbe/ixgbe_ethdev.c @@ -6799,7 +6799,7 @@ ixgbe_add_del_ethertype_filter(struct rte_eth_dev *dev, } static int -ixgbe_dev_filter_ctrl(struct rte_eth_dev *dev, +ixgbe_dev_filter_ctrl(__rte_unused struct rte_eth_dev *dev, enum rte_filter_type filter_type, enum rte_filter_op filter_op, void *arg) @@ -6807,9 +6807,6 @@ ixgbe_dev_filter_ctrl(struct rte_eth_dev *dev, int ret = 0; switch (filter_type) { - case RTE_ETH_FILTER_FDIR: - ret = ixgbe_fdir_ctrl_func(dev, filter_op, arg); - break; case RTE_ETH_FILTER_GENERIC: if (filter_op != RTE_ETH_FILTER_GET) return -EINVAL; diff --git a/drivers/net/ixgbe/ixgbe_ethdev.h b/drivers/net/ixgbe/ixgbe_ethdev.h index 9bdef87fbd..b342d70b8b 100644 --- a/drivers/net/ixgbe/ixgbe_ethdev.h +++ b/drivers/net/ixgbe/ixgbe_ethdev.h @@ -727,8 +727,6 @@ int ixgbe_pf_host_configure(struct rte_eth_dev *eth_dev); uint32_t ixgbe_convert_vm_rx_mask_to_val(uint16_t rx_mask, uint32_t orig_val); -int ixgbe_fdir_ctrl_func(struct rte_eth_dev *dev, - enum rte_filter_op filter_op, void *arg); void ixgbe_fdir_filter_restore(struct rte_eth_dev *dev); int ixgbe_clear_all_fdir_filter(struct rte_eth_dev *dev); diff --git a/drivers/net/ixgbe/ixgbe_fdir.c b/drivers/net/ixgbe/ixgbe_fdir.c index 6faaa8f067..a0fab5070d 100644 --- a/drivers/net/ixgbe/ixgbe_fdir.c +++ b/drivers/net/ixgbe/ixgbe_fdir.c @@ -87,10 +87,6 @@ static int fdir_set_input_mask_x550(struct rte_eth_dev *dev); static int ixgbe_set_fdir_flex_conf(struct rte_eth_dev *dev, const struct rte_eth_fdir_flex_conf *conf, uint32_t *fdirctrl); static int fdir_enable_82599(struct ixgbe_hw *hw, uint32_t fdirctrl); -static int ixgbe_fdir_filter_to_atr_input( - const struct rte_eth_fdir_filter *fdir_filter, - union ixgbe_atr_input *input, - enum rte_fdir_mode mode); static uint32_t ixgbe_atr_compute_hash_82599(union ixgbe_atr_input *atr_input, uint32_t key); static uint32_t atr_compute_sig_hash_82599(union ixgbe_atr_input *input, @@ -104,10 +100,6 @@ static int fdir_write_perfect_filter_82599(struct ixgbe_hw *hw, static int fdir_add_signature_filter_82599(struct ixgbe_hw *hw, union ixgbe_atr_input *input, u8 queue, uint32_t fdircmd, uint32_t fdirhash); -static int ixgbe_add_del_fdir_filter(struct rte_eth_dev *dev, - const struct rte_eth_fdir_filter *fdir_filter, - bool del, - bool update); static int ixgbe_fdir_flush(struct rte_eth_dev *dev); /** @@ -679,114 +671,6 @@ ixgbe_fdir_configure(struct rte_eth_dev *dev) return 0; } -/* - * Convert DPDK rte_eth_fdir_filter struct to ixgbe_atr_input union that is used - * by the IXGBE driver code. - */ -static int -ixgbe_fdir_filter_to_atr_input(const struct rte_eth_fdir_filter *fdir_filter, - union ixgbe_atr_input *input, enum rte_fdir_mode mode) -{ - input->formatted.vlan_id = fdir_filter->input.flow_ext.vlan_tci; - input->formatted.flex_bytes = (uint16_t)( - (fdir_filter->input.flow_ext.flexbytes[1] << 8 & 0xFF00) | - (fdir_filter->input.flow_ext.flexbytes[0] & 0xFF)); - - switch (fdir_filter->input.flow_type) { - case RTE_ETH_FLOW_NONFRAG_IPV4_UDP: - input->formatted.flow_type = IXGBE_ATR_FLOW_TYPE_UDPV4; - break; - case RTE_ETH_FLOW_NONFRAG_IPV4_TCP: - input->formatted.flow_type = IXGBE_ATR_FLOW_TYPE_TCPV4; - break; - case RTE_ETH_FLOW_NONFRAG_IPV4_SCTP: - input->formatted.flow_type = IXGBE_ATR_FLOW_TYPE_SCTPV4; - break; - case RTE_ETH_FLOW_NONFRAG_IPV4_OTHER: - input->formatted.flow_type = IXGBE_ATR_FLOW_TYPE_IPV4; - break; - case RTE_ETH_FLOW_NONFRAG_IPV6_UDP: - input->formatted.flow_type = IXGBE_ATR_FLOW_TYPE_UDPV6; - break; - case RTE_ETH_FLOW_NONFRAG_IPV6_TCP: - input->formatted.flow_type = IXGBE_ATR_FLOW_TYPE_TCPV6; - break; - case RTE_ETH_FLOW_NONFRAG_IPV6_SCTP: - input->formatted.flow_type = IXGBE_ATR_FLOW_TYPE_SCTPV6; - break; - case RTE_ETH_FLOW_NONFRAG_IPV6_OTHER: - input->formatted.flow_type = IXGBE_ATR_FLOW_TYPE_IPV6; - break; - default: - break; - } - - switch (fdir_filter->input.flow_type) { - case RTE_ETH_FLOW_NONFRAG_IPV4_UDP: - case RTE_ETH_FLOW_NONFRAG_IPV4_TCP: - input->formatted.src_port = - fdir_filter->input.flow.udp4_flow.src_port; - input->formatted.dst_port = - fdir_filter->input.flow.udp4_flow.dst_port; - /* fall-through */ - /*for SCTP flow type, port and verify_tag are meaningless in ixgbe.*/ - case RTE_ETH_FLOW_NONFRAG_IPV4_SCTP: - case RTE_ETH_FLOW_NONFRAG_IPV4_OTHER: - input->formatted.src_ip[0] = - fdir_filter->input.flow.ip4_flow.src_ip; - input->formatted.dst_ip[0] = - fdir_filter->input.flow.ip4_flow.dst_ip; - break; - - case RTE_ETH_FLOW_NONFRAG_IPV6_UDP: - case RTE_ETH_FLOW_NONFRAG_IPV6_TCP: - input->formatted.src_port = - fdir_filter->input.flow.udp6_flow.src_port; - input->formatted.dst_port = - fdir_filter->input.flow.udp6_flow.dst_port; - /* fall-through */ - /*for SCTP flow type, port and verify_tag are meaningless in ixgbe.*/ - case RTE_ETH_FLOW_NONFRAG_IPV6_SCTP: - case RTE_ETH_FLOW_NONFRAG_IPV6_OTHER: - rte_memcpy(input->formatted.src_ip, - fdir_filter->input.flow.ipv6_flow.src_ip, - sizeof(input->formatted.src_ip)); - rte_memcpy(input->formatted.dst_ip, - fdir_filter->input.flow.ipv6_flow.dst_ip, - sizeof(input->formatted.dst_ip)); - break; - default: - break; - } - - if (mode == RTE_FDIR_MODE_PERFECT_MAC_VLAN) { - rte_memcpy( - input->formatted.inner_mac, - fdir_filter->input.flow.mac_vlan_flow.mac_addr.addr_bytes, - sizeof(input->formatted.inner_mac)); - } else if (mode == RTE_FDIR_MODE_PERFECT_TUNNEL) { - rte_memcpy( - input->formatted.inner_mac, - fdir_filter->input.flow.tunnel_flow.mac_addr.addr_bytes, - sizeof(input->formatted.inner_mac)); - if (fdir_filter->input.flow.tunnel_flow.tunnel_type == - RTE_FDIR_TUNNEL_TYPE_VXLAN) - input->formatted.tunnel_type = - IXGBE_FDIR_VXLAN_TUNNEL_TYPE; - else if (fdir_filter->input.flow.tunnel_flow.tunnel_type == - RTE_FDIR_TUNNEL_TYPE_NVGRE) - input->formatted.tunnel_type = - IXGBE_FDIR_NVGRE_TUNNEL_TYPE; - else - PMD_DRV_LOG(ERR, " invalid tunnel type arguments."); - - input->formatted.tni_vni = - fdir_filter->input.flow.tunnel_flow.tunnel_id >> 8; - } - - return 0; -} - /* * The below function is taken from the FreeBSD IXGBE drivers release * 2.3.8. The only change is not to mask hash_result with IXGBE_ATR_HASH_MASK @@ -1194,31 +1078,6 @@ ixgbe_remove_fdir_filter(struct ixgbe_hw_fdir_info *fdir_info, return 0; } -static int -ixgbe_interpret_fdir_filter(struct rte_eth_dev *dev, - const struct rte_eth_fdir_filter *fdir_filter, - struct ixgbe_fdir_rule *rule) -{ - enum rte_fdir_mode fdir_mode = dev->data->dev_conf.fdir_conf.mode; - int err; - - memset(rule, 0, sizeof(struct ixgbe_fdir_rule)); - - err = ixgbe_fdir_filter_to_atr_input(fdir_filter, - &rule->ixgbe_fdir, - fdir_mode); - if (err) - return err; - - rule->mode = fdir_mode; - if (fdir_filter->action.behavior == RTE_ETH_FDIR_REJECT) - rule->fdirflags = IXGBE_FDIRCMD_DROP; - rule->queue = fdir_filter->action.rx_queue; - rule->soft_id = fdir_filter->soft_id; - - return 0; -} - int ixgbe_fdir_filter_program(struct rte_eth_dev *dev, struct ixgbe_fdir_rule *rule, @@ -1364,29 +1223,6 @@ ixgbe_fdir_filter_program(struct rte_eth_dev *dev, return err; } -/* ixgbe_add_del_fdir_filter - add or remove a flow diretor filter. - * @dev: pointer to the structure rte_eth_dev - * @fdir_filter: fdir filter entry - * @del: 1 - delete, 0 - add - * @update: 1 - update - */ -static int -ixgbe_add_del_fdir_filter(struct rte_eth_dev *dev, - const struct rte_eth_fdir_filter *fdir_filter, - bool del, - bool update) -{ - struct ixgbe_fdir_rule rule; - int err; - - err = ixgbe_interpret_fdir_filter(dev, fdir_filter, &rule); - - if (err) - return err; - - return ixgbe_fdir_filter_program(dev, &rule, del, update); -} - static int ixgbe_fdir_flush(struct rte_eth_dev *dev) { @@ -1524,62 +1360,6 @@ ixgbe_fdir_stats_get(struct rte_eth_dev *dev, struct rte_eth_fdir_stats *fdir_st } -/* - * ixgbe_fdir_ctrl_func - deal with all operations on flow director. - * @dev: pointer to the structure rte_eth_dev - * @filter_op:operation will be taken - * @arg: a pointer to specific structure corresponding to the filter_op - */ -int -ixgbe_fdir_ctrl_func(struct rte_eth_dev *dev, - enum rte_filter_op filter_op, void *arg) -{ - struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private); - int ret = 0; - - if (hw->mac.type != ixgbe_mac_82599EB && - hw->mac.type != ixgbe_mac_X540 && - hw->mac.type != ixgbe_mac_X550 && - hw->mac.type != ixgbe_mac_X550EM_x && - hw->mac.type != ixgbe_mac_X550EM_a) - return -ENOTSUP; - - if (filter_op == RTE_ETH_FILTER_NOP) - return 0; - - if (arg == NULL && filter_op != RTE_ETH_FILTER_FLUSH) - return -EINVAL; - - switch (filter_op) { - case RTE_ETH_FILTER_ADD: - ret = ixgbe_add_del_fdir_filter(dev, - (struct rte_eth_fdir_filter *)arg, FALSE, FALSE); - break; - case RTE_ETH_FILTER_UPDATE: - ret = ixgbe_add_del_fdir_filter(dev, - (struct rte_eth_fdir_filter *)arg, FALSE, TRUE); - break; - case RTE_ETH_FILTER_DELETE: - ret = ixgbe_add_del_fdir_filter(dev, - (struct rte_eth_fdir_filter *)arg, TRUE, FALSE); - break; - case RTE_ETH_FILTER_FLUSH: - ret = ixgbe_fdir_flush(dev); - break; - case RTE_ETH_FILTER_INFO: - ixgbe_fdir_info_get(dev, (struct rte_eth_fdir_info *)arg); - break; - case RTE_ETH_FILTER_STATS: - ixgbe_fdir_stats_get(dev, (struct rte_eth_fdir_stats *)arg); - break; - default: - PMD_DRV_LOG(ERR, "unknown operation %u", filter_op); - ret = -EINVAL; - break; - } - return ret; -} - /* restore flow director filter */ void ixgbe_fdir_filter_restore(struct rte_eth_dev *dev) diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h index 1408cf94d6..a0082e4f71 100644 --- a/drivers/net/mlx5/mlx5.h +++ b/drivers/net/mlx5/mlx5.h @@ -878,7 +878,6 @@ struct mlx5_priv { uint8_t skip_default_rss_reta; /* Skip configuration of default reta. */ uint8_t fdb_def_rule; /* Whether fdb jump to table 1 is configured. */ struct mlx5_mp_id mp_id; /* ID of a multi-process process */ - LIST_HEAD(fdir, mlx5_fdir_flow) fdir_flows; /* fdir flows. */ }; #define PORT_ID(priv) ((priv)->dev_data->port_id) diff --git a/drivers/net/mlx5/mlx5_flow.c b/drivers/net/mlx5/mlx5_flow.c index 3d38e11c87..afe3149495 100644 --- a/drivers/net/mlx5/mlx5_flow.c +++ b/drivers/net/mlx5/mlx5_flow.c @@ -557,32 +557,6 @@ static const struct rte_flow_ops mlx5_flow_ops = { .get_aged_flows = mlx5_flow_get_aged_flows, }; -/* Convert FDIR request to Generic flow. */ -struct mlx5_fdir { - struct rte_flow_attr attr; - struct rte_flow_item items[4]; - struct rte_flow_item_eth l2; - struct rte_flow_item_eth l2_mask; - union { - struct rte_flow_item_ipv4 ipv4; - struct rte_flow_item_ipv6 ipv6; - } l3; - union { - struct rte_flow_item_ipv4 ipv4; - struct rte_flow_item_ipv6 ipv6; - } l3_mask; - union { - struct rte_flow_item_udp udp; - struct rte_flow_item_tcp tcp; - } l4; - union { - struct rte_flow_item_udp udp; - struct rte_flow_item_tcp tcp; - } l4_mask; - struct rte_flow_action actions[2]; - struct rte_flow_action_queue queue; -}; - /* Tunnel information. */ struct mlx5_flow_tunnel_info { uint64_t tunnel; /**< Tunnel bit (see MLX5_FLOW_*). */ @@ -5310,7 +5284,6 @@ flow_list_destroy(struct rte_eth_dev *dev, uint32_t *list, uint32_t flow_idx) { struct mlx5_priv *priv = dev->data->dev_private; - struct mlx5_fdir_flow *priv_fdir_flow = NULL; struct rte_flow *flow = mlx5_ipool_get(priv->sh->ipool [MLX5_IPOOL_RTE_FLOW], flow_idx); @@ -5330,17 +5303,6 @@ flow_list_destroy(struct rte_eth_dev *dev, uint32_t *list, ILIST_REMOVE(priv->sh->ipool[MLX5_IPOOL_RTE_FLOW], list, flow_idx, flow, next); flow_mreg_del_copy_action(dev, flow); - if (flow->fdir) { - LIST_FOREACH(priv_fdir_flow, &priv->fdir_flows, next) { - if (priv_fdir_flow->rix_flow == flow_idx) - break; - } - if (priv_fdir_flow) { - LIST_REMOVE(priv_fdir_flow, next); - mlx5_free(priv_fdir_flow->fdir); - mlx5_free(priv_fdir_flow); - } - } mlx5_ipool_free(priv->sh->ipool[MLX5_IPOOL_RTE_FLOW], flow_idx); } @@ -5878,482 +5840,6 @@ mlx5_flow_query(struct rte_eth_dev *dev, return 0; } -/** - * Convert a flow director filter to a generic flow. - * - * @param dev - * Pointer to Ethernet device. - * @param fdir_filter - * Flow director filter to add. - * @param attributes - * Generic flow parameters structure. - * - * @return - * 0 on success, a negative errno value otherwise and rte_errno is set. - */ -static int -flow_fdir_filter_convert(struct rte_eth_dev *dev, - const struct rte_eth_fdir_filter *fdir_filter, - struct mlx5_fdir *attributes) -{ - struct mlx5_priv *priv = dev->data->dev_private; - const struct rte_eth_fdir_input *input = &fdir_filter->input; - const struct rte_eth_fdir_masks *mask = - &dev->data->dev_conf.fdir_conf.mask; - - /* Validate queue number. */ - if (fdir_filter->action.rx_queue >= priv->rxqs_n) { - DRV_LOG(ERR, "port %u invalid queue number %d", - dev->data->port_id, fdir_filter->action.rx_queue); - rte_errno = EINVAL; - return -rte_errno; - } - attributes->attr.ingress = 1; - attributes->items[0] = (struct rte_flow_item) { - .type = RTE_FLOW_ITEM_TYPE_ETH, - .spec = &attributes->l2, - .mask = &attributes->l2_mask, - }; - switch (fdir_filter->action.behavior) { - case RTE_ETH_FDIR_ACCEPT: - attributes->actions[0] = (struct rte_flow_action){ - .type = RTE_FLOW_ACTION_TYPE_QUEUE, - .conf = &attributes->queue, - }; - break; - case RTE_ETH_FDIR_REJECT: - attributes->actions[0] = (struct rte_flow_action){ - .type = RTE_FLOW_ACTION_TYPE_DROP, - }; - break; - default: - DRV_LOG(ERR, "port %u invalid behavior %d", - dev->data->port_id, - fdir_filter->action.behavior); - rte_errno = ENOTSUP; - return -rte_errno; - } - attributes->queue.index = fdir_filter->action.rx_queue; - /* Handle L3. */ - switch (fdir_filter->input.flow_type) { - case RTE_ETH_FLOW_NONFRAG_IPV4_UDP: - case RTE_ETH_FLOW_NONFRAG_IPV4_TCP: - case RTE_ETH_FLOW_NONFRAG_IPV4_OTHER: - attributes->l3.ipv4.hdr = (struct rte_ipv4_hdr){ - .src_addr = input->flow.ip4_flow.src_ip, - .dst_addr = input->flow.ip4_flow.dst_ip, - .time_to_live = input->flow.ip4_flow.ttl, - .type_of_service = input->flow.ip4_flow.tos, - }; - attributes->l3_mask.ipv4.hdr = (struct rte_ipv4_hdr){ - .src_addr = mask->ipv4_mask.src_ip, - .dst_addr = mask->ipv4_mask.dst_ip, - .time_to_live = mask->ipv4_mask.ttl, - .type_of_service = mask->ipv4_mask.tos, - .next_proto_id = mask->ipv4_mask.proto, - }; - attributes->items[1] = (struct rte_flow_item){ - .type = RTE_FLOW_ITEM_TYPE_IPV4, - .spec = &attributes->l3, - .mask = &attributes->l3_mask, - }; - break; - case RTE_ETH_FLOW_NONFRAG_IPV6_UDP: - case RTE_ETH_FLOW_NONFRAG_IPV6_TCP: - case RTE_ETH_FLOW_NONFRAG_IPV6_OTHER: - attributes->l3.ipv6.hdr = (struct rte_ipv6_hdr){ - .hop_limits = input->flow.ipv6_flow.hop_limits, - .proto = input->flow.ipv6_flow.proto, - }; - - memcpy(attributes->l3.ipv6.hdr.src_addr, - input->flow.ipv6_flow.src_ip, - RTE_DIM(attributes->l3.ipv6.hdr.src_addr)); - memcpy(attributes->l3.ipv6.hdr.dst_addr, - input->flow.ipv6_flow.dst_ip, - RTE_DIM(attributes->l3.ipv6.hdr.src_addr)); - memcpy(attributes->l3_mask.ipv6.hdr.src_addr, - mask->ipv6_mask.src_ip, - RTE_DIM(attributes->l3_mask.ipv6.hdr.src_addr)); - memcpy(attributes->l3_mask.ipv6.hdr.dst_addr, - mask->ipv6_mask.dst_ip, - RTE_DIM(attributes->l3_mask.ipv6.hdr.src_addr)); - attributes->items[1] = (struct rte_flow_item){ - .type = RTE_FLOW_ITEM_TYPE_IPV6, - .spec = &attributes->l3, - .mask = &attributes->l3_mask, - }; - break; - default: - DRV_LOG(ERR, "port %u invalid flow type%d", - dev->data->port_id, fdir_filter->input.flow_type); - rte_errno = ENOTSUP; - return -rte_errno; - } - /* Handle L4. */ - switch (fdir_filter->input.flow_type) { - case RTE_ETH_FLOW_NONFRAG_IPV4_UDP: - attributes->l4.udp.hdr = (struct rte_udp_hdr){ - .src_port = input->flow.udp4_flow.src_port, - .dst_port = input->flow.udp4_flow.dst_port, - }; - attributes->l4_mask.udp.hdr = (struct rte_udp_hdr){ - .src_port = mask->src_port_mask, - .dst_port = mask->dst_port_mask, - }; - attributes->items[2] = (struct rte_flow_item){ - .type = RTE_FLOW_ITEM_TYPE_UDP, - .spec = &attributes->l4, - .mask = &attributes->l4_mask, - }; - break; - case RTE_ETH_FLOW_NONFRAG_IPV4_TCP: - attributes->l4.tcp.hdr = (struct rte_tcp_hdr){ - .src_port = input->flow.tcp4_flow.src_port, - .dst_port = input->flow.tcp4_flow.dst_port, - }; - attributes->l4_mask.tcp.hdr = (struct rte_tcp_hdr){ - .src_port = mask->src_port_mask, - .dst_port = mask->dst_port_mask, - }; - attributes->items[2] = (struct rte_flow_item){ - .type = RTE_FLOW_ITEM_TYPE_TCP, - .spec = &attributes->l4, - .mask = &attributes->l4_mask, - }; - break; - case RTE_ETH_FLOW_NONFRAG_IPV6_UDP: - attributes->l4.udp.hdr = (struct rte_udp_hdr){ - .src_port = input->flow.udp6_flow.src_port, - .dst_port = input->flow.udp6_flow.dst_port, - }; - attributes->l4_mask.udp.hdr = (struct rte_udp_hdr){ - .src_port = mask->src_port_mask, - .dst_port = mask->dst_port_mask, - }; - attributes->items[2] = (struct rte_flow_item){ - .type = RTE_FLOW_ITEM_TYPE_UDP, - .spec = &attributes->l4, - .mask = &attributes->l4_mask, - }; - break; - case RTE_ETH_FLOW_NONFRAG_IPV6_TCP: - attributes->l4.tcp.hdr = (struct rte_tcp_hdr){ - .src_port = input->flow.tcp6_flow.src_port, - .dst_port = input->flow.tcp6_flow.dst_port, - }; - attributes->l4_mask.tcp.hdr = (struct rte_tcp_hdr){ - .src_port = mask->src_port_mask, - .dst_port = mask->dst_port_mask, - }; - attributes->items[2] = (struct rte_flow_item){ - .type = RTE_FLOW_ITEM_TYPE_TCP, - .spec = &attributes->l4, - .mask = &attributes->l4_mask, - }; - break; - case RTE_ETH_FLOW_NONFRAG_IPV4_OTHER: - case RTE_ETH_FLOW_NONFRAG_IPV6_OTHER: - break; - default: - DRV_LOG(ERR, "port %u invalid flow type%d", - dev->data->port_id, fdir_filter->input.flow_type); - rte_errno = ENOTSUP; - return -rte_errno; - } - return 0; -} - -#define FLOW_FDIR_CMP(f1, f2, fld) \ - memcmp(&(f1)->fld, &(f2)->fld, sizeof(f1->fld)) - -/** - * Compare two FDIR flows. If items and actions are identical, the two flows are - * regarded as same. - * - * @param dev - * Pointer to Ethernet device. - * @param f1 - * FDIR flow to compare. - * @param f2 - * FDIR flow to compare. - * - * @return - * Zero on match, 1 otherwise. - */ -static int -flow_fdir_cmp(const struct mlx5_fdir *f1, const struct mlx5_fdir *f2) -{ - if (FLOW_FDIR_CMP(f1, f2, attr) || - FLOW_FDIR_CMP(f1, f2, l2) || - FLOW_FDIR_CMP(f1, f2, l2_mask) || - FLOW_FDIR_CMP(f1, f2, l3) || - FLOW_FDIR_CMP(f1, f2, l3_mask) || - FLOW_FDIR_CMP(f1, f2, l4) || - FLOW_FDIR_CMP(f1, f2, l4_mask) || - FLOW_FDIR_CMP(f1, f2, actions[0].type)) - return 1; - if (f1->actions[0].type == RTE_FLOW_ACTION_TYPE_QUEUE && - FLOW_FDIR_CMP(f1, f2, queue)) - return 1; - return 0; -} - -/** - * Search device flow list to find out a matched FDIR flow. - * - * @param dev - * Pointer to Ethernet device. - * @param fdir_flow - * FDIR flow to lookup. - * - * @return - * Index of flow if found, 0 otherwise. - */ -static uint32_t -flow_fdir_filter_lookup(struct rte_eth_dev *dev, struct mlx5_fdir *fdir_flow) -{ - struct mlx5_priv *priv = dev->data->dev_private; - uint32_t flow_idx = 0; - struct mlx5_fdir_flow *priv_fdir_flow = NULL; - - MLX5_ASSERT(fdir_flow); - LIST_FOREACH(priv_fdir_flow, &priv->fdir_flows, next) { - if (!flow_fdir_cmp(priv_fdir_flow->fdir, fdir_flow)) { - DRV_LOG(DEBUG, "port %u found FDIR flow %u", - dev->data->port_id, flow_idx); - flow_idx = priv_fdir_flow->rix_flow; - break; - } - } - return flow_idx; -} - -/** - * Add new flow director filter and store it in list. - * - * @param dev - * Pointer to Ethernet device. - * @param fdir_filter - * Flow director filter to add. - * - * @return - * 0 on success, a negative errno value otherwise and rte_errno is set. - */ -static int -flow_fdir_filter_add(struct rte_eth_dev *dev, - const struct rte_eth_fdir_filter *fdir_filter) -{ - struct mlx5_priv *priv = dev->data->dev_private; - struct mlx5_fdir *fdir_flow; - struct rte_flow *flow; - struct mlx5_fdir_flow *priv_fdir_flow = NULL; - uint32_t flow_idx; - int ret; - - fdir_flow = mlx5_malloc(MLX5_MEM_ZERO, sizeof(*fdir_flow), 0, - SOCKET_ID_ANY); - if (!fdir_flow) { - rte_errno = ENOMEM; - return -rte_errno; - } - ret = flow_fdir_filter_convert(dev, fdir_filter, fdir_flow); - if (ret) - goto error; - flow_idx = flow_fdir_filter_lookup(dev, fdir_flow); - if (flow_idx) { - rte_errno = EEXIST; - goto error; - } - priv_fdir_flow = mlx5_malloc(MLX5_MEM_ZERO, - sizeof(struct mlx5_fdir_flow), - 0, SOCKET_ID_ANY); - if (!priv_fdir_flow) { - rte_errno = ENOMEM; - goto error; - } - flow_idx = flow_list_create(dev, &priv->flows, &fdir_flow->attr, - fdir_flow->items, fdir_flow->actions, true, - NULL); - flow = mlx5_ipool_get(priv->sh->ipool[MLX5_IPOOL_RTE_FLOW], flow_idx); - if (!flow) - goto error; - flow->fdir = 1; - priv_fdir_flow->fdir = fdir_flow; - priv_fdir_flow->rix_flow = flow_idx; - LIST_INSERT_HEAD(&priv->fdir_flows, priv_fdir_flow, next); - DRV_LOG(DEBUG, "port %u created FDIR flow %p", - dev->data->port_id, (void *)flow); - return 0; -error: - mlx5_free(priv_fdir_flow); - mlx5_free(fdir_flow); - return -rte_errno; -} - -/** - * Delete specific filter. - * - * @param dev - * Pointer to Ethernet device. - * @param fdir_filter - * Filter to be deleted. - * - * @return - * 0 on success, a negative errno value otherwise and rte_errno is set. - */ -static int -flow_fdir_filter_delete(struct rte_eth_dev *dev, - const struct rte_eth_fdir_filter *fdir_filter) -{ - struct mlx5_priv *priv = dev->data->dev_private; - uint32_t flow_idx; - struct mlx5_fdir fdir_flow = { - .attr.group = 0, - }; - struct mlx5_fdir_flow *priv_fdir_flow = NULL; - int ret; - - ret = flow_fdir_filter_convert(dev, fdir_filter, &fdir_flow); - if (ret) - return -rte_errno; - LIST_FOREACH(priv_fdir_flow, &priv->fdir_flows, next) { - /* Find the fdir in priv list */ - if (!flow_fdir_cmp(priv_fdir_flow->fdir, &fdir_flow)) - break; - } - if (!priv_fdir_flow) - return 0; - LIST_REMOVE(priv_fdir_flow, next); - flow_idx = priv_fdir_flow->rix_flow; - flow_list_destroy(dev, &priv->flows, flow_idx); - mlx5_free(priv_fdir_flow->fdir); - mlx5_free(priv_fdir_flow); - DRV_LOG(DEBUG, "port %u deleted FDIR flow %u", - dev->data->port_id, flow_idx); - return 0; -} - -/** - * Update queue for specific filter. - * - * @param dev - * Pointer to Ethernet device. - * @param fdir_filter - * Filter to be updated. - * - * @return - * 0 on success, a negative errno value otherwise and rte_errno is set. - */ -static int -flow_fdir_filter_update(struct rte_eth_dev *dev, - const struct rte_eth_fdir_filter *fdir_filter) -{ - int ret; - - ret = flow_fdir_filter_delete(dev, fdir_filter); - if (ret) - return ret; - return flow_fdir_filter_add(dev, fdir_filter); -} - -/** - * Flush all filters. - * - * @param dev - * Pointer to Ethernet device. - */ -static void -flow_fdir_filter_flush(struct rte_eth_dev *dev) -{ - struct mlx5_priv *priv = dev->data->dev_private; - struct mlx5_fdir_flow *priv_fdir_flow = NULL; - - while (!LIST_EMPTY(&priv->fdir_flows)) { - priv_fdir_flow = LIST_FIRST(&priv->fdir_flows); - LIST_REMOVE(priv_fdir_flow, next); - flow_list_destroy(dev, &priv->flows, priv_fdir_flow->rix_flow); - mlx5_free(priv_fdir_flow->fdir); - mlx5_free(priv_fdir_flow); - } -} - -/** - * Get flow director information. - * - * @param dev - * Pointer to Ethernet device. - * @param[out] fdir_info - * Resulting flow director information. - */ -static void -flow_fdir_info_get(struct rte_eth_dev *dev, struct rte_eth_fdir_info *fdir_info) -{ - struct rte_eth_fdir_masks *mask = - &dev->data->dev_conf.fdir_conf.mask; - - fdir_info->mode = dev->data->dev_conf.fdir_conf.mode; - fdir_info->guarant_spc = 0; - rte_memcpy(&fdir_info->mask, mask, sizeof(fdir_info->mask)); - fdir_info->max_flexpayload = 0; - fdir_info->flow_types_mask[0] = 0; - fdir_info->flex_payload_unit = 0; - fdir_info->max_flex_payload_segment_num = 0; - fdir_info->flex_payload_limit = 0; - memset(&fdir_info->flex_conf, 0, sizeof(fdir_info->flex_conf)); -} - -/** - * Deal with flow director operations. - * - * @param dev - * Pointer to Ethernet device. - * @param filter_op - * Operation to perform. - * @param arg - * Pointer to operation-specific structure. - * - * @return - * 0 on success, a negative errno value otherwise and rte_errno is set. - */ -static int -flow_fdir_ctrl_func(struct rte_eth_dev *dev, enum rte_filter_op filter_op, - void *arg) -{ - enum rte_fdir_mode fdir_mode = - dev->data->dev_conf.fdir_conf.mode; - - if (filter_op == RTE_ETH_FILTER_NOP) - return 0; - if (fdir_mode != RTE_FDIR_MODE_PERFECT && - fdir_mode != RTE_FDIR_MODE_PERFECT_MAC_VLAN) { - DRV_LOG(ERR, "port %u flow director mode %d not supported", - dev->data->port_id, fdir_mode); - rte_errno = EINVAL; - return -rte_errno; - } - switch (filter_op) { - case RTE_ETH_FILTER_ADD: - return flow_fdir_filter_add(dev, arg); - case RTE_ETH_FILTER_UPDATE: - return flow_fdir_filter_update(dev, arg); - case RTE_ETH_FILTER_DELETE: - return flow_fdir_filter_delete(dev, arg); - case RTE_ETH_FILTER_FLUSH: - flow_fdir_filter_flush(dev); - break; - case RTE_ETH_FILTER_INFO: - flow_fdir_info_get(dev, arg); - break; - default: - DRV_LOG(DEBUG, "port %u unknown operation %u", - dev->data->port_id, filter_op); - rte_errno = EINVAL; - return -rte_errno; - } - return 0; -} - /** * Manage filter operations. * @@ -6383,8 +5869,6 @@ mlx5_dev_filter_ctrl(struct rte_eth_dev *dev, } *(const void **)arg = &mlx5_flow_ops; return 0; - case RTE_ETH_FILTER_FDIR: - return flow_fdir_ctrl_func(dev, filter_op, arg); default: DRV_LOG(ERR, "port %u filter type (%d) not supported", dev->data->port_id, filter_type); diff --git a/drivers/net/mlx5/mlx5_flow.h b/drivers/net/mlx5/mlx5_flow.h index 0dc76c42e2..57fadb442d 100644 --- a/drivers/net/mlx5/mlx5_flow.h +++ b/drivers/net/mlx5/mlx5_flow.h @@ -892,13 +892,6 @@ struct mlx5_flow_meter_profile { uint32_t ref_cnt; /**< Use count. */ }; -/* Fdir flow structure */ -struct mlx5_fdir_flow { - LIST_ENTRY(mlx5_fdir_flow) next; /* Pointer to the next element. */ - struct mlx5_fdir *fdir; /* Pointer to fdir. */ - uint32_t rix_flow; /* Index to flow. */ -}; - #define HAIRPIN_FLOW_ID_BITS 28 /* Flow structure. */ @@ -907,7 +900,6 @@ struct rte_flow { uint32_t dev_handles; /**< Device flow handles that are part of the flow. */ uint32_t drv_type:2; /**< Driver type. */ - uint32_t fdir:1; /**< Identifier of associated FDIR if any. */ uint32_t hairpin_flow_id:HAIRPIN_FLOW_ID_BITS; /**< The flow id used for hairpin. */ uint32_t copy_applied:1; /**< The MARK copy Flow os applied. */ diff --git a/drivers/net/qede/qede_ethdev.h b/drivers/net/qede/qede_ethdev.h index 4fb77b05c2..61a65ac42e 100644 --- a/drivers/net/qede/qede_ethdev.h +++ b/drivers/net/qede/qede_ethdev.h @@ -293,11 +293,6 @@ int qede_ntuple_filter_conf(struct rte_eth_dev *eth_dev, int qede_check_fdir_support(struct rte_eth_dev *eth_dev); -uint16_t qede_fdir_construct_pkt(struct rte_eth_dev *eth_dev, - struct rte_eth_fdir_filter *fdir, - void *buff, - struct ecore_arfs_config_params *params); - void qede_fdir_dealloc_resc(struct rte_eth_dev *eth_dev); int qede_activate_vport(struct rte_eth_dev *eth_dev, bool flg); diff --git a/drivers/net/qede/qede_filter.c b/drivers/net/qede/qede_filter.c index a9870338aa..71c1f68b90 100644 --- a/drivers/net/qede/qede_filter.c +++ b/drivers/net/qede/qede_filter.c @@ -130,14 +130,6 @@ const struct _qede_udp_tunn_types { */ #define QEDE_MAX_FDIR_PKT_LEN (86) -static inline bool qede_valid_flow(uint16_t flow_type) -{ - return ((flow_type == RTE_ETH_FLOW_NONFRAG_IPV4_TCP) || - (flow_type == RTE_ETH_FLOW_NONFRAG_IPV4_UDP) || - (flow_type == RTE_ETH_FLOW_NONFRAG_IPV6_TCP) || - (flow_type == RTE_ETH_FLOW_NONFRAG_IPV6_UDP)); -} - static uint16_t qede_arfs_construct_pkt(struct rte_eth_dev *eth_dev, struct qede_arfs_entry *arfs, @@ -197,74 +189,6 @@ void qede_fdir_dealloc_resc(struct rte_eth_dev *eth_dev) } } -static int -qede_fdir_to_arfs_filter(struct rte_eth_dev *eth_dev, - struct rte_eth_fdir_filter *fdir, - struct qede_arfs_entry *arfs) -{ - struct qede_dev *qdev = QEDE_INIT_QDEV(eth_dev); - struct ecore_dev *edev = QEDE_INIT_EDEV(qdev); - struct rte_eth_fdir_input *input; - - static const uint8_t next_proto[] = { - [RTE_ETH_FLOW_NONFRAG_IPV4_TCP] = IPPROTO_TCP, - [RTE_ETH_FLOW_NONFRAG_IPV4_UDP] = IPPROTO_UDP, - [RTE_ETH_FLOW_NONFRAG_IPV6_TCP] = IPPROTO_TCP, - [RTE_ETH_FLOW_NONFRAG_IPV6_UDP] = IPPROTO_UDP, - }; - - input = &fdir->input; - - DP_INFO(edev, "flow_type %d\n", input->flow_type); - - switch (input->flow_type) { - case RTE_ETH_FLOW_NONFRAG_IPV4_TCP: - case RTE_ETH_FLOW_NONFRAG_IPV4_UDP: - /* fill the common ip header */ - arfs->tuple.eth_proto = RTE_ETHER_TYPE_IPV4; - arfs->tuple.dst_ipv4 = input->flow.ip4_flow.dst_ip; - arfs->tuple.src_ipv4 = input->flow.ip4_flow.src_ip; - arfs->tuple.ip_proto = next_proto[input->flow_type]; - - /* UDP */ - if (input->flow_type == RTE_ETH_FLOW_NONFRAG_IPV4_UDP) { - arfs->tuple.dst_port = input->flow.udp4_flow.dst_port; - arfs->tuple.src_port = input->flow.udp4_flow.src_port; - } else { /* TCP */ - arfs->tuple.dst_port = input->flow.tcp4_flow.dst_port; - arfs->tuple.src_port = input->flow.tcp4_flow.src_port; - } - break; - case RTE_ETH_FLOW_NONFRAG_IPV6_TCP: - case RTE_ETH_FLOW_NONFRAG_IPV6_UDP: - arfs->tuple.eth_proto = RTE_ETHER_TYPE_IPV6; - arfs->tuple.ip_proto = next_proto[input->flow_type]; - rte_memcpy(arfs->tuple.dst_ipv6, - &input->flow.ipv6_flow.dst_ip, - IPV6_ADDR_LEN); - rte_memcpy(arfs->tuple.src_ipv6, - &input->flow.ipv6_flow.src_ip, - IPV6_ADDR_LEN); - - /* UDP */ - if (input->flow_type == RTE_ETH_FLOW_NONFRAG_IPV6_UDP) { - arfs->tuple.dst_port = input->flow.udp6_flow.dst_port; - arfs->tuple.src_port = input->flow.udp6_flow.src_port; - } else { /* TCP */ - arfs->tuple.dst_port = input->flow.tcp6_flow.dst_port; - arfs->tuple.src_port = input->flow.tcp6_flow.src_port; - } - break; - default: - DP_ERR(edev, "Unsupported flow_type %u\n", - input->flow_type); - return -ENOTSUP; - } - - arfs->rx_queue = fdir->action.rx_queue; - return 0; -} - static int qede_config_arfs_filter(struct rte_eth_dev *eth_dev, struct qede_arfs_entry *arfs, @@ -397,61 +321,6 @@ qede_config_arfs_filter(struct rte_eth_dev *eth_dev, return rc; } -static int -qede_config_cmn_fdir_filter(struct rte_eth_dev *eth_dev, - struct rte_eth_fdir_filter *fdir_filter, - bool add) -{ - struct qede_dev *qdev = QEDE_INIT_QDEV(eth_dev); - struct ecore_dev *edev = QEDE_INIT_EDEV(qdev); - struct qede_arfs_entry *arfs = NULL; - int rc = 0; - - arfs = rte_malloc(NULL, sizeof(struct qede_arfs_entry), - RTE_CACHE_LINE_SIZE); - if (!arfs) { - DP_ERR(edev, "Did not allocate memory for arfs\n"); - return -ENOMEM; - } - - rc = qede_fdir_to_arfs_filter(eth_dev, fdir_filter, arfs); - if (rc < 0) - return rc; - - rc = qede_config_arfs_filter(eth_dev, arfs, add); - if (rc < 0) - rte_free(arfs); - - return rc; -} - -static int -qede_fdir_filter_add(struct rte_eth_dev *eth_dev, - struct rte_eth_fdir_filter *fdir, - bool add) -{ - struct qede_dev *qdev = QEDE_INIT_QDEV(eth_dev); - struct ecore_dev *edev = QEDE_INIT_EDEV(qdev); - - if (!qede_valid_flow(fdir->input.flow_type)) { - DP_ERR(edev, "invalid flow_type input\n"); - return -EINVAL; - } - - if (fdir->action.rx_queue >= QEDE_RSS_COUNT(eth_dev)) { - DP_ERR(edev, "invalid queue number %u\n", - fdir->action.rx_queue); - return -EINVAL; - } - - if (fdir->input.flow_ext.is_vf) { - DP_ERR(edev, "flowdir is not supported over VF\n"); - return -EINVAL; - } - - return qede_config_cmn_fdir_filter(eth_dev, fdir, add); -} - /* Fills the L3/L4 headers and returns the actual length of flowdir packet */ static uint16_t qede_arfs_construct_pkt(struct rte_eth_dev *eth_dev, @@ -552,44 +421,6 @@ qede_arfs_construct_pkt(struct rte_eth_dev *eth_dev, return len; } -static int -qede_fdir_filter_conf(struct rte_eth_dev *eth_dev, - enum rte_filter_op filter_op, - void *arg) -{ - struct qede_dev *qdev = QEDE_INIT_QDEV(eth_dev); - struct ecore_dev *edev = QEDE_INIT_EDEV(qdev); - struct rte_eth_fdir_filter *fdir; - int ret; - - fdir = (struct rte_eth_fdir_filter *)arg; - switch (filter_op) { - case RTE_ETH_FILTER_NOP: - /* Typically used to query flowdir support */ - if (ECORE_IS_CMT(edev)) { - DP_ERR(edev, "flowdir is not supported in 100G mode\n"); - return -ENOTSUP; - } - return 0; /* means supported */ - case RTE_ETH_FILTER_ADD: - ret = qede_fdir_filter_add(eth_dev, fdir, 1); - break; - case RTE_ETH_FILTER_DELETE: - ret = qede_fdir_filter_add(eth_dev, fdir, 0); - break; - case RTE_ETH_FILTER_FLUSH: - case RTE_ETH_FILTER_UPDATE: - case RTE_ETH_FILTER_INFO: - return -ENOTSUP; - break; - default: - DP_ERR(edev, "unknown operation %u", filter_op); - ret = -EINVAL; - } - - return ret; -} - static int qede_tunnel_update(struct qede_dev *qdev, struct ecore_tunnel_info *tunn_info) @@ -1228,8 +1059,6 @@ int qede_dev_filter_ctrl(struct rte_eth_dev *eth_dev, struct ecore_dev *edev = QEDE_INIT_EDEV(qdev); switch (filter_type) { - case RTE_ETH_FILTER_FDIR: - return qede_fdir_filter_conf(eth_dev, filter_op, arg); case RTE_ETH_FILTER_GENERIC: if (ECORE_IS_CMT(edev)) { DP_ERR(edev, "flowdir is not supported in 100G mode\n"); diff --git a/drivers/net/sfc/sfc_ethdev.c b/drivers/net/sfc/sfc_ethdev.c index 1437af15e0..26988579a5 100644 --- a/drivers/net/sfc/sfc_ethdev.c +++ b/drivers/net/sfc/sfc_ethdev.c @@ -1745,9 +1745,6 @@ sfc_dev_filter_ctrl(struct rte_eth_dev *dev, enum rte_filter_type filter_type, sfc_log_init(sa, "entry"); switch (filter_type) { - case RTE_ETH_FILTER_FDIR: - sfc_err(sa, "Flow Director filters not supported"); - break; case RTE_ETH_FILTER_GENERIC: if (filter_op != RTE_ETH_FILTER_GET) { rc = EINVAL; diff --git a/lib/librte_ethdev/rte_eth_ctrl.h b/lib/librte_ethdev/rte_eth_ctrl.h index 4c9bd9b0fa..6911ff7f77 100644 --- a/lib/librte_ethdev/rte_eth_ctrl.h +++ b/lib/librte_ethdev/rte_eth_ctrl.h @@ -443,9 +443,7 @@ struct rte_eth_fdir_action { }; /** - * A structure used to define the flow director filter entry by filter_ctrl API - * It supports RTE_ETH_FILTER_FDIR with RTE_ETH_FILTER_ADD and - * RTE_ETH_FILTER_DELETE operations. + * A structure used to define the flow director filter entry by filter_ctrl API. */ struct rte_eth_fdir_filter { uint32_t soft_id; @@ -593,29 +591,6 @@ struct rte_eth_fdir_stats { uint32_t best_cnt; /**< Number of filters in best effort spaces. */ }; -/** - * Flow Director filter information types. - */ -enum rte_eth_fdir_filter_info_type { - RTE_ETH_FDIR_FILTER_INFO_TYPE_UNKNOWN = 0, - /** Flow Director filter input set configuration */ - RTE_ETH_FDIR_FILTER_INPUT_SET_SELECT, - RTE_ETH_FDIR_FILTER_INFO_TYPE_MAX, -}; - -/** - * A structure used to set FDIR filter information, to support filter type - * of 'RTE_ETH_FILTER_FDIR' RTE_ETH_FDIR_FILTER_INPUT_SET_SELECT operation. - */ -struct rte_eth_fdir_filter_info { - enum rte_eth_fdir_filter_info_type info_type; /**< Information type */ - /** Details of fdir filter information */ - union { - /** Flow Director input set configuration per port */ - struct rte_eth_input_set_conf input_set_conf; - } info; -}; - /** * l2 tunnel configuration. */ From patchwork Sun Oct 18 14:09:10 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Rybchenko X-Patchwork-Id: 81269 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id C518DA04B0; Sun, 18 Oct 2020 16:14:12 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 76602E27C; Sun, 18 Oct 2020 16:09:48 +0200 (CEST) Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [67.231.154.164]) by dpdk.org (Postfix) with ESMTP id BF754C8B2 for ; Sun, 18 Oct 2020 16:09:30 +0200 (CEST) Received: from mx1-us1.ppe-hosted.com (unknown [10.110.50.144]) by dispatch1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 68A8C2009B; Sun, 18 Oct 2020 14:09:29 +0000 (UTC) Received: from us4-mdac16-15.at1.mdlocal (unknown [10.110.49.197]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 67959800A9; Sun, 18 Oct 2020 14:09:29 +0000 (UTC) X-Virus-Scanned: Proofpoint Essentials engine Received: from mx1-us1.ppe-hosted.com (unknown [10.110.50.12]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 015E740070; Sun, 18 Oct 2020 14:09:29 +0000 (UTC) Received: from webmail.solarflare.com (uk.solarflare.com [193.34.186.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id BE2574005B; Sun, 18 Oct 2020 14:09:28 +0000 (UTC) Received: from ukex01.SolarFlarecom.com (10.17.10.4) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Sun, 18 Oct 2020 15:09:23 +0100 Received: from opal.uk.solarflarecom.com (10.17.10.1) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Sun, 18 Oct 2020 15:09:23 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (ukv-loginhost.uk.solarflarecom.com [10.17.10.39]) by opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id 09IE9NRW002067; Sun, 18 Oct 2020 15:09:23 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1]) by ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id AD9AE1613A9; Sun, 18 Oct 2020 15:09:23 +0100 (BST) From: Andrew Rybchenko To: Wenzhuo Lu , Beilei Xing , Bernard Iremonger CC: Date: Sun, 18 Oct 2020 15:09:10 +0100 Message-ID: <1603030152-13451-14-git-send-email-arybchenko@solarflare.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1603030152-13451-1-git-send-email-arybchenko@solarflare.com> References: <1603030152-13451-1-git-send-email-arybchenko@solarflare.com> MIME-Version: 1.0 X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.6.1012-25732.003 X-TM-AS-Result: No-9.195500-8.000000-10 X-TMASE-MatchedRID: 2FY0xL9szyFW3uCK//k4ajVUc/h8Ki+CS1zwNuiBtITfUZT83lbkEIai cYvSM3sy4jSEPApuIJz78dnxIA7Z1yB5fvlrSjb1ntN+u6tbkNS6cV0bV9Vi8znZfxjBVQRbDYo fQuAXb7gp36ITLH8EKBK/h+VrAVy3QuKBkEdEA0xIcJTn2HkqsSH8kDR0dp2mnp9KgXcu34xvAl nua0Nm7YI4kQxluwXMduvJHyi1ZpH+PzzbebkcBEaMPBFKXyAU3YSaHlnZL82Rjx4hNpIk+HFC0 fMeQA5wv4pvasvMugDdghnhCkMrEJcFdomgH0lnFEUknJ/kEl7dB/CxWTRRu25FeHtsUoHuxPpX onmP5aib3HDJVFcDxuE001dFHx2S4rkOv1OWl4QfwV6sBPR0lg== X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10--9.195500-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.6.1012-25732.003 X-MDID: 1603030169-eqcNgWVUE1eX X-PPE-DISP: 1603030169;eqcNgWVUE1eX Subject: [dpdk-dev] [PATCH 13/14] app/testpmd: remove flow_director_flex_mask command X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" The command uses FDIR filter information get API which is not supported any more. Signed-off-by: Andrew Rybchenko --- app/test-pmd/cmdline.c | 124 ----------------------------------------- 1 file changed, 124 deletions(-) diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c index 9ce6c09567..d52db2f4b2 100644 --- a/app/test-pmd/cmdline.c +++ b/app/test-pmd/cmdline.c @@ -981,12 +981,6 @@ static void cmd_help_long_parsed(void *parsed_result, " tunnel-id (tunnel_id_value)\n" " Set flow director Tunnel mask.\n\n" - "flow_director_flex_mask (port_id)" - " flow (none|ipv4-other|ipv4-frag|ipv4-tcp|ipv4-udp|ipv4-sctp|" - "ipv6-other|ipv6-frag|ipv6-tcp|ipv6-udp|ipv6-sctp|l2_payload|all)" - " (mask)\n" - " Configure mask of flex payload.\n\n" - "flow_director_flex_payload (port_id)" " (raw|l2|l3|l4) (config)\n" " Configure flex payload selection.\n\n" @@ -10551,123 +10545,6 @@ cmdline_parse_inst_t cmd_set_flow_director_tunnel_mask = { }, }; -/* *** deal with flow director mask on flexible payload *** */ -struct cmd_flow_director_flex_mask_result { - cmdline_fixed_string_t flow_director_flexmask; - portid_t port_id; - cmdline_fixed_string_t flow; - cmdline_fixed_string_t flow_type; - cmdline_fixed_string_t mask; -}; - -static void -cmd_flow_director_flex_mask_parsed(void *parsed_result, - __rte_unused struct cmdline *cl, - __rte_unused void *data) -{ - struct cmd_flow_director_flex_mask_result *res = parsed_result; - struct rte_eth_fdir_info fdir_info; - struct rte_eth_fdir_flex_mask flex_mask; - struct rte_port *port; - uint64_t flow_type_mask; - uint16_t i; - int ret; - - port = &ports[res->port_id]; - /** Check if the port is not started **/ - if (port->port_status != RTE_PORT_STOPPED) { - printf("Please stop port %d first\n", res->port_id); - return; - } - - memset(&flex_mask, 0, sizeof(struct rte_eth_fdir_flex_mask)); - ret = parse_flexbytes(res->mask, - flex_mask.mask, - RTE_ETH_FDIR_MAX_FLEXLEN); - if (ret < 0) { - printf("error: Cannot parse mask input.\n"); - return; - } - - memset(&fdir_info, 0, sizeof(fdir_info)); - ret = rte_eth_dev_filter_ctrl(res->port_id, RTE_ETH_FILTER_FDIR, - RTE_ETH_FILTER_INFO, &fdir_info); - if (ret < 0) { - printf("Cannot get FDir filter info\n"); - return; - } - - if (!strcmp(res->flow_type, "none")) { - /* means don't specify the flow type */ - flex_mask.flow_type = RTE_ETH_FLOW_UNKNOWN; - for (i = 0; i < RTE_ETH_FLOW_MAX; i++) - memset(&port->dev_conf.fdir_conf.flex_conf.flex_mask[i], - 0, sizeof(struct rte_eth_fdir_flex_mask)); - port->dev_conf.fdir_conf.flex_conf.nb_flexmasks = 1; - rte_memcpy(&port->dev_conf.fdir_conf.flex_conf.flex_mask[0], - &flex_mask, - sizeof(struct rte_eth_fdir_flex_mask)); - cmd_reconfig_device_queue(res->port_id, 1, 1); - return; - } - flow_type_mask = fdir_info.flow_types_mask[0]; - if (!strcmp(res->flow_type, "all")) { - if (!flow_type_mask) { - printf("No flow type supported\n"); - return; - } - for (i = RTE_ETH_FLOW_UNKNOWN; i < RTE_ETH_FLOW_MAX; i++) { - if (flow_type_mask & (1ULL << i)) { - flex_mask.flow_type = i; - fdir_set_flex_mask(res->port_id, &flex_mask); - } - } - cmd_reconfig_device_queue(res->port_id, 1, 1); - return; - } - flex_mask.flow_type = str2flowtype(res->flow_type); - if (!(flow_type_mask & (1ULL << flex_mask.flow_type))) { - printf("Flow type %s not supported on port %d\n", - res->flow_type, res->port_id); - return; - } - fdir_set_flex_mask(res->port_id, &flex_mask); - cmd_reconfig_device_queue(res->port_id, 1, 1); -} - -cmdline_parse_token_string_t cmd_flow_director_flexmask = - TOKEN_STRING_INITIALIZER(struct cmd_flow_director_flex_mask_result, - flow_director_flexmask, - "flow_director_flex_mask"); -cmdline_parse_token_num_t cmd_flow_director_flexmask_port_id = - TOKEN_NUM_INITIALIZER(struct cmd_flow_director_flex_mask_result, - port_id, UINT16); -cmdline_parse_token_string_t cmd_flow_director_flexmask_flow = - TOKEN_STRING_INITIALIZER(struct cmd_flow_director_flex_mask_result, - flow, "flow"); -cmdline_parse_token_string_t cmd_flow_director_flexmask_flow_type = - TOKEN_STRING_INITIALIZER(struct cmd_flow_director_flex_mask_result, - flow_type, "none#ipv4-other#ipv4-frag#ipv4-tcp#ipv4-udp#ipv4-sctp#" - "ipv6-other#ipv6-frag#ipv6-tcp#ipv6-udp#ipv6-sctp#l2_payload#all"); -cmdline_parse_token_string_t cmd_flow_director_flexmask_mask = - TOKEN_STRING_INITIALIZER(struct cmd_flow_director_flex_mask_result, - mask, NULL); - -cmdline_parse_inst_t cmd_set_flow_director_flex_mask = { - .f = cmd_flow_director_flex_mask_parsed, - .data = NULL, - .help_str = "flow_director_flex_mask ... : " - "Set flow director's flex mask on NIC", - .tokens = { - (void *)&cmd_flow_director_flexmask, - (void *)&cmd_flow_director_flexmask_port_id, - (void *)&cmd_flow_director_flexmask_flow, - (void *)&cmd_flow_director_flexmask_flow_type, - (void *)&cmd_flow_director_flexmask_mask, - NULL, - }, -}; - /* *** deal with flow director flexible payload configuration *** */ struct cmd_flow_director_flexpayload_result { cmdline_fixed_string_t flow_director_flexpayload; @@ -17659,7 +17536,6 @@ cmdline_parse_ctx_t main_ctx[] = { (cmdline_parse_inst_t *)&cmd_set_flow_director_ip_mask, (cmdline_parse_inst_t *)&cmd_set_flow_director_mac_vlan_mask, (cmdline_parse_inst_t *)&cmd_set_flow_director_tunnel_mask, - (cmdline_parse_inst_t *)&cmd_set_flow_director_flex_mask, (cmdline_parse_inst_t *)&cmd_set_flow_director_flex_payload, (cmdline_parse_inst_t *)&cmd_flow, (cmdline_parse_inst_t *)&cmd_show_port_meter_cap, From patchwork Sun Oct 18 14:09:11 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Rybchenko X-Patchwork-Id: 81270 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id B0162A04B0; Sun, 18 Oct 2020 16:14:37 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 1548BE285; Sun, 18 Oct 2020 16:09:50 +0200 (CEST) Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [67.231.154.164]) by dpdk.org (Postfix) with ESMTP id 6CC4FD01F for ; Sun, 18 Oct 2020 16:09:33 +0200 (CEST) Received: from mx1-us1.ppe-hosted.com (unknown [10.110.50.143]) by dispatch1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 1582020076; Sun, 18 Oct 2020 14:09:32 +0000 (UTC) Received: from us4-mdac16-63.at1.mdlocal (unknown [10.110.50.156]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 13BAA8009B; Sun, 18 Oct 2020 14:09:32 +0000 (UTC) X-Virus-Scanned: Proofpoint Essentials engine Received: from mx1-us1.ppe-hosted.com (unknown [10.110.49.105]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 9AB9C40061; Sun, 18 Oct 2020 14:09:31 +0000 (UTC) Received: from webmail.solarflare.com (uk.solarflare.com [193.34.186.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 5B5409C007A; Sun, 18 Oct 2020 14:09:31 +0000 (UTC) Received: from ukex01.SolarFlarecom.com (10.17.10.4) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Sun, 18 Oct 2020 15:09:24 +0100 Received: from opal.uk.solarflarecom.com (10.17.10.1) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Sun, 18 Oct 2020 15:09:24 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (ukv-loginhost.uk.solarflarecom.com [10.17.10.39]) by opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id 09IE9ORb002071; Sun, 18 Oct 2020 15:09:24 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1]) by ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id 2EAF41613A9; Sun, 18 Oct 2020 15:09:24 +0100 (BST) From: Andrew Rybchenko To: Ray Kinsella , Neil Horman , "Hemant Agrawal" , Sachin Saxena , Thomas Monjalon , Ferruh Yigit , Andrew Rybchenko CC: , Xiaoyun Li Date: Sun, 18 Oct 2020 15:09:11 +0100 Message-ID: <1603030152-13451-15-git-send-email-arybchenko@solarflare.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1603030152-13451-1-git-send-email-arybchenko@solarflare.com> References: <1603030152-13451-1-git-send-email-arybchenko@solarflare.com> MIME-Version: 1.0 X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.6.1012-25732.003 X-TM-AS-Result: No-9.300700-8.000000-10 X-TMASE-MatchedRID: aH100iTQ3OzeG4FwcWqAS8PRlYRmv+e2nKpQna4coUBjLp8Cm8vwF+90 4w74pUEJMdqMWOXDAJRA+I8ifrgnnSHhSBQfglfsA9lly13c/gEvwhrmqJxTu8D7Ns1/Zk7L8ne FHFEaJwr6EkU0l1Crc7n63Fi/MOGkHzoyklNKQhEdxBAG5/hkWzk4wzLIKf/BDfheddyhsquYx8 Fo24xcvH+/zuQ3QEzXL90Vo0chuk5yOVk+FPzL15Xi1z8zt1TRSWg+u4ir2NNVZCccrGnfyOFo/ YmgpQJJ2z651pu/qKCxuGjnUoGUr9brDrhTWGHOSHCU59h5KrEisyg/lfGoZ2e1vz0qwDbOi1Rb ZN1JuSg3CEbVHwWiYglqc6igYwN884wlaZlBms6cnm0v4tsY43l2c9WreWzscBqXYDUNCaztfrH 67fQFiNfLKPidT98O5m7tGik47+/dszRFwcTb55U7Bltw5qVLe8SChIGavwFZ+YxyNxdzRy5TcS oF9VwS37bT+Po/1I+kTlzEXpREXozQp7mciZRIngIgpj8eDcAZ1CdBJOsoY8RB0bsfrpPIfiAqr jYtFiSRKqxji/498f7nB6FK+iQzuoJs/QFZpiauxQn0uygbNn7cGd19dSFd X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10--9.300700-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.6.1012-25732.003 X-MDID: 1603030172-L87fY8xFhT6T X-PPE-DISP: 1603030172;L87fY8xFhT6T Subject: [dpdk-dev] [PATCH 14/14] ethdev: remove legacy filter API functions X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" The legacy filter API, including rte_eth_dev_filter_supported() and rte_eth_dev_filter_ctrl() is removed. Flow API should be used. examples/tep_termination build is broken. Signed-off-by: Andrew Rybchenko --- doc/guides/rel_notes/deprecation.rst | 6 ---- doc/guides/rel_notes/release_20_11.rst | 3 ++ drivers/net/dpaa2/dpaa2_ethdev.c | 4 --- lib/librte_ethdev/rte_eth_ctrl.h | 12 +------ lib/librte_ethdev/rte_ethdev.c | 28 ---------------- lib/librte_ethdev/rte_ethdev.h | 41 ------------------------ lib/librte_ethdev/rte_ethdev_version.map | 2 -- 7 files changed, 4 insertions(+), 92 deletions(-) diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst index 18a748bc88..42eafb97af 100644 --- a/doc/guides/rel_notes/deprecation.rst +++ b/doc/guides/rel_notes/deprecation.rst @@ -106,12 +106,6 @@ Deprecation Notices while evaluating performance gains of a better use of the first cache line. -* ethdev: the legacy filter API, including - ``rte_eth_dev_filter_supported()``, ``rte_eth_dev_filter_ctrl()`` - is superseded by the generic flow API (rte_flow) in - PMDs that implement the latter. - The legacy API will be removed in DPDK 20.11. - * ethdev: The flow director API, including ``rte_eth_conf.fdir_conf`` field, and the related structures (``rte_fdir_*`` and ``rte_eth_fdir_*``), will be removed in DPDK 20.11. diff --git a/doc/guides/rel_notes/release_20_11.rst b/doc/guides/rel_notes/release_20_11.rst index 8dd1439935..ae88858de3 100644 --- a/doc/guides/rel_notes/release_20_11.rst +++ b/doc/guides/rel_notes/release_20_11.rst @@ -452,6 +452,9 @@ API Changes * ethdev: Added fields rx_seg and rx_nseg to rte_eth_rxconf structure to provide extended description of the receiving buffer. +* ethdev: Removed the legacy filter API, including + ``rte_eth_dev_filter_supported()`` and ``rte_eth_dev_filter_ctrl()``. + * vhost: Moved vDPA APIs from experimental to stable. * vhost: Add a new function ``rte_vhost_crypto_driver_start`` to be called diff --git a/drivers/net/dpaa2/dpaa2_ethdev.c b/drivers/net/dpaa2/dpaa2_ethdev.c index 04e60c56f2..44262c4b1f 100644 --- a/drivers/net/dpaa2/dpaa2_ethdev.c +++ b/drivers/net/dpaa2/dpaa2_ethdev.c @@ -91,10 +91,6 @@ static const struct rte_dpaa2_xstats_name_off dpaa2_xstats_strings[] = { }; static const enum rte_filter_op dpaa2_supported_filter_ops[] = { - RTE_ETH_FILTER_ADD, - RTE_ETH_FILTER_DELETE, - RTE_ETH_FILTER_UPDATE, - RTE_ETH_FILTER_FLUSH, RTE_ETH_FILTER_GET }; diff --git a/lib/librte_ethdev/rte_eth_ctrl.h b/lib/librte_ethdev/rte_eth_ctrl.h index 6911ff7f77..1faee434e7 100644 --- a/lib/librte_ethdev/rte_eth_ctrl.h +++ b/lib/librte_ethdev/rte_eth_ctrl.h @@ -43,17 +43,7 @@ enum rte_filter_type { * Generic operations on filters */ enum rte_filter_op { - /** used to check whether the type filter is supported */ - RTE_ETH_FILTER_NOP = 0, - RTE_ETH_FILTER_ADD, /**< add filter entry */ - RTE_ETH_FILTER_UPDATE, /**< update filter entry */ - RTE_ETH_FILTER_DELETE, /**< delete filter entry */ - RTE_ETH_FILTER_FLUSH, /**< flush all entries */ - RTE_ETH_FILTER_GET, /**< get filter entry */ - RTE_ETH_FILTER_SET, /**< configurations */ - RTE_ETH_FILTER_INFO, /**< retrieve information */ - RTE_ETH_FILTER_STATS, /**< retrieve statistics */ - RTE_ETH_FILTER_OP_MAX + RTE_ETH_FILTER_GET, /**< get flow API ops */ }; /** diff --git a/lib/librte_ethdev/rte_ethdev.c b/lib/librte_ethdev/rte_ethdev.c index b12bb3854d..aa030fd4fc 100644 --- a/lib/librte_ethdev/rte_ethdev.c +++ b/lib/librte_ethdev/rte_ethdev.c @@ -4758,34 +4758,6 @@ rte_eth_dev_rx_intr_disable(uint16_t port_id, } -int -rte_eth_dev_filter_supported(uint16_t port_id, - enum rte_filter_type filter_type) -{ - struct rte_eth_dev *dev; - - RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV); - - dev = &rte_eth_devices[port_id]; - RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->filter_ctrl, -ENOTSUP); - return (*dev->dev_ops->filter_ctrl)(dev, filter_type, - RTE_ETH_FILTER_NOP, NULL); -} - -int -rte_eth_dev_filter_ctrl(uint16_t port_id, enum rte_filter_type filter_type, - enum rte_filter_op filter_op, void *arg) -{ - struct rte_eth_dev *dev; - - RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV); - - dev = &rte_eth_devices[port_id]; - RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->filter_ctrl, -ENOTSUP); - return eth_err(port_id, (*dev->dev_ops->filter_ctrl)(dev, filter_type, - filter_op, arg)); -} - const struct rte_eth_rxtx_callback * rte_eth_add_rx_callback(uint16_t port_id, uint16_t queue_id, rte_rx_callback_fn fn, void *user_param) diff --git a/lib/librte_ethdev/rte_ethdev.h b/lib/librte_ethdev/rte_ethdev.h index e341a08817..c51faa9c5b 100644 --- a/lib/librte_ethdev/rte_ethdev.h +++ b/lib/librte_ethdev/rte_ethdev.h @@ -4057,47 +4057,6 @@ int rte_eth_dev_udp_tunnel_port_delete(uint16_t port_id, struct rte_eth_udp_tunnel *tunnel_udp); -/** - * Check whether the filter type is supported on an Ethernet device. - * All the supported filter types are defined in 'rte_eth_ctrl.h'. - * - * @param port_id - * The port identifier of the Ethernet device. - * @param filter_type - * Filter type. - * @return - * - (0) if successful. - * - (-ENOTSUP) if hardware doesn't support this filter type. - * - (-ENODEV) if *port_id* invalid. - * - (-EIO) if device is removed. - */ -__rte_deprecated -int rte_eth_dev_filter_supported(uint16_t port_id, - enum rte_filter_type filter_type); - -/** - * Take operations to assigned filter type on an Ethernet device. - * All the supported operations and filter types are defined in 'rte_eth_ctrl.h'. - * - * @param port_id - * The port identifier of the Ethernet device. - * @param filter_type - * Filter type. - * @param filter_op - * Type of operation. - * @param arg - * A pointer to arguments defined specifically for the operation. - * @return - * - (0) if successful. - * - (-ENOTSUP) if hardware doesn't support. - * - (-ENODEV) if *port_id* invalid. - * - (-EIO) if device is removed. - * - others depends on the specific operations implementation. - */ -__rte_deprecated -int rte_eth_dev_filter_ctrl(uint16_t port_id, enum rte_filter_type filter_type, - enum rte_filter_op filter_op, void *arg); - /** * Get DCB information on an Ethernet device. * diff --git a/lib/librte_ethdev/rte_ethdev_version.map b/lib/librte_ethdev/rte_ethdev_version.map index 8ddda2547f..fe628736c0 100644 --- a/lib/librte_ethdev/rte_ethdev_version.map +++ b/lib/librte_ethdev/rte_ethdev_version.map @@ -15,8 +15,6 @@ DPDK_21 { rte_eth_dev_count_avail; rte_eth_dev_count_total; rte_eth_dev_default_mac_addr_set; - rte_eth_dev_filter_ctrl; - rte_eth_dev_filter_supported; rte_eth_dev_flow_ctrl_get; rte_eth_dev_flow_ctrl_set; rte_eth_dev_fw_version_get;