DPDK patches and discussions
 help / color / mirror / Atom feed
From: "Peng, Yuan" <yuan.peng@intel.com>
To: "Zhao1, Wei" <wei.zhao1@intel.com>, "dev@dpdk.org" <dev@dpdk.org>
Cc: "Zhang, Qi Z" <qi.z.zhang@intel.com>,
	"Lu, Nannan" <nannan.lu@intel.com>,
	 "Peng, Yuan" <yuan.peng@intel.com>
Subject: Re: [dpdk-dev] [PATCH 3/3] net/ice/base: force switch to use different recipe for
Date: Fri, 10 Apr 2020 02:40:36 +0000	[thread overview]
Message-ID: <BY5PR11MB38934D436F55F59083CA8918FEDE0@BY5PR11MB3893.namprd11.prod.outlook.com> (raw)
In-Reply-To: <20200410004157.3032-4-wei.zhao1@intel.com>

Test-by Peng, Yuan <yuan.peng@intel.com>

-----Original Message-----
From: Zhao1, Wei <wei.zhao1@intel.com> 
Sent: Friday, April 10, 2020 8:42 AM
To: dev@dpdk.org
Cc: Zhang, Qi Z <qi.z.zhang@intel.com>; Lu, Nannan <nannan.lu@intel.com>; Peng, Yuan <yuan.peng@intel.com>; Zhao1, Wei <wei.zhao1@intel.com>
Subject: [PATCH 3/3] net/ice/base: force switch to use different recipe for

When we use profile rule as swicth rule to download, if we download 2 different rules one by one, there will be rejection from function ice_aq_sw_rules(), for example:

"flow create 0 priority 0 ingress pattern eth / ipv6 / ah / end actions queue index 3 / end"
"flow create 0 priority 0 ingress pattern eth / ipv6 / esp / end actions queue index 2 / end"

That is because the 2 rules has the same s_rule input set except action queue index, so it will be rejected by hardware. So we have to use different recipes for them.

Also, we need to add recipe_id to keep record of recipe index, which will be used in rule remove, if not, there will be error when search recipe in function
ice_rem_adv_rule() if we create 2 or more profile rule.
For example:

"flow create 0 priority 0 ingress pattern eth / ipv4 / udp / pfcp s_field is 1 / end actions queue index 4 / end"
"flow create 0 priority 0 ingress pattern eth / ipv4 / udp / pfcp s_field is 0 / end actions queue index 5 / end"

then,

"flow flush 0"

you will find only the first rule will be delete, because ice_find_recp() will always return recipe id of the first rule.

Signed-off-by: Wei Zhao <wei.zhao1@intel.com>
---
 drivers/net/ice/base/ice_switch.c | 15 ++++++++++-----  drivers/net/ice/base/ice_switch.h |  1 +
 2 files changed, 11 insertions(+), 5 deletions(-)

diff --git a/drivers/net/ice/base/ice_switch.c b/drivers/net/ice/base/ice_switch.c
index bc0c368d7..d8eec7f51 100644
--- a/drivers/net/ice/base/ice_switch.c
+++ b/drivers/net/ice/base/ice_switch.c
@@ -4983,7 +4983,8 @@ static const struct ice_protocol_entry ice_prot_id_tbl[ICE_PROTOCOL_LAST] = {
  *
  * Returns index of matching recipe, or ICE_MAX_NUM_RECIPES if not found.
  */
-static u16 ice_find_recp(struct ice_hw *hw, struct ice_prot_lkup_ext *lkup_exts)
+static u16 ice_find_recp(struct ice_hw *hw, struct ice_prot_lkup_ext *lkup_exts,
+			 enum ice_sw_tunnel_type tun_type)
 {
 	bool refresh_required = true;
 	struct ice_sw_recipe *recp;
@@ -5042,7 +5043,10 @@ static u16 ice_find_recp(struct ice_hw *hw, struct ice_prot_lkup_ext *lkup_exts)
 			/* If for "i"th recipe the found was never set to false
 			 * then it means we found our match
 			 */
-			if (found)
+			if (ice_is_prof_rule(tun_type) &&
+			    tun_type == recp[i].tun_type && found)
+				return i; /* Return the recipe ID */
+			else if (!ice_is_prof_rule(tun_type) && found)
 				return i; /* Return the recipe ID */
 		}
 	}
