All of lore.kernel.org
 help / color / mirror / Atom feed
From: Leyi Rong <leyi.rong@intel.com>
To: qi.z.zhang@intel.com
Cc: dev@dpdk.org, Leyi Rong <leyi.rong@intel.com>,
	Dan Nowlin <dan.nowlin@intel.com>,
	Paul M Stillwell Jr <paul.m.stillwell.jr@intel.com>
Subject: [dpdk-dev] [PATCH v2 55/66] net/ice/base: enable additional switch rules
Date: Tue, 11 Jun 2019 23:52:10 +0800	[thread overview]
Message-ID: <20190611155221.2703-56-leyi.rong@intel.com> (raw)
In-Reply-To: <20190611155221.2703-1-leyi.rong@intel.com>

Add capability to create inner IP and inner TCP switch recipes and
rules. Change UDP tunnel dummy packet to accommodate the training of
these new rules.

Signed-off-by: Dan Nowlin <dan.nowlin@intel.com>
Signed-off-by: Paul M Stillwell Jr <paul.m.stillwell.jr@intel.com>
Signed-off-by: Leyi Rong <leyi.rong@intel.com>
---
 drivers/net/ice/base/ice_protocol_type.h |   8 +-
 drivers/net/ice/base/ice_switch.c        | 361 ++++++++++++-----------
 drivers/net/ice/base/ice_switch.h        |   1 +
 3 files changed, 203 insertions(+), 167 deletions(-)

