From patchwork Mon Feb 13 07:35:19 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Zhao1, Wei" X-Patchwork-Id: 20384 X-Patchwork-Delegate: ferruh.yigit@amd.com 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 2C1176CB4; Mon, 13 Feb 2017 08:41:44 +0100 (CET) Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) by dpdk.org (Postfix) with ESMTP id 0895837A8 for ; Mon, 13 Feb 2017 08:41:18 +0100 (CET) Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by orsmga103.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 12 Feb 2017 23:41:17 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos; i="5.35,155,1484035200"; d="scan'208"; a="1106616755" Received: from dpdk1.bj.intel.com ([172.16.182.84]) by fmsmga001.fm.intel.com with ESMTP; 12 Feb 2017 23:41:16 -0800 From: Wei Zhao To: dev@dpdk.org Cc: Wei Zhao , Wenzhuo Lu Date: Mon, 13 Feb 2017 15:35:19 +0800 Message-Id: <1486971319-59788-1-git-send-email-wei.zhao1@intel.com> X-Mailer: git-send-email 2.5.5 Subject: [dpdk-dev] [PATCH 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") Signed-off-by: Wei Zhao Signed-off-by: Wenzhuo Lu --- drivers/net/ixgbe/ixgbe_flow.c | 129 +++++++++++++++++++++-------------------- 1 file changed, 65 insertions(+), 64 deletions(-) diff --git a/drivers/net/ixgbe/ixgbe_flow.c b/drivers/net/ixgbe/ixgbe_flow.c index 5a634d3..f414fa8 100644 --- a/drivers/net/ixgbe/ixgbe_flow.c +++ b/drivers/net/ixgbe/ixgbe_flow.c @@ -84,11 +84,12 @@ cons_parse_ntuple_filter(const struct rte_flow_attr *attr, struct rte_eth_ntuple_filter *filter, struct rte_flow_error *error); static int -ixgbe_parse_ntuple_filter(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); +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); static int cons_parse_ethertype_filter(const struct rte_flow_attr *attr, const struct rte_flow_item *pattern, @@ -96,11 +97,12 @@ cons_parse_ethertype_filter(const struct rte_flow_attr *attr, struct rte_eth_ethertype_filter *filter, struct rte_flow_error *error); static int -ixgbe_parse_ethertype_filter(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); +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); static int cons_parse_syn_filter(const struct rte_flow_attr *attr, const struct rte_flow_item pattern[], @@ -108,11 +110,12 @@ cons_parse_syn_filter(const struct rte_flow_attr *attr, struct rte_eth_syn_filter *filter, struct rte_flow_error *error); static int -ixgbe_parse_syn_filter(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); +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); static int cons_parse_l2_tn_filter(const struct rte_flow_attr *attr, const struct rte_flow_item pattern[], @@ -120,20 +123,13 @@ cons_parse_l2_tn_filter(const struct rte_flow_attr *attr, struct rte_eth_l2_tunnel_conf *filter, struct rte_flow_error *error); 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[], struct rte_eth_l2_tunnel_conf *rule, struct rte_flow_error *error); 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); -static int ixgbe_parse_fdir_filter_normal(const struct rte_flow_attr *attr, const struct rte_flow_item pattern[], const struct rte_flow_action actions[], @@ -146,11 +142,12 @@ ixgbe_parse_fdir_filter_tunnel(const struct rte_flow_attr *attr, struct ixgbe_fdir_rule *rule, struct rte_flow_error *error); static int -ixgbe_parse_fdir_filter(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); +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); static int ixgbe_flow_validate(__rte_unused struct rte_eth_dev *dev, const struct rte_flow_attr *attr, @@ -518,13 +515,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); @@ -766,13 +767,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); @@ -1061,13 +1066,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); @@ -1250,7 +1259,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[], @@ -2403,46 +2412,37 @@ ixgbe_parse_fdir_filter_tunnel(const struct rte_flow_attr *attr, } static int -ixgbe_validate_fdir_filter(struct rte_eth_dev *dev, +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 = 0; - + 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; - ixgbe_parse_fdir_filter(attr, pattern, actions, - rule, error); - - - if (fdir_mode == RTE_FDIR_MODE_NONE || - fdir_mode != rule->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; - return ret; -} - -static int -ixgbe_parse_fdir_filter(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; - 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); +step_next: + if (fdir_mode == RTE_FDIR_MODE_NONE || + fdir_mode != rule->mode) + return -ENOTSUP; return ret; } @@ -2546,7 +2546,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); @@ -2566,7 +2566,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, @@ -2588,7 +2588,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) { @@ -2608,7 +2609,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. */ @@ -2661,7 +2662,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); @@ -2707,31 +2708,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;