From patchwork Wed Mar 8 07:54:05 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Zhao1, Wei" X-Patchwork-Id: 21597 Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [IPv6:::1]) by dpdk.org (Postfix) with ESMTP id 283715597; Wed, 8 Mar 2017 09:03:27 +0100 (CET) Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by dpdk.org (Postfix) with ESMTP id 9998B379B for ; Wed, 8 Mar 2017 09:03:04 +0100 (CET) Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by fmsmga101.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 08 Mar 2017 00:01:08 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos; i="5.36,262,1486454400"; d="scan'208"; a="1139406687" Received: from dpdk1.bj.intel.com ([172.16.182.84]) by fmsmga002.fm.intel.com with ESMTP; 08 Mar 2017 00:01:06 -0800 From: Wei Zhao To: dev@dpdk.org Cc: ferruh.yigit@intel.com Date: Wed, 8 Mar 2017 15:54:05 +0800 Message-Id: <1488959645-23273-2-git-send-email-wei.zhao1@intel.com> X-Mailer: git-send-email 2.5.5 In-Reply-To: <1488959645-23273-1-git-send-email-wei.zhao1@intel.com> References: <1488959645-23273-1-git-send-email-wei.zhao1@intel.com> Subject: [dpdk-dev] [PATCH v2 2/2] net/ixgbe: add mac type check for all filters 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" All kinds of filter need to hardware mac type check to make sure the hardware support that type of fliter. If not, it may cause serious issue. Fixes: 11777435c727 ("net/ixgbe: parse flow director filter") Fixes: 672be56d76a2 ("net/ixgbe: parse n-tuple filter") Fixes: eb3539fc8550 ("net/ixgbe: parse ethertype filter") Fixes: 429f6ebb42cc ("net/ixgbe: parse TCP SYN filter") v2: delete useless function declaration --- drivers/net/ixgbe/ixgbe_flow.c | 76 ++++++++++++++++++++++-------------------- 1 file changed, 40 insertions(+), 36 deletions(-) diff --git a/drivers/net/ixgbe/ixgbe_flow.c b/drivers/net/ixgbe/ixgbe_flow.c index 48a06a6..e2ba9c2 100644 --- a/drivers/net/ixgbe/ixgbe_flow.c +++ b/drivers/net/ixgbe/ixgbe_flow.c @@ -420,13 +420,17 @@ cons_parse_ntuple_filter(const struct rte_flow_attr *attr, /* a specific function for ixgbe because the flags is specific */ static int -ixgbe_parse_ntuple_filter(const struct rte_flow_attr *attr, +ixgbe_parse_ntuple_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_ntuple_filter *filter, struct rte_flow_error *error) { int ret; + struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private); + + MAC_TYPE_FILTER_SUP_EXT(hw->mac.type); ret = cons_parse_ntuple_filter(attr, pattern, actions, filter, error); @@ -668,13 +672,17 @@ cons_parse_ethertype_filter(const struct rte_flow_attr *attr, } static int -ixgbe_parse_ethertype_filter(const struct rte_flow_attr *attr, +ixgbe_parse_ethertype_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_ethertype_filter *filter, struct rte_flow_error *error) { int ret; + struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private); + + MAC_TYPE_FILTER_SUP(hw->mac.type); ret = cons_parse_ethertype_filter(attr, pattern, actions, filter, error); @@ -963,13 +971,17 @@ cons_parse_syn_filter(const struct rte_flow_attr *attr, } static int -ixgbe_parse_syn_filter(const struct rte_flow_attr *attr, +ixgbe_parse_syn_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_syn_filter *filter, struct rte_flow_error *error) { int ret; + struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private); + + MAC_TYPE_FILTER_SUP(hw->mac.type); ret = cons_parse_syn_filter(attr, pattern, actions, filter, error); @@ -1152,7 +1164,7 @@ cons_parse_l2_tn_filter(const struct rte_flow_attr *attr, } static int -ixgbe_validate_l2_tn_filter(struct rte_eth_dev *dev, +ixgbe_parse_l2_tn_filter(struct rte_eth_dev *dev, const struct rte_flow_attr *attr, const struct rte_flow_item pattern[], const struct rte_flow_action actions[], @@ -2306,46 +2318,37 @@ ixgbe_parse_fdir_filter_tunnel(const struct rte_flow_attr *attr, } static int -ixgbe_parse_fdir_filter(const struct rte_flow_attr *attr, +ixgbe_parse_fdir_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 ixgbe_fdir_rule *rule, struct rte_flow_error *error) { int ret; + struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private); + enum rte_fdir_mode fdir_mode = dev->data->dev_conf.fdir_conf.mode; + + 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; ret = ixgbe_parse_fdir_filter_normal(attr, pattern, actions, rule, error); if (!ret) - return 0; + goto step_next; ret = ixgbe_parse_fdir_filter_tunnel(attr, pattern, actions, rule, error); - return ret; -} - -static int -ixgbe_validate_fdir_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 ixgbe_fdir_rule *rule, - struct rte_flow_error *error) -{ - int ret = 0; - - enum rte_fdir_mode fdir_mode = dev->data->dev_conf.fdir_conf.mode; - - ixgbe_parse_fdir_filter(attr, pattern, actions, - rule, error); - - +step_next: if (fdir_mode == RTE_FDIR_MODE_NONE || fdir_mode != rule->mode) return -ENOTSUP; - return ret; } @@ -2449,7 +2452,7 @@ ixgbe_flow_create(struct rte_eth_dev *dev, ixgbe_flow_mem_ptr, entries); memset(&ntuple_filter, 0, sizeof(struct rte_eth_ntuple_filter)); - ret = ixgbe_parse_ntuple_filter(attr, pattern, + ret = ixgbe_parse_ntuple_filter(dev, attr, pattern, actions, &ntuple_filter, error); if (!ret) { ret = ixgbe_add_del_ntuple_filter(dev, &ntuple_filter, TRUE); @@ -2469,7 +2472,7 @@ ixgbe_flow_create(struct rte_eth_dev *dev, } memset(ðertype_filter, 0, sizeof(struct rte_eth_ethertype_filter)); - ret = ixgbe_parse_ethertype_filter(attr, pattern, + ret = ixgbe_parse_ethertype_filter(dev, attr, pattern, actions, ðertype_filter, error); if (!ret) { ret = ixgbe_add_del_ethertype_filter(dev, @@ -2491,7 +2494,8 @@ ixgbe_flow_create(struct rte_eth_dev *dev, } memset(&syn_filter, 0, sizeof(struct rte_eth_syn_filter)); - ret = cons_parse_syn_filter(attr, pattern, actions, &syn_filter, error); + ret = ixgbe_parse_syn_filter(dev, attr, pattern, + actions, &syn_filter, error); if (!ret) { ret = ixgbe_syn_filter_set(dev, &syn_filter, TRUE); if (!ret) { @@ -2511,7 +2515,7 @@ ixgbe_flow_create(struct rte_eth_dev *dev, } memset(&fdir_rule, 0, sizeof(struct ixgbe_fdir_rule)); - ret = ixgbe_parse_fdir_filter(attr, pattern, + ret = ixgbe_parse_fdir_filter(dev, attr, pattern, actions, &fdir_rule, error); if (!ret) { /* A mask cannot be deleted. */ @@ -2564,7 +2568,7 @@ ixgbe_flow_create(struct rte_eth_dev *dev, } memset(&l2_tn_filter, 0, sizeof(struct rte_eth_l2_tunnel_conf)); - ret = cons_parse_l2_tn_filter(attr, pattern, + ret = ixgbe_parse_l2_tn_filter(dev, attr, pattern, actions, &l2_tn_filter, error); if (!ret) { ret = ixgbe_dev_l2_tunnel_filter_add(dev, &l2_tn_filter, FALSE); @@ -2610,31 +2614,31 @@ ixgbe_flow_validate(__rte_unused struct rte_eth_dev *dev, int ret; memset(&ntuple_filter, 0, sizeof(struct rte_eth_ntuple_filter)); - ret = ixgbe_parse_ntuple_filter(attr, pattern, + ret = ixgbe_parse_ntuple_filter(dev, attr, pattern, actions, &ntuple_filter, error); if (!ret) return 0; memset(ðertype_filter, 0, sizeof(struct rte_eth_ethertype_filter)); - ret = ixgbe_parse_ethertype_filter(attr, pattern, + ret = ixgbe_parse_ethertype_filter(dev, attr, pattern, actions, ðertype_filter, error); if (!ret) return 0; memset(&syn_filter, 0, sizeof(struct rte_eth_syn_filter)); - ret = ixgbe_parse_syn_filter(attr, pattern, + ret = ixgbe_parse_syn_filter(dev, attr, pattern, actions, &syn_filter, error); if (!ret) return 0; memset(&fdir_rule, 0, sizeof(struct ixgbe_fdir_rule)); - ret = ixgbe_validate_fdir_filter(dev, attr, pattern, + ret = ixgbe_parse_fdir_filter(dev, attr, pattern, actions, &fdir_rule, error); if (!ret) return 0; memset(&l2_tn_filter, 0, sizeof(struct rte_eth_l2_tunnel_conf)); - ret = ixgbe_validate_l2_tn_filter(dev, attr, pattern, + ret = ixgbe_parse_l2_tn_filter(dev, attr, pattern, actions, &l2_tn_filter, error); return ret;