diff --git a/drivers/net/ice/base/ice_protocol_type.h b/drivers/net/ice/base/ice_protocol_type.h
index 82822fb74..38bed7a79 100644
--- a/drivers/net/ice/base/ice_protocol_type.h
+++ b/drivers/net/ice/base/ice_protocol_type.h
@@ -35,6 +35,7 @@ enum ice_protocol_type {
 	ICE_IPV6_IL,
 	ICE_IPV6_OFOS,
 	ICE_TCP_IL,
+	ICE_UDP_OF,
 	ICE_UDP_ILOS,
 	ICE_SCTP_IL,
 	ICE_VXLAN,
@@ -112,6 +113,7 @@ enum ice_prot_id {
 #define ICE_IPV6_OFOS_HW	40
 #define ICE_IPV6_IL_HW		41
 #define ICE_TCP_IL_HW		49
+#define ICE_UDP_OF_HW		52
 #define ICE_UDP_ILOS_HW		53
 #define ICE_SCTP_IL_HW		96
 
@@ -188,8 +190,7 @@ struct ice_l4_hdr {
 struct ice_udp_tnl_hdr {
 	u16 field;
 	u16 proto_type;
-	u16 vni;
-	u16 reserved;
+	u32 vni;	/* only use lower 24-bits */
 };
 
 struct ice_nvgre {
@@ -225,6 +226,7 @@ struct ice_prot_lkup_ext {
 	u8 n_val_words;
 	/* create a buffer to hold max words per recipe */
 	u16 field_off[ICE_MAX_CHAIN_WORDS];
+	u16 field_mask[ICE_MAX_CHAIN_WORDS];
 
 	struct ice_fv_word fv_words[ICE_MAX_CHAIN_WORDS];
 
@@ -235,6 +237,7 @@ struct ice_prot_lkup_ext {
 struct ice_pref_recipe_group {
 	u8 n_val_pairs;		/* Number of valid pairs */
 	struct ice_fv_word pairs[ICE_NUM_WORDS_RECIPE];
+	u16 mask[ICE_NUM_WORDS_RECIPE];
 };
 
 struct ice_recp_grp_entry {
@@ -244,6 +247,7 @@ struct ice_recp_grp_entry {
 	u16 rid;
 	u8 chain_idx;
 	u16 fv_idx[ICE_NUM_WORDS_RECIPE];
+	u16 fv_mask[ICE_NUM_WORDS_RECIPE];
 	struct ice_pref_recipe_group r_group;
 };
 #endif /* _ICE_PROTOCOL_TYPE_H_ */
diff --git a/drivers/net/ice/base/ice_switch.c b/drivers/net/ice/base/ice_switch.c
index c7fcd71a7..0dae1b609 100644
--- a/drivers/net/ice/base/ice_switch.c
+++ b/drivers/net/ice/base/ice_switch.c
@@ -53,60 +53,109 @@ static const u8 dummy_eth_header[DUMMY_ETH_HDR_LEN] = { 0x2, 0, 0, 0, 0, 0,
 	 sizeof(((struct ice_sw_rule_vsi_list *)0)->vsi) + \
 	 ((n) * sizeof(((struct ice_sw_rule_vsi_list *)0)->vsi)))
 
+static const struct ice_dummy_pkt_offsets {
+	enum ice_protocol_type type;
+	u16 offset; /* ICE_PROTOCOL_LAST indicates end of list */
+} dummy_gre_packet_offsets[] = {
+	{ ICE_MAC_OFOS,		0 },
+	{ ICE_IPV4_OFOS,	14 },
+	{ ICE_VXLAN,		34 },
+	{ ICE_MAC_IL,		42 },
+	{ ICE_IPV4_IL,		54 },
+	{ ICE_PROTOCOL_LAST,	0 },
+};
+
 static const
-u8 dummy_gre_packet[] = { 0, 0, 0, 0,		/* Ether starts */
+u8 dummy_gre_packet[] = { 0, 0, 0, 0,		/* ICE_MAC_OFOS 0 */
 			  0, 0, 0, 0,
 			  0, 0, 0, 0,
-			  0x08, 0,		/* Ether ends */
-			  0x45, 0, 0, 0x3E,	/* IP starts */
+			  0x08, 0,
+			  0x45, 0, 0, 0x3E,	/* ICE_IPV4_OFOS 14 */
 			  0, 0, 0, 0,
 			  0, 0x2F, 0, 0,
 			  0, 0, 0, 0,
-			  0, 0, 0, 0,		/* IP ends */
-			  0x80, 0, 0x65, 0x58,	/* GRE starts */
-			  0, 0, 0, 0,		/* GRE ends */
-			  0, 0, 0, 0,		/* Ether starts */
-			  0, 0, 0, 0,
-			  0, 0, 0, 0,
-			  0x08, 0,		/* Ether ends */
-			  0x45, 0, 0, 0x14,	/* IP starts */
 			  0, 0, 0, 0,
+			  0x80, 0, 0x65, 0x58,	/* ICE_VXLAN_GRE 34 */
 			  0, 0, 0, 0,
+			  0, 0, 0, 0,		/* ICE_MAC_IL 42 */
 			  0, 0, 0, 0,
-			  0, 0, 0, 0		/* IP ends */
-			};
-
-static const u8
-dummy_udp_tun_packet[] = {0, 0, 0, 0,		/* Ether starts */
-			  0, 0, 0, 0,
-			  0, 0, 0, 0,
-			  0x08, 0,		/* Ether ends */
-			  0x45, 0, 0, 0x32,	/* IP starts */
 			  0, 0, 0, 0,
-			  0, 0x11, 0, 0,
+			  0x08, 0,
+			  0x45, 0, 0, 0x14,	/* ICE_IPV4_IL 54 */
 			  0, 0, 0, 0,
-			  0, 0, 0, 0,		/* IP ends */
-			  0, 0, 0x12, 0xB5,	/* UDP start*/
-			  0, 0x1E, 0, 0,	/* UDP end*/
-			  0, 0, 0, 0,		/* VXLAN start */
-			  0, 0, 0, 0,		/* VXLAN end*/
-			  0, 0, 0, 0,		/* Ether starts */
 			  0, 0, 0, 0,
 			  0, 0, 0, 0,
-			  0, 0			/* Ether ends */
+			  0, 0, 0, 0
 			};
 
+static const
+struct ice_dummy_pkt_offsets dummy_udp_tun_packet_offsets[] = {
+	{ ICE_MAC_OFOS,		0 },
+	{ ICE_IPV4_OFOS,	14 },
+	{ ICE_UDP_OF,		34 },
+	{ ICE_VXLAN,		42 },
+	{ ICE_MAC_IL,		50 },
+	{ ICE_IPV4_IL,		64 },
+	{ ICE_TCP_IL,		84 },
+	{ ICE_PROTOCOL_LAST,	0 },
+};
+
+static const
+u8 dummy_udp_tun_packet[] = {
+	0x00, 0x00, 0x00, 0x00,  /* ICE_MAC_OFOS 0 */
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x08, 0x00,
+
+	0x45, 0x00, 0x00, 0x5a, /* ICE_IPV4_OFOS 14 */
+	0x00, 0x01, 0x00, 0x00,
+	0x40, 0x11, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+
+	0x00, 0x00, 0x12, 0xb5, /* ICE_UDP_OF 34 */
+	0x00, 0x46, 0x00, 0x00,
+
+	0x04, 0x00, 0x00, 0x03, /* ICE_VXLAN 42 */
+	0x00, 0x00, 0x00, 0x00,
+
+	0x00, 0x00, 0x00, 0x00, /* ICE_MAC_IL 50 */
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x08, 0x00,
+
+	0x45, 0x00, 0x00, 0x28, /* ICE_IPV4_IL 64 */
+	0x00, 0x01, 0x00, 0x00,
+	0x40, 0x06, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+
+	0x00, 0x00, 0x00, 0x00, /* ICE_TCP_IL 84 */
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x50, 0x02, 0x20, 0x00,
+	0x00, 0x00, 0x00, 0x00
+};
+
+static const
+struct ice_dummy_pkt_offsets dummy_tcp_tun_packet_offsets[] = {
+	{ ICE_MAC_OFOS,		0 },
+	{ ICE_IPV4_OFOS,	14 },
+	{ ICE_TCP_IL,		34 },
+	{ ICE_PROTOCOL_LAST,	0 },
+};
+
 static const u8
-dummy_tcp_tun_packet[] = {0, 0, 0, 0,		/* Ether starts */
+dummy_tcp_tun_packet[] = {0, 0, 0, 0,		/* ICE_MAC_OFOS 0 */
 			  0, 0, 0, 0,
 			  0, 0, 0, 0,
-			  0x08, 0,              /* Ether ends */
-			  0x45, 0, 0, 0x28,     /* IP starts */
+			  0x08, 0,
+			  0x45, 0, 0, 0x28,     /* ICE_IPV4_OFOS 14 */
 			  0, 0x01, 0, 0,
 			  0x40, 0x06, 0xF5, 0x69,
 			  0, 0, 0, 0,
-			  0, 0, 0, 0,   /* IP ends */
 			  0, 0, 0, 0,
+			  0, 0, 0, 0,		/* ICE_TCP_IL 34 */
 			  0, 0, 0, 0,
 			  0, 0, 0, 0,
 			  0x50, 0x02, 0x20,
@@ -184,6 +233,9 @@ ice_get_recp_frm_fw(struct ice_hw *hw, struct ice_sw_recipe *recps, u8 rid)
 			u8 lkup_indx = root_bufs.content.lkup_indx[i + 1];
 
 			rg_entry->fv_idx[i] = lkup_indx;
+			rg_entry->fv_mask[i] =
+				LE16_TO_CPU(root_bufs.content.mask[i + 1]);
+
 			/* If the recipe is a chained recipe then all its
 			 * child recipe's result will have a result index.
 			 * To fill fv_words we should not use those result
@@ -4246,10 +4298,11 @@ static const struct ice_prot_ext_tbl_entry ice_prot_ext[] = {
 	{ ICE_IPV6_OFOS,	{ 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24,
 				 26, 28, 30, 32, 34, 36, 38 } },
 	{ ICE_TCP_IL,		{ 0, 2 } },
+	{ ICE_UDP_OF,		{ 0, 2 } },
 	{ ICE_UDP_ILOS,		{ 0, 2 } },
 	{ ICE_SCTP_IL,		{ 0, 2 } },
-	{ ICE_VXLAN,		{ 8, 10, 12 } },
-	{ ICE_GENEVE,		{ 8, 10, 12 } },
+	{ ICE_VXLAN,		{ 8, 10, 12, 14 } },
+	{ ICE_GENEVE,		{ 8, 10, 12, 14 } },
 	{ ICE_VXLAN_GPE,	{ 0, 2, 4 } },
 	{ ICE_NVGRE,		{ 0, 2 } },
 	{ ICE_PROTOCOL_LAST,	{ 0 } }
@@ -4262,11 +4315,14 @@ static const struct ice_prot_ext_tbl_entry ice_prot_ext[] = {
  */
 static const struct ice_pref_recipe_group ice_recipe_pack[] = {
 	{3, { { ICE_MAC_OFOS_HW, 0, 0 }, { ICE_MAC_OFOS_HW, 2, 0 },
-	      { ICE_MAC_OFOS_HW, 4, 0 } } },
+	      { ICE_MAC_OFOS_HW, 4, 0 } }, { 0xffff, 0xffff, 0xffff, 0xffff } },
 	{4, { { ICE_MAC_IL_HW, 0, 0 }, { ICE_MAC_IL_HW, 2, 0 },
-	      { ICE_MAC_IL_HW, 4, 0 }, { ICE_META_DATA_ID_HW, 44, 0 } } },
-	{2, { { ICE_IPV4_IL_HW, 0, 0 }, { ICE_IPV4_IL_HW, 2, 0 } } },
-	{2, { { ICE_IPV4_IL_HW, 12, 0 }, { ICE_IPV4_IL_HW, 14, 0 } } },
+	      { ICE_MAC_IL_HW, 4, 0 }, { ICE_META_DATA_ID_HW, 44, 0 } },
+		{ 0xffff, 0xffff, 0xffff, 0xffff } },
+	{2, { { ICE_IPV4_IL_HW, 0, 0 }, { ICE_IPV4_IL_HW, 2, 0 } },
+		{ 0xffff, 0xffff, 0xffff, 0xffff } },
+	{2, { { ICE_IPV4_IL_HW, 12, 0 }, { ICE_IPV4_IL_HW, 14, 0 } },
+		{ 0xffff, 0xffff, 0xffff, 0xffff } },
 };
 
 static const struct ice_protocol_entry ice_prot_id_tbl[] = {
@@ -4277,6 +4333,7 @@ static const struct ice_protocol_entry ice_prot_id_tbl[] = {
 	{ ICE_IPV6_OFOS,	ICE_IPV6_OFOS_HW },
 	{ ICE_IPV6_IL,		ICE_IPV6_IL_HW },
 	{ ICE_TCP_IL,		ICE_TCP_IL_HW },
+	{ ICE_UDP_OF,		ICE_UDP_OF_HW },
 	{ ICE_UDP_ILOS,		ICE_UDP_ILOS_HW },
 	{ ICE_SCTP_IL,		ICE_SCTP_IL_HW },
 	{ ICE_VXLAN,		ICE_UDP_OF_HW },
@@ -4395,7 +4452,7 @@ ice_fill_valid_words(struct ice_adv_lkup_elem *rule,
 	word = lkup_exts->n_val_words;
 
 	for (j = 0; j < sizeof(rule->m_u) / sizeof(u16); j++)
-		if (((u16 *)&rule->m_u)[j] == 0xffff &&
+		if (((u16 *)&rule->m_u)[j] &&
 		    rule->type < ARRAY_SIZE(ice_prot_ext)) {
 			/* No more space to accommodate */
 			if (word >= ICE_MAX_CHAIN_WORDS)
@@ -4404,6 +4461,7 @@ ice_fill_valid_words(struct ice_adv_lkup_elem *rule,
 				ice_prot_ext[rule->type].offs[j];
 			lkup_exts->fv_words[word].prot_id =
 				ice_prot_id_tbl[rule->type].protocol_id;
+			lkup_exts->field_mask[word] = ((u16 *)&rule->m_u)[j];
 			word++;
 		}
 
@@ -4527,6 +4585,7 @@ ice_create_first_fit_recp_def(struct ice_hw *hw,
 				lkup_exts->fv_words[j].prot_id;
 			grp->pairs[grp->n_val_pairs].off =
 				lkup_exts->fv_words[j].off;
+			grp->mask[grp->n_val_pairs] = lkup_exts->field_mask[j];
 			grp->n_val_pairs++;
 		}
 
@@ -4561,14 +4620,22 @@ ice_fill_fv_word_index(struct ice_hw *hw, struct LIST_HEAD_TYPE *fv_list,
 
 		for (i = 0; i < rg->r_group.n_val_pairs; i++) {
 			struct ice_fv_word *pr;
+			u16 mask;
 			u8 j;
 
 			pr = &rg->r_group.pairs[i];
+			mask = rg->r_group.mask[i];
+
 			for (j = 0; j < hw->blk[ICE_BLK_SW].es.fvw; j++)
 				if (fv_ext[j].prot_id == pr->prot_id &&
 				    fv_ext[j].off == pr->off) {
 					/* Store index of field vector */
 					rg->fv_idx[i] = j;
+					/* Mask is given by caller as big
+					 * endian, but sent to FW as little
+					 * endian
+					 */
+					rg->fv_mask[i] = mask << 8 | mask >> 8;
 					break;
 				}
 		}
@@ -4666,7 +4733,8 @@ ice_add_sw_recipe(struct ice_hw *hw, struct ice_sw_recipe *rm,
 
 		for (i = 0; i < entry->r_group.n_val_pairs; i++) {
 			buf[recps].content.lkup_indx[i + 1] = entry->fv_idx[i];
-			buf[recps].content.mask[i + 1] = CPU_TO_LE16(0xFFFF);
+			buf[recps].content.mask[i + 1] =
+				CPU_TO_LE16(entry->fv_mask[i]);
 		}
 
 		if (rm->n_grp_count > 1) {
@@ -4888,6 +4956,8 @@ ice_create_recipe_group(struct ice_hw *hw, struct ice_sw_recipe *rm,
 		rm->n_ext_words = lkup_exts->n_val_words;
 		ice_memcpy(&rm->ext_words, lkup_exts->fv_words,
 			   sizeof(rm->ext_words), ICE_NONDMA_TO_NONDMA);
+		ice_memcpy(rm->word_masks, lkup_exts->field_mask,
+			   sizeof(rm->word_masks), ICE_NONDMA_TO_NONDMA);
 		goto out;
 	}
 
@@ -5089,16 +5159,8 @@ ice_add_adv_recipe(struct ice_hw *hw, struct ice_adv_lkup_elem *lkups,
 	return status;
 }
 
-#define ICE_MAC_HDR_OFFSET	0
-#define ICE_IP_HDR_OFFSET	14
-#define ICE_GRE_HDR_OFFSET	34
-#define ICE_MAC_IL_HDR_OFFSET	42
-#define ICE_IP_IL_HDR_OFFSET	56
-#define ICE_L4_HDR_OFFSET	34
-#define ICE_UDP_TUN_HDR_OFFSET	42
-
 /**
- * ice_find_dummy_packet - find dummy packet with given match criteria
+ * ice_find_dummy_packet - find dummy packet by tunnel type
  *
  * @lkups: lookup elements or match criteria for the advanced recipe, one
  *	   structure per protocol header
@@ -5106,17 +5168,20 @@ ice_add_adv_recipe(struct ice_hw *hw, struct ice_adv_lkup_elem *lkups,
  * @tun_type: tunnel type from the match criteria
  * @pkt: dummy packet to fill according to filter match criteria
  * @pkt_len: packet length of dummy packet
+ * @offsets: pointer to receive the pointer to the offsets for the packet
  */
 static void
 ice_find_dummy_packet(struct ice_adv_lkup_elem *lkups, u16 lkups_cnt,
 		      enum ice_sw_tunnel_type tun_type, const u8 **pkt,
-		      u16 *pkt_len)
+		      u16 *pkt_len,
+		      const struct ice_dummy_pkt_offsets **offsets)
 {
 	u16 i;
 
 	if (tun_type == ICE_SW_TUN_NVGRE || tun_type == ICE_ALL_TUNNELS) {
 		*pkt = dummy_gre_packet;
 		*pkt_len = sizeof(dummy_gre_packet);
+		*offsets = dummy_gre_packet_offsets;
 		return;
 	}
 
@@ -5124,6 +5189,7 @@ ice_find_dummy_packet(struct ice_adv_lkup_elem *lkups, u16 lkups_cnt,
 	    tun_type == ICE_SW_TUN_VXLAN_GPE) {
 		*pkt = dummy_udp_tun_packet;
 		*pkt_len = sizeof(dummy_udp_tun_packet);
+		*offsets = dummy_udp_tun_packet_offsets;
 		return;
 	}
 
@@ -5131,12 +5197,14 @@ ice_find_dummy_packet(struct ice_adv_lkup_elem *lkups, u16 lkups_cnt,
 		if (lkups[i].type == ICE_UDP_ILOS) {
 			*pkt = dummy_udp_tun_packet;
 			*pkt_len = sizeof(dummy_udp_tun_packet);
+			*offsets = dummy_udp_tun_packet_offsets;
 			return;
 		}
 	}
 
 	*pkt = dummy_tcp_tun_packet;
 	*pkt_len = sizeof(dummy_tcp_tun_packet);
+	*offsets = dummy_tcp_tun_packet_offsets;
 }
 
 /**
@@ -5145,16 +5213,16 @@ ice_find_dummy_packet(struct ice_adv_lkup_elem *lkups, u16 lkups_cnt,
  * @lkups: lookup elements or match criteria for the advanced recipe, one
  *	   structure per protocol header
  * @lkups_cnt: number of protocols
- * @tun_type: to know if the dummy packet is supposed to be tunnel packet
  * @s_rule: stores rule information from the match criteria
  * @dummy_pkt: dummy packet to fill according to filter match criteria
  * @pkt_len: packet length of dummy packet
+ * @offsets: offset info for the dummy packet
  */
-static void
+static enum ice_status
 ice_fill_adv_dummy_packet(struct ice_adv_lkup_elem *lkups, u16 lkups_cnt,
-			  enum ice_sw_tunnel_type tun_type,
 			  struct ice_aqc_sw_rules_elem *s_rule,
-			  const u8 *dummy_pkt, u16 pkt_len)
+			  const u8 *dummy_pkt, u16 pkt_len,
+			  const struct ice_dummy_pkt_offsets *offsets)
 {
 	u8 *pkt;
 	u16 i;
@@ -5167,124 +5235,74 @@ ice_fill_adv_dummy_packet(struct ice_adv_lkup_elem *lkups, u16 lkups_cnt,
 	ice_memcpy(pkt, dummy_pkt, pkt_len, ICE_NONDMA_TO_NONDMA);
 
 	for (i = 0; i < lkups_cnt; i++) {
-		u32 len, pkt_off, hdr_size, field_off;
+		enum ice_protocol_type type;
+		u16 offset = 0, len = 0, j;
+		bool found = false;
+
+		/* find the start of this layer; it should be found since this
+		 * was already checked when search for the dummy packet
+		 */
+		type = lkups[i].type;
+		for (j = 0; offsets[j].type != ICE_PROTOCOL_LAST; j++) {
+			if (type == offsets[j].type) {
+				offset = offsets[j].offset;
+				found = true;
+				break;
+			}
+		}
+		/* this should never happen in a correct calling sequence */
+		if (!found)
+			return ICE_ERR_PARAM;
 
 		switch (lkups[i].type) {
 		case ICE_MAC_OFOS:
 		case ICE_MAC_IL:
-			pkt_off = offsetof(struct ice_ether_hdr, dst_addr) +
-				((lkups[i].type == ICE_MAC_IL) ?
-				 ICE_MAC_IL_HDR_OFFSET : 0);
-			len = sizeof(lkups[i].h_u.eth_hdr.dst_addr);
-			if ((tun_type == ICE_SW_TUN_VXLAN ||
-			     tun_type == ICE_SW_TUN_GENEVE ||
-			     tun_type == ICE_SW_TUN_VXLAN_GPE) &&
-			     lkups[i].type == ICE_MAC_IL) {
-				pkt_off += sizeof(struct ice_udp_tnl_hdr);
-			}
-
-			ice_memcpy(&pkt[pkt_off],
-				   &lkups[i].h_u.eth_hdr.dst_addr, len,
-				   ICE_NONDMA_TO_NONDMA);
-			pkt_off = offsetof(struct ice_ether_hdr, src_addr) +
-				((lkups[i].type == ICE_MAC_IL) ?
-				 ICE_MAC_IL_HDR_OFFSET : 0);
-			len = sizeof(lkups[i].h_u.eth_hdr.src_addr);
-			if ((tun_type == ICE_SW_TUN_VXLAN ||
-			     tun_type == ICE_SW_TUN_GENEVE ||
-			     tun_type == ICE_SW_TUN_VXLAN_GPE) &&
-			     lkups[i].type == ICE_MAC_IL) {
-				pkt_off += sizeof(struct ice_udp_tnl_hdr);
-			}
-			ice_memcpy(&pkt[pkt_off],
-				   &lkups[i].h_u.eth_hdr.src_addr, len,
-				   ICE_NONDMA_TO_NONDMA);
-			if (lkups[i].h_u.eth_hdr.ethtype_id) {
-				pkt_off = offsetof(struct ice_ether_hdr,
-						   ethtype_id) +
-					((lkups[i].type == ICE_MAC_IL) ?
-					 ICE_MAC_IL_HDR_OFFSET : 0);
-				len = sizeof(lkups[i].h_u.eth_hdr.ethtype_id);
-				if ((tun_type == ICE_SW_TUN_VXLAN ||
-				     tun_type == ICE_SW_TUN_GENEVE ||
-				     tun_type == ICE_SW_TUN_VXLAN_GPE) &&
-				     lkups[i].type == ICE_MAC_IL) {
-					pkt_off +=
-						sizeof(struct ice_udp_tnl_hdr);
-				}
-				ice_memcpy(&pkt[pkt_off],
-					   &lkups[i].h_u.eth_hdr.ethtype_id,
-					   len, ICE_NONDMA_TO_NONDMA);
-			}
+			len = sizeof(struct ice_ether_hdr);
 			break;
 		case ICE_IPV4_OFOS:
-			hdr_size = sizeof(struct ice_ipv4_hdr);
-			if (lkups[i].h_u.ipv4_hdr.dst_addr) {
-				pkt_off = ICE_IP_HDR_OFFSET +
-					   offsetof(struct ice_ipv4_hdr,
-						    dst_addr);
-				field_off = offsetof(struct ice_ipv4_hdr,
-						     dst_addr);
-				len = hdr_size - field_off;
-				ice_memcpy(&pkt[pkt_off],
-					   &lkups[i].h_u.ipv4_hdr.dst_addr,
-					   len, ICE_NONDMA_TO_NONDMA);
-			}
-			if (lkups[i].h_u.ipv4_hdr.src_addr) {
-				pkt_off = ICE_IP_HDR_OFFSET +
-					   offsetof(struct ice_ipv4_hdr,
-						    src_addr);
-				field_off = offsetof(struct ice_ipv4_hdr,
-						     src_addr);
-				len = hdr_size - field_off;
-				ice_memcpy(&pkt[pkt_off],
-					   &lkups[i].h_u.ipv4_hdr.src_addr,
-					   len, ICE_NONDMA_TO_NONDMA);
-			}
-			break;
 		case ICE_IPV4_IL:
+			len = sizeof(struct ice_ipv4_hdr);
 			break;
 		case ICE_TCP_IL:
+		case ICE_UDP_OF:
 		case ICE_UDP_ILOS:
+			len = sizeof(struct ice_l4_hdr);
+			break;
 		case ICE_SCTP_IL:
-			hdr_size = sizeof(struct ice_udp_tnl_hdr);
-			if (lkups[i].h_u.l4_hdr.dst_port) {
-				pkt_off = ICE_L4_HDR_OFFSET +
-					   offsetof(struct ice_l4_hdr,
-						    dst_port);
-				field_off = offsetof(struct ice_l4_hdr,
-						     dst_port);
-				len =  hdr_size - field_off;
-				ice_memcpy(&pkt[pkt_off],
-					   &lkups[i].h_u.l4_hdr.dst_port,
-					   len, ICE_NONDMA_TO_NONDMA);
-			}
-			if (lkups[i].h_u.l4_hdr.src_port) {
-				pkt_off = ICE_L4_HDR_OFFSET +
-					offsetof(struct ice_l4_hdr, src_port);
-				field_off = offsetof(struct ice_l4_hdr,
-						     src_port);
-				len =  hdr_size - field_off;
-				ice_memcpy(&pkt[pkt_off],
-					   &lkups[i].h_u.l4_hdr.src_port,
-					   len, ICE_NONDMA_TO_NONDMA);
-			}
+			len = sizeof(struct ice_sctp_hdr);
 			break;
 		case ICE_VXLAN:
 		case ICE_GENEVE:
 		case ICE_VXLAN_GPE:
-			pkt_off = ICE_UDP_TUN_HDR_OFFSET +
-				   offsetof(struct ice_udp_tnl_hdr, vni);
-			field_off = offsetof(struct ice_udp_tnl_hdr, vni);
-			len =  sizeof(struct ice_udp_tnl_hdr) - field_off;
-			ice_memcpy(&pkt[pkt_off], &lkups[i].h_u.tnl_hdr.vni,
-				   len, ICE_NONDMA_TO_NONDMA);
+			len = sizeof(struct ice_udp_tnl_hdr);
 			break;
 		default:
-			break;
+			return ICE_ERR_PARAM;
 		}
+
+		/* the length should be a word multiple */
+		if (len % ICE_BYTES_PER_WORD)
+			return ICE_ERR_CFG;
+
+		/* We have the offset to the header start, the length, the
+		 * caller's header values and mask. Use this information to
+		 * copy the data into the dummy packet appropriately based on
+		 * the mask. Note that we need to only write the bits as
+		 * indicated by the mask to make sure we don't improperly write
+		 * over any significant packet data.
+		 */
+		for (j = 0; j < len / sizeof(u16); j++)
+			if (((u16 *)&lkups[i].m_u)[j])
+				((u16 *)(pkt + offset))[j] =
+					(((u16 *)(pkt + offset))[j] &
+					 ~((u16 *)&lkups[i].m_u)[j]) |
+					(((u16 *)&lkups[i].h_u)[j] &
+					 ((u16 *)&lkups[i].m_u)[j]);
 	}
+
 	s_rule->pdata.lkup_tx_rx.hdr_len = CPU_TO_LE16(pkt_len);
+
+	return ICE_SUCCESS;
 }
 
 /**
@@ -5438,7 +5456,7 @@ ice_adv_add_update_vsi_list(struct ice_hw *hw,
 }
 
 /**
- * ice_add_adv_rule - create an advanced switch rule
+ * ice_add_adv_rule - helper function to create an advanced switch rule
  * @hw: pointer to the hardware structure
  * @lkups: information on the words that needs to be looked up. All words
  * together makes one recipe
@@ -5462,11 +5480,13 @@ ice_add_adv_rule(struct ice_hw *hw, struct ice_adv_lkup_elem *lkups,
 {
 	struct ice_adv_fltr_mgmt_list_entry *m_entry, *adv_fltr = NULL;
 	u16 rid = 0, i, pkt_len, rule_buf_sz, vsi_handle;
-	struct ice_aqc_sw_rules_elem *s_rule;
+	const struct ice_dummy_pkt_offsets *pkt_offsets;
+	struct ice_aqc_sw_rules_elem *s_rule = NULL;
 	struct LIST_HEAD_TYPE *rule_head;
 	struct ice_switch_info *sw;
 	enum ice_status status;
 	const u8 *pkt = NULL;
+	bool found = false;
 	u32 act = 0;
 
 	if (!lkups_cnt)
@@ -5475,13 +5495,25 @@ ice_add_adv_rule(struct ice_hw *hw, struct ice_adv_lkup_elem *lkups,
 	for (i = 0; i < lkups_cnt; i++) {
 		u16 j, *ptr;
 
-		/* Validate match masks to make sure they match complete 16-bit
-		 * words.
+		/* Validate match masks to make sure that there is something
+		 * to match.
 		 */
-		ptr = (u16 *)&lkups->m_u;
+		ptr = (u16 *)&lkups[i].m_u;
 		for (j = 0; j < sizeof(lkups->m_u) / sizeof(u16); j++)
-			if (ptr[j] != 0 && ptr[j] != 0xffff)
-				return ICE_ERR_PARAM;
+			if (ptr[j] != 0) {
+				found = true;
+				break;
+			}
+	}
+	if (!found)
+		return ICE_ERR_PARAM;
+
+	/* make sure that we can locate a dummy packet */
+	ice_find_dummy_packet(lkups, lkups_cnt, rinfo->tun_type, &pkt, &pkt_len,
+			      &pkt_offsets);
+	if (!pkt) {
+		status = ICE_ERR_PARAM;
+		goto err_ice_add_adv_rule;
 	}
 
 	if (!(rinfo->sw_act.fltr_act == ICE_FWD_TO_VSI ||
@@ -5522,8 +5554,6 @@ ice_add_adv_rule(struct ice_hw *hw, struct ice_adv_lkup_elem *lkups,
 		}
 		return status;
 	}
-	ice_find_dummy_packet(lkups, lkups_cnt, rinfo->tun_type, &pkt,
-			      &pkt_len);
 	rule_buf_sz = ICE_SW_RULE_RX_TX_NO_HDR_SIZE + pkt_len;
 	s_rule = (struct ice_aqc_sw_rules_elem *)ice_malloc(hw, rule_buf_sz);
 	if (!s_rule)
@@ -5568,8 +5598,8 @@ ice_add_adv_rule(struct ice_hw *hw, struct ice_adv_lkup_elem *lkups,
 	s_rule->pdata.lkup_tx_rx.recipe_id = CPU_TO_LE16(rid);
 	s_rule->pdata.lkup_tx_rx.act = CPU_TO_LE32(act);
 
-	ice_fill_adv_dummy_packet(lkups, lkups_cnt, rinfo->tun_type, s_rule,
-				  pkt, pkt_len);
+	ice_fill_adv_dummy_packet(lkups, lkups_cnt, s_rule, pkt, pkt_len,
+				  pkt_offsets);
 
 	status = ice_aq_sw_rules(hw, (struct ice_aqc_sw_rules *)s_rule,
 				 rule_buf_sz, 1, ice_aqc_opc_add_sw_rules,
@@ -5745,11 +5775,12 @@ ice_rem_adv_rule(struct ice_hw *hw, struct ice_adv_lkup_elem *lkups,
 		 u16 lkups_cnt, struct ice_adv_rule_info *rinfo)
 {
 	struct ice_adv_fltr_mgmt_list_entry *list_elem;
+	const struct ice_dummy_pkt_offsets *offsets;
 	struct ice_prot_lkup_ext lkup_exts;
 	u16 rule_buf_sz, pkt_len, i, rid;
+	struct ice_lock *rule_lock; /* Lock to protect filter rule list */
 	enum ice_status status = ICE_SUCCESS;
 	bool remove_rule = false;
-	struct ice_lock *rule_lock; /* Lock to protect filter rule list */
 	const u8 *pkt = NULL;
 	u16 vsi_handle;
 
@@ -5797,7 +5828,7 @@ ice_rem_adv_rule(struct ice_hw *hw, struct ice_adv_lkup_elem *lkups,
 		struct ice_aqc_sw_rules_elem *s_rule;
 
 		ice_find_dummy_packet(lkups, lkups_cnt, rinfo->tun_type, &pkt,
-				      &pkt_len);
+				      &pkt_len, &offsets);
 		rule_buf_sz = ICE_SW_RULE_RX_TX_NO_HDR_SIZE + pkt_len;
 		s_rule =
 			(struct ice_aqc_sw_rules_elem *)ice_malloc(hw,
diff --git a/drivers/net/ice/base/ice_switch.h b/drivers/net/ice/base/ice_switch.h
index b788aa7ec..4c34bc2ea 100644
--- a/drivers/net/ice/base/ice_switch.h
+++ b/drivers/net/ice/base/ice_switch.h
@@ -192,6 +192,7 @@ struct ice_sw_recipe {
 	 * recipe
 	 */
 	struct ice_fv_word ext_words[ICE_MAX_CHAIN_WORDS];
+	u16 word_masks[ICE_MAX_CHAIN_WORDS];
 
 	/* if this recipe is a collection of other recipe */
 	u8 big_recp;
-- 
2.17.1


  parent reply	other threads:[~2019-06-11 16:04 UTC|newest]

Thread overview: 225+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-06-04  5:41 [dpdk-dev] [PATCH 00/49] shared code update Leyi Rong
2019-06-04  5:42 ` [dpdk-dev] [PATCH 01/49] net/ice/base: add macro for rounding up Leyi Rong
2019-06-04  5:42 ` [dpdk-dev] [PATCH 02/49] net/ice/base: update standard extr seq to include DIR flag Leyi Rong
2019-06-04 17:06   ` Maxime Coquelin
2019-06-04  5:42 ` [dpdk-dev] [PATCH 03/49] net/ice/base: add API to configure MIB Leyi Rong
2019-06-04 17:14   ` Maxime Coquelin
2019-06-05  0:00     ` Stillwell Jr, Paul M
2019-06-05  8:03       ` Maxime Coquelin
2019-06-04  5:42 ` [dpdk-dev] [PATCH 04/49] net/ice/base: add more recipe commands Leyi Rong
2019-06-04  5:42 ` [dpdk-dev] [PATCH 05/49] net/ice/base: add funcs to create new switch recipe Leyi Rong
2019-06-04 17:27   ` Maxime Coquelin
2019-06-04  5:42 ` [dpdk-dev] [PATCH 06/49] net/ice/base: programming a " Leyi Rong
2019-06-04  5:42 ` [dpdk-dev] [PATCH 07/49] net/ice/base: replay advanced rule after reset Leyi Rong
2019-06-05  8:58   ` Maxime Coquelin
2019-06-05 15:53     ` Stillwell Jr, Paul M
2019-06-05 15:59       ` Maxime Coquelin
2019-06-05 16:16         ` Stillwell Jr, Paul M
2019-06-05 16:28           ` Maxime Coquelin
2019-06-05 16:31             ` Stillwell Jr, Paul M
2019-06-04  5:42 ` [dpdk-dev] [PATCH 08/49] net/ice/base: code for removing advanced rule Leyi Rong
2019-06-05  9:07   ` Maxime Coquelin
2019-06-04  5:42 ` [dpdk-dev] [PATCH 09/49] net/ice/base: add lock around profile map list Leyi Rong
2019-06-04  5:42 ` [dpdk-dev] [PATCH 10/49] net/ice/base: save and post reset replay q bandwidth Leyi Rong
2019-06-04  5:42 ` [dpdk-dev] [PATCH 11/49] net/ice/base: rollback AVF RSS configurations Leyi Rong
2019-06-04  5:42 ` [dpdk-dev] [PATCH 12/49] net/ice/base: move RSS replay list Leyi Rong
2019-06-04  5:42 ` [dpdk-dev] [PATCH 13/49] net/ice/base: cache the data of set PHY cfg AQ in SW Leyi Rong
2019-06-04  5:42 ` [dpdk-dev] [PATCH 14/49] net/ice/base: refactor HW table init function Leyi Rong
2019-06-05 10:35   ` Maxime Coquelin
2019-06-05 18:10     ` Stillwell Jr, Paul M
2019-06-04  5:42 ` [dpdk-dev] [PATCH 15/49] net/ice/base: add compatibility check for package version Leyi Rong
2019-06-04  5:42 ` [dpdk-dev] [PATCH 16/49] net/ice/base: add API to init FW logging Leyi Rong
2019-06-04  5:42 ` [dpdk-dev] [PATCH 17/49] net/ice/base: use macro instead of magic 8 Leyi Rong
2019-06-05 10:39   ` Maxime Coquelin
2019-06-04  5:42 ` [dpdk-dev] [PATCH 18/49] net/ice/base: move and redefine ice debug cq API Leyi Rong
2019-06-04  5:42 ` [dpdk-dev] [PATCH 19/49] net/ice/base: separate out control queue lock creation Leyi Rong
2019-06-04  5:42 ` [dpdk-dev] [PATCH 20/49] net/ice/base: add helper functions for PHY caching Leyi Rong
2019-06-04  5:42 ` [dpdk-dev] [PATCH 21/49] net/ice/base: added sibling head to parse nodes Leyi Rong
2019-06-04  5:42 ` [dpdk-dev] [PATCH 22/49] net/ice/base: add and fix debuglogs Leyi Rong
2019-06-04  5:42 ` [dpdk-dev] [PATCH 23/49] net/ice/base: add support for reading REPC statistics Leyi Rong
2019-06-04  5:42 ` [dpdk-dev] [PATCH 24/49] net/ice/base: move VSI to VSI group Leyi Rong
2019-06-04  5:42 ` [dpdk-dev] [PATCH 25/49] net/ice/base: forbid VSI to remove unassociated ucast filter Leyi Rong
2019-06-04  5:42 ` [dpdk-dev] [PATCH 26/49] net/ice/base: add some minor features Leyi Rong
2019-06-04  5:42 ` [dpdk-dev] [PATCH 27/49] net/ice/base: call out dev/func caps when printing Leyi Rong
2019-06-04  5:42 ` [dpdk-dev] [PATCH 28/49] net/ice/base: add some minor features Leyi Rong
2019-06-04  5:42 ` [dpdk-dev] [PATCH 29/49] net/ice/base: cleanup update link info Leyi Rong
2019-06-04  5:42 ` [dpdk-dev] [PATCH 30/49] net/ice/base: add rd64 support Leyi Rong
2019-06-04  5:42 ` [dpdk-dev] [PATCH 31/49] net/ice/base: track HW stat registers past rollover Leyi Rong
2019-06-04  5:42 ` [dpdk-dev] [PATCH 32/49] net/ice/base: implement LLDP persistent settings Leyi Rong
2019-06-04  5:42 ` [dpdk-dev] [PATCH 33/49] net/ice/base: check new FD filter duplicate location Leyi Rong
2019-06-04  5:42 ` [dpdk-dev] [PATCH 34/49] net/ice/base: correct UDP/TCP PTYPE assignments Leyi Rong
2019-06-04  5:42 ` [dpdk-dev] [PATCH 35/49] net/ice/base: calculate rate limit burst size correctly Leyi Rong
2019-06-04  5:42 ` [dpdk-dev] [PATCH 36/49] net/ice/base: add lock around profile map list Leyi Rong
2019-06-04  5:42 ` [dpdk-dev] [PATCH 37/49] net/ice/base: fix Flow Director VSI count Leyi Rong
2019-06-04  5:42 ` [dpdk-dev] [PATCH 38/49] net/ice/base: use more efficient structures Leyi Rong
2019-06-04  5:42 ` [dpdk-dev] [PATCH 39/49] net/ice/base: slightly code update Leyi Rong
2019-06-05 12:04   ` Maxime Coquelin
2019-06-06  6:46     ` Rong, Leyi
2019-06-04  5:42 ` [dpdk-dev] [PATCH 40/49] net/ice/base: code clean up Leyi Rong
2019-06-05 12:06   ` Maxime Coquelin
2019-06-06  7:32     ` Rong, Leyi
2019-06-04  5:42 ` [dpdk-dev] [PATCH 41/49] net/ice/base: cleanup ice flex pipe files Leyi Rong
2019-06-04  5:42 ` [dpdk-dev] [PATCH 42/49] net/ice/base: change how VMDq capability is wrapped Leyi Rong
     [not found]   ` <ca03c24866cdb2f45ed04b6b3e9b35bac06c5dcd.camel@intel.com>
2019-06-05  0:02     ` Stillwell Jr, Paul M
2019-06-04  5:42 ` [dpdk-dev] [PATCH 43/49] net/ice/base: refactor VSI node sched code Leyi Rong
2019-06-04  5:42 ` [dpdk-dev] [PATCH 44/49] net/ice/base: add some minor new defines Leyi Rong
2019-06-04  5:42 ` [dpdk-dev] [PATCH 45/49] net/ice/base: add 16-byte Flex Rx Descriptor Leyi Rong
2019-06-04  5:42 ` [dpdk-dev] [PATCH 46/49] net/ice/base: add vxlan/generic tunnel management Leyi Rong
2019-06-04  5:42 ` [dpdk-dev] [PATCH 47/49] net/ice/base: enable additional switch rules Leyi Rong
2019-06-05 12:24   ` Maxime Coquelin
2019-06-05 16:34     ` Stillwell Jr, Paul M
2019-06-07 12:41       ` Maxime Coquelin
2019-06-07 15:58         ` Stillwell Jr, Paul M
2019-06-04  5:42 ` [dpdk-dev] [PATCH 48/49] net/ice/base: allow forward to Q groups in switch rule Leyi Rong
2019-06-04  5:42 ` [dpdk-dev] [PATCH 49/49] net/ice/base: changes for reducing ice add adv rule time Leyi Rong
2019-06-04 16:56 ` [dpdk-dev] [PATCH 00/49] shared code update Maxime Coquelin
2019-06-06  5:44   ` Rong, Leyi
2019-06-07 12:53     ` Maxime Coquelin
2019-06-11 15:51 ` [dpdk-dev] [PATCH v2 00/66] " Leyi Rong
2019-06-11 15:51   ` [dpdk-dev] [PATCH v2 01/66] net/ice/base: add macro for rounding up Leyi Rong
2019-06-11 15:51   ` [dpdk-dev] [PATCH v2 02/66] net/ice/base: update standard extr seq to include DIR flag Leyi Rong
2019-06-11 15:51   ` [dpdk-dev] [PATCH v2 03/66] net/ice/base: add API to configure MIB Leyi Rong
2019-06-11 15:51   ` [dpdk-dev] [PATCH v2 04/66] net/ice/base: add another valid DCBx state Leyi Rong
2019-06-11 15:51   ` [dpdk-dev] [PATCH v2 05/66] net/ice/base: add more recipe commands Leyi Rong
2019-06-11 15:51   ` [dpdk-dev] [PATCH v2 06/66] net/ice/base: add funcs to create new switch recipe Leyi Rong
2019-06-11 15:51   ` [dpdk-dev] [PATCH v2 07/66] net/ice/base: programming a " Leyi Rong
2019-06-11 15:51   ` [dpdk-dev] [PATCH v2 08/66] net/ice/base: replay advanced rule after reset Leyi Rong
2019-06-11 15:51   ` [dpdk-dev] [PATCH v2 09/66] net/ice/base: code for removing advanced rule Leyi Rong
2019-06-11 15:51   ` [dpdk-dev] [PATCH v2 10/66] net/ice/base: add lock around profile map list Leyi Rong
2019-06-11 15:51   ` [dpdk-dev] [PATCH v2 11/66] net/ice/base: save and post reset replay q bandwidth Leyi Rong
2019-06-11 15:51   ` [dpdk-dev] [PATCH v2 12/66] net/ice/base: rollback AVF RSS configurations Leyi Rong
2019-06-11 15:51   ` [dpdk-dev] [PATCH v2 13/66] net/ice/base: move RSS replay list Leyi Rong
2019-06-11 15:51   ` [dpdk-dev] [PATCH v2 14/66] net/ice/base: cache the data of set PHY cfg AQ in SW Leyi Rong
2019-06-11 15:51   ` [dpdk-dev] [PATCH v2 15/66] net/ice/base: refactor HW table init function Leyi Rong
2019-06-11 15:51   ` [dpdk-dev] [PATCH v2 16/66] net/ice/base: add compatibility check for package version Leyi Rong
2019-06-11 15:51   ` [dpdk-dev] [PATCH v2 17/66] net/ice/base: add API to init FW logging Leyi Rong
2019-06-11 16:23     ` Stillwell Jr, Paul M
2019-06-12 14:38       ` Rong, Leyi
2019-06-11 15:51   ` [dpdk-dev] [PATCH v2 18/66] net/ice/base: use macro instead of magic 8 Leyi Rong
2019-06-11 15:51   ` [dpdk-dev] [PATCH v2 19/66] net/ice/base: move and redefine ice debug cq API Leyi Rong
2019-06-11 15:51   ` [dpdk-dev] [PATCH v2 20/66] net/ice/base: separate out control queue lock creation Leyi Rong
2019-06-11 15:51   ` [dpdk-dev] [PATCH v2 21/66] net/ice/base: add helper functions for PHY caching Leyi Rong
2019-06-11 16:26     ` Stillwell Jr, Paul M
2019-06-12 14:45       ` Rong, Leyi
2019-06-11 15:51   ` [dpdk-dev] [PATCH v2 22/66] net/ice/base: added sibling head to parse nodes Leyi Rong
2019-06-11 15:51   ` [dpdk-dev] [PATCH v2 23/66] net/ice/base: add and fix debuglogs Leyi Rong
2019-06-11 15:51   ` [dpdk-dev] [PATCH v2 24/66] net/ice/base: add support for reading REPC statistics Leyi Rong
2019-06-11 16:28     ` Stillwell Jr, Paul M
2019-06-12 14:48       ` Rong, Leyi
2019-06-11 15:51   ` [dpdk-dev] [PATCH v2 25/66] net/ice/base: move VSI to VSI group Leyi Rong
2019-06-11 15:51   ` [dpdk-dev] [PATCH v2 26/66] net/ice/base: forbid VSI to remove unassociated ucast filter Leyi Rong
2019-06-11 15:51   ` [dpdk-dev] [PATCH v2 27/66] net/ice/base: add some minor features Leyi Rong
2019-06-11 16:30     ` Stillwell Jr, Paul M
2019-06-11 15:51   ` [dpdk-dev] [PATCH v2 28/66] net/ice/base: add hweight32 support Leyi Rong
2019-06-11 15:51   ` [dpdk-dev] [PATCH v2 29/66] net/ice/base: call out dev/func caps when printing Leyi Rong
2019-06-11 15:51   ` [dpdk-dev] [PATCH v2 30/66] net/ice/base: add some minor features Leyi Rong
2019-06-11 16:30     ` Stillwell Jr, Paul M
2019-06-11 15:51   ` [dpdk-dev] [PATCH v2 31/66] net/ice/base: cleanup update link info Leyi Rong
2019-06-11 15:51   ` [dpdk-dev] [PATCH v2 32/66] net/ice/base: add rd64 support Leyi Rong
2019-06-11 15:51   ` [dpdk-dev] [PATCH v2 33/66] net/ice/base: track HW stat registers past rollover Leyi Rong
2019-06-11 15:51   ` [dpdk-dev] [PATCH v2 34/66] net/ice/base: implement LLDP persistent settings Leyi Rong
2019-06-11 15:51   ` [dpdk-dev] [PATCH v2 35/66] net/ice/base: check new FD filter duplicate location Leyi Rong
2019-06-11 15:51   ` [dpdk-dev] [PATCH v2 36/66] net/ice/base: correct UDP/TCP PTYPE assignments Leyi Rong
2019-06-11 15:51   ` [dpdk-dev] [PATCH v2 37/66] net/ice/base: calculate rate limit burst size correctly Leyi Rong
2019-06-11 15:51   ` [dpdk-dev] [PATCH v2 38/66] net/ice/base: add lock around profile map list Leyi Rong
2019-06-11 15:51   ` [dpdk-dev] [PATCH v2 39/66] net/ice/base: fix Flow Director VSI count Leyi Rong
2019-06-11 15:51   ` [dpdk-dev] [PATCH v2 40/66] net/ice/base: use more efficient structures Leyi Rong
2019-06-11 15:51   ` [dpdk-dev] [PATCH v2 41/66] net/ice/base: silent semantic parser warnings Leyi Rong
2019-06-11 15:51   ` [dpdk-dev] [PATCH v2 42/66] net/ice/base: fix for signed package download Leyi Rong
2019-06-11 15:51   ` [dpdk-dev] [PATCH v2 43/66] net/ice/base: add new API to dealloc flow entry Leyi Rong
2019-06-11 15:51   ` [dpdk-dev] [PATCH v2 44/66] net/ice/base: check RSS flow profile list Leyi Rong
2019-06-11 15:52   ` [dpdk-dev] [PATCH v2 45/66] net/ice/base: protect list add with lock Leyi Rong
2019-06-11 15:52   ` [dpdk-dev] [PATCH v2 46/66] net/ice/base: fix Rx functionality for ethertype filters Leyi Rong
2019-06-11 15:52   ` [dpdk-dev] [PATCH v2 47/66] net/ice/base: introduce some new macros Leyi Rong
2019-06-11 15:52   ` [dpdk-dev] [PATCH v2 48/66] net/ice/base: add init for SW recipe member rg list Leyi Rong
2019-06-11 15:52   ` [dpdk-dev] [PATCH v2 49/66] net/ice/base: code clean up Leyi Rong
2019-06-11 15:52   ` [dpdk-dev] [PATCH v2 50/66] net/ice/base: cleanup ice flex pipe files Leyi Rong
2019-06-11 15:52   ` [dpdk-dev] [PATCH v2 51/66] net/ice/base: refactor VSI node sched code Leyi Rong
2019-06-11 15:52   ` [dpdk-dev] [PATCH v2 52/66] net/ice/base: add some minor new defines Leyi Rong
2019-06-11 15:52   ` [dpdk-dev] [PATCH v2 53/66] net/ice/base: add 16-byte Flex Rx Descriptor Leyi Rong
2019-06-11 15:52   ` [dpdk-dev] [PATCH v2 54/66] net/ice/base: add vxlan/generic tunnel management Leyi Rong
2019-06-11 15:52   ` Leyi Rong [this message]
2019-06-11 15:52   ` [dpdk-dev] [PATCH v2 56/66] net/ice/base: allow forward to Q groups in switch rule Leyi Rong
2019-06-11 15:52   ` [dpdk-dev] [PATCH v2 57/66] net/ice/base: changes for reducing ice add adv rule time Leyi Rong
2019-06-11 15:52   ` [dpdk-dev] [PATCH v2 58/66] net/ice/base: deduce TSA value in the CEE mode Leyi Rong
2019-06-11 15:52   ` [dpdk-dev] [PATCH v2 59/66] net/ice/base: rework API for ice zero bitmap Leyi Rong
2019-06-11 15:52   ` [dpdk-dev] [PATCH v2 60/66] net/ice/base: rework API for ice cp bitmap Leyi Rong
2019-06-11 15:52   ` [dpdk-dev] [PATCH v2 61/66] net/ice/base: use ice zero bitmap instead of ice memset Leyi Rong
2019-06-11 15:52   ` [dpdk-dev] [PATCH v2 62/66] net/ice/base: use the specified size for ice zero bitmap Leyi Rong
2019-06-11 15:52   ` [dpdk-dev] [PATCH v2 63/66] net/ice/base: fix potential memory leak in destroy tunnel Leyi Rong
2019-06-11 15:52   ` [dpdk-dev] [PATCH v2 64/66] net/ice/base: correct NVGRE header structure Leyi Rong
2019-06-11 15:52   ` [dpdk-dev] [PATCH v2 65/66] net/ice/base: add link event defines Leyi Rong
2019-06-11 15:52   ` [dpdk-dev] [PATCH v2 66/66] net/ice/base: reduce calls to get profile associations Leyi Rong
2019-06-19 15:17   ` [dpdk-dev] [PATCH v3 00/69] shared code update Leyi Rong
2019-06-19 15:17     ` [dpdk-dev] [PATCH v3 01/69] net/ice/base: update standard extr seq to include DIR flag Leyi Rong
2019-06-19 15:17     ` [dpdk-dev] [PATCH v3 02/69] net/ice/base: add API to configure MIB Leyi Rong
2019-06-19 15:17     ` [dpdk-dev] [PATCH v3 03/69] net/ice/base: add another valid DCBx state Leyi Rong
2019-06-19 15:17     ` [dpdk-dev] [PATCH v3 04/69] net/ice/base: add more recipe commands Leyi Rong
2019-06-19 15:17     ` [dpdk-dev] [PATCH v3 05/69] net/ice/base: add funcs to create new switch recipe Leyi Rong
2019-06-19 15:17     ` [dpdk-dev] [PATCH v3 06/69] net/ice/base: programming a " Leyi Rong
2019-06-19 15:17     ` [dpdk-dev] [PATCH v3 07/69] net/ice/base: replay advanced rule after reset Leyi Rong
2019-06-19 15:17     ` [dpdk-dev] [PATCH v3 08/69] net/ice/base: code for removing advanced rule Leyi Rong
2019-06-19 15:17     ` [dpdk-dev] [PATCH v3 09/69] net/ice/base: save and post reset replay q bandwidth Leyi Rong
2019-06-19 15:17     ` [dpdk-dev] [PATCH v3 10/69] net/ice/base: rollback AVF RSS configurations Leyi Rong
2019-06-19 15:17     ` [dpdk-dev] [PATCH v3 11/69] net/ice/base: move RSS replay list Leyi Rong
2019-06-19 15:17     ` [dpdk-dev] [PATCH v3 12/69] net/ice/base: cache the data of set PHY cfg AQ in SW Leyi Rong
2019-06-19 15:17     ` [dpdk-dev] [PATCH v3 13/69] net/ice/base: refactor HW table init function Leyi Rong
2019-06-19 15:17     ` [dpdk-dev] [PATCH v3 14/69] net/ice/base: add lock around profile map list Leyi Rong
2019-06-19 15:17     ` [dpdk-dev] [PATCH v3 15/69] net/ice/base: add compatibility check for package version Leyi Rong
2019-06-19 15:17     ` [dpdk-dev] [PATCH v3 16/69] net/ice/base: add API to init FW logging Leyi Rong
2019-06-19 15:17     ` [dpdk-dev] [PATCH v3 17/69] net/ice/base: use macro instead of magic 8 Leyi Rong
2019-06-19 15:17     ` [dpdk-dev] [PATCH v3 18/69] net/ice/base: move and redefine ice debug cq API Leyi Rong
2019-06-19 15:17     ` [dpdk-dev] [PATCH v3 19/69] net/ice/base: separate out control queue lock creation Leyi Rong
2019-06-19 15:17     ` [dpdk-dev] [PATCH v3 20/69] net/ice/base: added sibling head to parse nodes Leyi Rong
2019-06-19 15:17     ` [dpdk-dev] [PATCH v3 21/69] net/ice/base: add and fix debuglogs Leyi Rong
2019-06-19 15:17     ` [dpdk-dev] [PATCH v3 22/69] net/ice/base: forbid VSI to remove unassociated ucast filter Leyi Rong
2019-06-19 15:18     ` [dpdk-dev] [PATCH v3 23/69] net/ice/base: update some defines Leyi Rong
2019-06-19 15:18     ` [dpdk-dev] [PATCH v3 24/69] net/ice/base: add hweight32 support Leyi Rong
2019-06-19 15:18     ` [dpdk-dev] [PATCH v3 25/69] net/ice/base: call out dev/func caps when printing Leyi Rong
2019-06-19 15:18     ` [dpdk-dev] [PATCH v3 26/69] net/ice/base: set the max number of TCs per port to 4 Leyi Rong
2019-06-19 15:18     ` [dpdk-dev] [PATCH v3 27/69] net/ice/base: make FDID available for FlexDescriptor Leyi Rong
2019-06-19 15:18     ` [dpdk-dev] [PATCH v3 28/69] net/ice/base: use a different debug bit for FW log Leyi Rong
2019-06-19 15:18     ` [dpdk-dev] [PATCH v3 29/69] net/ice/base: always set prefena when configuring a Rx queue Leyi Rong
2019-06-19 15:18     ` [dpdk-dev] [PATCH v3 30/69] net/ice/base: disable Tx pacing option Leyi Rong
2019-06-19 15:18     ` [dpdk-dev] [PATCH v3 31/69] net/ice/base: delete the index for chaining other recipe Leyi Rong
2019-06-19 15:18     ` [dpdk-dev] [PATCH v3 32/69] net/ice/base: cleanup update link info Leyi Rong
2019-06-19 15:18     ` [dpdk-dev] [PATCH v3 33/69] net/ice/base: add rd64 support Leyi Rong
2019-06-19 15:18     ` [dpdk-dev] [PATCH v3 34/69] net/ice/base: track HW stat registers past rollover Leyi Rong
2019-06-19 15:18     ` [dpdk-dev] [PATCH v3 35/69] net/ice/base: implement LLDP persistent settings Leyi Rong
2019-06-19 15:18     ` [dpdk-dev] [PATCH v3 36/69] net/ice/base: check new FD filter duplicate location Leyi Rong
2019-06-19 15:18     ` [dpdk-dev] [PATCH v3 37/69] net/ice/base: correct UDP/TCP PTYPE assignments Leyi Rong
2019-06-19 15:18     ` [dpdk-dev] [PATCH v3 38/69] net/ice/base: calculate rate limit burst size correctly Leyi Rong
2019-06-19 15:18     ` [dpdk-dev] [PATCH v3 39/69] net/ice/base: fix Flow Director VSI count Leyi Rong
2019-06-19 15:18     ` [dpdk-dev] [PATCH v3 40/69] net/ice/base: use more efficient structures Leyi Rong
2019-06-19 15:18     ` [dpdk-dev] [PATCH v3 41/69] net/ice/base: silent semantic parser warnings Leyi Rong
2019-06-19 15:18     ` [dpdk-dev] [PATCH v3 42/69] net/ice/base: fix for signed package download Leyi Rong
2019-06-19 15:18     ` [dpdk-dev] [PATCH v3 43/69] net/ice/base: add new API to dealloc flow entry Leyi Rong
2019-06-19 15:18     ` [dpdk-dev] [PATCH v3 44/69] net/ice/base: check RSS flow profile list Leyi Rong
2019-06-19 15:18     ` [dpdk-dev] [PATCH v3 45/69] net/ice/base: protect list add with lock Leyi Rong
2019-06-19 15:18     ` [dpdk-dev] [PATCH v3 46/69] net/ice/base: fix Rx functionality for ethertype filters Leyi Rong
2019-06-19 15:18     ` [dpdk-dev] [PATCH v3 47/69] net/ice/base: introduce some new macros Leyi Rong
2019-06-19 15:18     ` [dpdk-dev] [PATCH v3 48/69] net/ice/base: new marker to mark func parameters unused Leyi Rong
2019-06-19 15:18     ` [dpdk-dev] [PATCH v3 49/69] net/ice/base: code clean up Leyi Rong
2019-06-19 15:18     ` [dpdk-dev] [PATCH v3 50/69] net/ice/base: cleanup ice flex pipe files Leyi Rong
2019-06-19 15:18     ` [dpdk-dev] [PATCH v3 51/69] net/ice/base: refactor VSI node sched code Leyi Rong
2019-06-19 15:18     ` [dpdk-dev] [PATCH v3 52/69] net/ice/base: add some minor new defines Leyi Rong
2019-06-19 15:18     ` [dpdk-dev] [PATCH v3 53/69] net/ice/base: add vxlan/generic tunnel management Leyi Rong
2019-06-19 15:18     ` [dpdk-dev] [PATCH v3 54/69] net/ice/base: enable additional switch rules Leyi Rong
2019-06-19 15:18     ` [dpdk-dev] [PATCH v3 55/69] net/ice/base: allow forward to Q groups in switch rule Leyi Rong
2019-06-19 15:18     ` [dpdk-dev] [PATCH v3 56/69] net/ice/base: changes for reducing ice add adv rule time Leyi Rong
2019-06-19 15:18     ` [dpdk-dev] [PATCH v3 57/69] net/ice/base: deduce TSA value in the CEE mode Leyi Rong
2019-06-19 15:18     ` [dpdk-dev] [PATCH v3 58/69] net/ice/base: rework API for ice zero bitmap Leyi Rong
2019-06-19 15:18     ` [dpdk-dev] [PATCH v3 59/69] net/ice/base: rework API for ice cp bitmap Leyi Rong
2019-06-19 15:18     ` [dpdk-dev] [PATCH v3 60/69] net/ice/base: use ice zero bitmap instead of ice memset Leyi Rong
2019-06-19 15:18     ` [dpdk-dev] [PATCH v3 61/69] net/ice/base: use the specified size for ice zero bitmap Leyi Rong
2019-06-19 15:18     ` [dpdk-dev] [PATCH v3 62/69] net/ice/base: correct NVGRE header structure Leyi Rong
2019-06-19 15:18     ` [dpdk-dev] [PATCH v3 63/69] net/ice/base: reduce calls to get profile associations Leyi Rong
2019-06-19 15:18     ` [dpdk-dev] [PATCH v3 64/69] net/ice/base: fix for chained recipe switch ID index Leyi Rong
2019-06-19 15:18     ` [dpdk-dev] [PATCH v3 65/69] net/ice/base: update driver unloading field Leyi Rong
2019-06-19 15:18     ` [dpdk-dev] [PATCH v3 66/69] net/ice/base: fix for UDP and TCP related switch rules Leyi Rong
2019-06-19 15:18     ` [dpdk-dev] [PATCH v3 67/69] net/ice/base: changes in flow and profile removal Leyi Rong
2019-06-19 15:18     ` [dpdk-dev] [PATCH v3 68/69] net/ice/base: update Tx context struct Leyi Rong
2019-06-19 15:18     ` [dpdk-dev] [PATCH v3 69/69] net/ice/base: fixes for GRE Leyi Rong
2019-06-20  1:55     ` [dpdk-dev] [PATCH v3 00/69] shared code update Zhang, Qi Z
2019-06-20 20:18       ` Ferruh Yigit
2019-06-21  1:20         ` Zhang, Qi Z

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=20190611155221.2703-56-leyi.rong@intel.com \
    --to=leyi.rong@intel.com \
    --cc=dan.nowlin@intel.com \
    --cc=dev@dpdk.org \
    --cc=paul.m.stillwell.jr@intel.com \
    --cc=qi.z.zhang@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.