@@ -5798,7 +5802,7 @@ ice_get_compat_fv_bitmap(struct ice_hw *hw, struct ice_adv_rule_info *rinfo,
  * if the rule type is a profile rule, that means that there no field value
  * match required, in this case just a profile hit is required.
  */
-static bool ice_is_prof_rule(enum ice_sw_tunnel_type type)
+bool ice_is_prof_rule(enum ice_sw_tunnel_type type)
 {
 	switch (type) {
 	case ICE_SW_TUN_PROFID_IPV6_ESP:
@@ -5952,11 +5956,12 @@ ice_add_adv_recipe(struct ice_hw *hw, struct ice_adv_lkup_elem *lkups,
 		goto err_free_lkup_exts;
 
 	/* Look for a recipe which matches our requested fv / mask list */
-	*rid = ice_find_recp(hw, lkup_exts);
+	*rid = ice_find_recp(hw, lkup_exts, rinfo->tun_type);
 	if (*rid < ICE_MAX_NUM_RECIPES)
 		/* Success if found a recipe that match the existing criteria */
 		goto err_unroll;
 
+	rm->tun_type = rinfo->tun_type;
 	/* Recipe we need does not exist, add a recipe */
 	status = ice_add_sw_recipe(hw, rm, match_tun, profiles);
 	if (status)
@@ -6873,7 +6878,7 @@ ice_rem_adv_rule(struct ice_hw *hw, struct ice_adv_lkup_elem *lkups,
 	if (status)
 		return status;
 
-	rid = ice_find_recp(hw, &lkup_exts);
+	rid = ice_find_recp(hw, &lkup_exts, rinfo->tun_type);
 	/* If did not find a recipe that match the existing criteria */
 	if (rid == ICE_MAX_NUM_RECIPES)
 		return ICE_ERR_PARAM;
diff --git a/drivers/net/ice/base/ice_switch.h b/drivers/net/ice/base/ice_switch.h
index f7ae5c741..9666422f7 100644
--- a/drivers/net/ice/base/ice_switch.h
+++ b/drivers/net/ice/base/ice_switch.h
@@ -483,5 +483,6 @@ bool ice_is_vsi_valid(struct ice_hw *hw, u16 vsi_handle);
 
 enum ice_status ice_replay_vsi_all_fltr(struct ice_hw *hw, u16 vsi_handle);  void ice_rm_all_sw_replay_rule_info(struct ice_hw *hw);
+bool ice_is_prof_rule(enum ice_sw_tunnel_type type);
 
 #endif /* _ICE_SWITCH_H_ */
--
2.19.1


  reply	other threads:[~2020-04-10  2:43 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-04-10  0:41 [dpdk-dev] [PATCH 0/3] update ice switch base code Wei Zhao
2020-04-10  0:41 ` [dpdk-dev] [PATCH 1/3] net/ice/base: check the number of recipe when in chain Wei Zhao
2020-04-10  2:05   ` Lu, Nannan
2020-04-10  0:41 ` [dpdk-dev] [PATCH 2/3] net/ice/base: add mask check when find switch recipe Wei Zhao
2020-04-14  3:02   ` Lu, Nannan
2020-04-10  0:41 ` [dpdk-dev] [PATCH 3/3] net/ice/base: force switch to use different recipe for Wei Zhao
2020-04-10  2:40   ` Peng, Yuan [this message]
2020-04-10  1:05 ` [dpdk-dev] [PATCH 0/3] update ice switch base code Zhang, Qi Z
2020-04-15  7:52   ` Ye Xiaolong

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=BY5PR11MB38934D436F55F59083CA8918FEDE0@BY5PR11MB3893.namprd11.prod.outlook.com \
    --to=yuan.peng@intel.com \
    --cc=dev@dpdk.org \
    --cc=nannan.lu@intel.com \
    --cc=qi.z.zhang@intel.com \
    --cc=wei.zhao1@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).