DPDK patches and discussions
 help / color / mirror / Atom feed
* [dpdk-dev] [PATCH 1/2] net/sfc: extend logging in MAE backend of RTE flow support
@ 2021-07-07 10:56 Ivan Malov
  2021-07-07 10:56 ` [dpdk-dev] [PATCH 2/2] net/sfc: improve " Ivan Malov
                   ` (2 more replies)
  0 siblings, 3 replies; 12+ messages in thread
From: Ivan Malov @ 2021-07-07 10:56 UTC (permalink / raw)
  To: dev; +Cc: Andrew Rybchenko, Andy Moreton

Extra log statements will provide more details to the user
in the case of errors discovered in the pattern or actions.

Signed-off-by: Ivan Malov <ivan.malov@oktetlabs.ru>
Reviewed-by: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/net/sfc/sfc_mae.c | 92 +++++++++++++++++++++++++++++++--------
 1 file changed, 74 insertions(+), 18 deletions(-)

diff --git a/drivers/net/sfc/sfc_mae.c b/drivers/net/sfc/sfc_mae.c
index 61e795db9b..56b949ddf7 100644
--- a/drivers/net/sfc/sfc_mae.c
+++ b/drivers/net/sfc/sfc_mae.c
@@ -752,6 +752,8 @@ sfc_mae_rule_process_pattern_data(struct sfc_mae_parse_ctx *ctx,
 
 	for (ethertype_idx = 0;
 	     ethertype_idx < pdata->nb_vlan_tags; ++ethertype_idx) {
+		rte_be16_t tpid_v = ethertypes[ethertype_idx].value;
+		rte_be16_t tpid_m = ethertypes[ethertype_idx].mask;
 		unsigned int tpid_idx;
 
 		/*
@@ -771,19 +773,22 @@ sfc_mae_rule_process_pattern_data(struct sfc_mae_parse_ctx *ctx,
 		}
 
 		/* Exact match is supported only. */
-		if (ethertypes[ethertype_idx].mask != RTE_BE16(0xffff)) {
+		if (tpid_m != RTE_BE16(0xffff)) {
+			sfc_info(ctx->sa, "TPID mask must be 0x0 or 0xffff; got 0x%04x",
+				 rte_be_to_cpu_16(tpid_m));
 			rc = EINVAL;
 			goto fail;
 		}
 
 		for (tpid_idx = pdata->nb_vlan_tags - ethertype_idx - 1;
 		     tpid_idx < nb_supported_tpids; ++tpid_idx) {
-			if (ethertypes[ethertype_idx].value ==
-			    supported_tpids[tpid_idx])
+			if (tpid_v == supported_tpids[tpid_idx])
 				break;
 		}
 
 		if (tpid_idx == nb_supported_tpids) {
+			sfc_info(ctx->sa, "TPID 0x%04x is unsupported",
+				 rte_be_to_cpu_16(tpid_v));
 			rc = EINVAL;
 			goto fail;
 		}
@@ -793,14 +798,19 @@ sfc_mae_rule_process_pattern_data(struct sfc_mae_parse_ctx *ctx,
 
 	if (pdata->innermost_ethertype_restriction.mask == RTE_BE16(0xffff)) {
 		struct sfc_mae_ethertype *et = &ethertypes[ethertype_idx];
+		rte_be16_t enforced_et;
+
+		enforced_et = pdata->innermost_ethertype_restriction.value;
 
 		if (et->mask == 0) {
 			et->mask = RTE_BE16(0xffff);
-			et->value =
-			    pdata->innermost_ethertype_restriction.value;
+			et->value = enforced_et;
 		} else if (et->mask != RTE_BE16(0xffff) ||
-			   et->value !=
-			   pdata->innermost_ethertype_restriction.value) {
+			   et->value != enforced_et) {
+			sfc_info(ctx->sa, "L3 EtherType must be 0x0/0x0 or 0x%04x/0xffff; got 0x%04x/0x%04x",
+				 rte_be_to_cpu_16(enforced_et),
+				 rte_be_to_cpu_16(et->value),
+				 rte_be_to_cpu_16(et->mask));
 			rc = EINVAL;
 			goto fail;
 		}
@@ -820,10 +830,14 @@ sfc_mae_rule_process_pattern_data(struct sfc_mae_parse_ctx *ctx,
 		if (pdata->l3_next_proto_mask == 0) {
 			pdata->l3_next_proto_mask = 0xff;
 			pdata->l3_next_proto_value =
-			    pdata->l3_next_proto_restriction_value;
+				pdata->l3_next_proto_restriction_value;
 		} else if (pdata->l3_next_proto_mask != 0xff ||
 			   pdata->l3_next_proto_value !=
 			   pdata->l3_next_proto_restriction_value) {
+			sfc_info(ctx->sa, "L3 next protocol must be 0x0/0x0 or 0x%02x/0xff; got 0x%02x/0x%02x",
+				 pdata->l3_next_proto_restriction_value,
+				 pdata->l3_next_proto_value,
+				 pdata->l3_next_proto_mask);
 			rc = EINVAL;
 			goto fail;
 		}
@@ -2374,6 +2388,7 @@ sfc_mae_rule_parse_action_vxlan_encap(
 	size_t next_proto_ofst = 0;
 	size_t ethertype_ofst = 0;
 	uint64_t exp_items;
+	int rc;
 
 	if (pattern == NULL) {
 		return rte_flow_error_set(error, EINVAL,
@@ -2593,14 +2608,27 @@ sfc_mae_rule_parse_action_vxlan_encap(
 	/* Take care of the masks. */
 	sfc_mae_header_force_item_masks(buf, parsed_items, nb_parsed_items);
 
-	return (spec != NULL) ? efx_mae_action_set_populate_encap(spec) : 0;
+	rc = efx_mae_action_set_populate_encap(spec);
+	if (rc != 0) {
+		rc = rte_flow_error_set(error, rc, RTE_FLOW_ERROR_TYPE_ACTION,
+				NULL, "Failed to request action ENCAP");
+	}
+
+	return rc;
 }
 
 static int
-sfc_mae_rule_parse_action_mark(const struct rte_flow_action_mark *conf,
+sfc_mae_rule_parse_action_mark(struct sfc_adapter *sa,
+			       const struct rte_flow_action_mark *conf,
 			       efx_mae_actions_t *spec)
 {
-	return efx_mae_action_set_populate_mark(spec, conf->id);
+	int rc;
+
+	rc = efx_mae_action_set_populate_mark(spec, conf->id);
+	if (rc != 0)
+		sfc_err(sa, "failed to request action MARK: %s", strerror(rc));
+
+	return rc;
 }
 
 static int
@@ -2618,10 +2646,19 @@ sfc_mae_rule_parse_action_phy_port(struct sfc_adapter *sa,
 		phy_port = conf->index;
 
 	rc = efx_mae_mport_by_phy_port(phy_port, &mport);
-	if (rc != 0)
+	if (rc != 0) {
+		sfc_err(sa, "failed to convert phys. port ID %u to m-port selector: %s",
+			phy_port, strerror(rc));
 		return rc;
+	}
 
-	return efx_mae_action_set_populate_deliver(spec, &mport);
+	rc = efx_mae_action_set_populate_deliver(spec, &mport);
+	if (rc != 0) {
+		sfc_err(sa, "failed to request action DELIVER with m-port selector 0x%08x: %s",
+			mport.sel, strerror(rc));
+	}
+
+	return rc;
 }
 
 static int
@@ -2642,10 +2679,20 @@ sfc_mae_rule_parse_action_pf_vf(struct sfc_adapter *sa,
 		vf = vf_conf->id;
 
 	rc = efx_mae_mport_by_pcie_function(encp->enc_pf, vf, &mport);
-	if (rc != 0)
+	if (rc != 0) {
+		sfc_err(sa, "failed to convert PF %u VF %d to m-port: %s",
+			encp->enc_pf, (vf != EFX_PCI_VF_INVALID) ? (int)vf : -1,
+			strerror(rc));
 		return rc;
+	}
+
+	rc = efx_mae_action_set_populate_deliver(spec, &mport);
+	if (rc != 0) {
+		sfc_err(sa, "failed to request action DELIVER with m-port selector 0x%08x: %s",
+			mport.sel, strerror(rc));
+	}
 
-	return efx_mae_action_set_populate_deliver(spec, &mport);
+	return rc;
 }
 
 static int
@@ -2666,10 +2713,19 @@ sfc_mae_rule_parse_action_port_id(struct sfc_adapter *sa,
 
 	rc = sfc_mae_switch_port_by_ethdev(mae->switch_domain_id,
 					   port_id, &mport);
-	if (rc != 0)
+	if (rc != 0) {
+		sfc_err(sa, "failed to find MAE switch port SW entry for RTE ethdev port %u: %s",
+			port_id, strerror(rc));
 		return rc;
+	}
 
-	return efx_mae_action_set_populate_deliver(spec, &mport);
+	rc = efx_mae_action_set_populate_deliver(spec, &mport);
+	if (rc != 0) {
+		sfc_err(sa, "failed to request action DELIVER with m-port selector 0x%08x: %s",
+			mport.sel, strerror(rc));
+	}
+
+	return rc;
 }
 
 static int
@@ -2729,7 +2785,7 @@ sfc_mae_rule_parse_action(struct sfc_adapter *sa,
 	case RTE_FLOW_ACTION_TYPE_MARK:
 		SFC_BUILD_SET_OVERFLOW(RTE_FLOW_ACTION_TYPE_MARK,
 				       bundle->actions_mask);
-		rc = sfc_mae_rule_parse_action_mark(action->conf, spec);
+		rc = sfc_mae_rule_parse_action_mark(sa, action->conf, spec);
 		break;
 	case RTE_FLOW_ACTION_TYPE_PHY_PORT:
 		SFC_BUILD_SET_OVERFLOW(RTE_FLOW_ACTION_TYPE_PHY_PORT,
-- 
2.20.1


^ permalink raw reply	[flat|nested] 12+ messages in thread

* [dpdk-dev] [PATCH 2/2] net/sfc: improve logging in MAE backend of RTE flow support
  2021-07-07 10:56 [dpdk-dev] [PATCH 1/2] net/sfc: extend logging in MAE backend of RTE flow support Ivan Malov
@ 2021-07-07 10:56 ` Ivan Malov
  2021-07-15 12:55   ` David Marchand
  2021-07-16  2:20 ` [dpdk-dev] [PATCH v2 0/2] RTE flow support logging improvements Ivan Malov
  2021-07-21  4:15 ` [dpdk-dev] [PATCH v3 0/2] RTE flow support logging improvements Ivan Malov
  2 siblings, 1 reply; 12+ messages in thread
From: Ivan Malov @ 2021-07-07 10:56 UTC (permalink / raw)
  To: dev; +Cc: Andrew Rybchenko, Andy Moreton

Errors detected during parsing of pattern items and actions
are reflected by setting RTE error, but the name of the bad
element is not disclosed, thus leaving the user to join the
dots themselves. Adjust the code to log missing information.

Signed-off-by: Ivan Malov <ivan.malov@oktetlabs.ru>
Reviewed-by: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/net/sfc/sfc_flow.c | 34 +++++++++++++----------
 drivers/net/sfc/sfc_flow.h | 12 ++++++--
 drivers/net/sfc/sfc_mae.c  | 57 ++++++++++++++++++++++++++++----------
 3 files changed, 71 insertions(+), 32 deletions(-)

diff --git a/drivers/net/sfc/sfc_flow.c b/drivers/net/sfc/sfc_flow.c
index 0bfd284c9e..c8dc8222dc 100644
--- a/drivers/net/sfc/sfc_flow.c
+++ b/drivers/net/sfc/sfc_flow.c
@@ -1123,84 +1123,84 @@ sfc_flow_parse_pppoex(const struct rte_flow_item *item,
 
 static const struct sfc_flow_item sfc_flow_items[] = {
 	{
-		.type = RTE_FLOW_ITEM_TYPE_VOID,
+		SFC_FLOW_ITEM(VOID),
 		.prev_layer = SFC_FLOW_ITEM_ANY_LAYER,
 		.layer = SFC_FLOW_ITEM_ANY_LAYER,
 		.ctx_type = SFC_FLOW_PARSE_CTX_FILTER,
 		.parse = sfc_flow_parse_void,
 	},
 	{
-		.type = RTE_FLOW_ITEM_TYPE_ETH,
+		SFC_FLOW_ITEM(ETH),
 		.prev_layer = SFC_FLOW_ITEM_START_LAYER,
 		.layer = SFC_FLOW_ITEM_L2,
 		.ctx_type = SFC_FLOW_PARSE_CTX_FILTER,
 		.parse = sfc_flow_parse_eth,
 	},
 	{
-		.type = RTE_FLOW_ITEM_TYPE_VLAN,
+		SFC_FLOW_ITEM(VLAN),
 		.prev_layer = SFC_FLOW_ITEM_L2,
 		.layer = SFC_FLOW_ITEM_L2,
 		.ctx_type = SFC_FLOW_PARSE_CTX_FILTER,
 		.parse = sfc_flow_parse_vlan,
 	},
 	{
-		.type = RTE_FLOW_ITEM_TYPE_PPPOED,
+		SFC_FLOW_ITEM(PPPOED),
 		.prev_layer = SFC_FLOW_ITEM_L2,
 		.layer = SFC_FLOW_ITEM_L2,
 		.ctx_type = SFC_FLOW_PARSE_CTX_FILTER,
 		.parse = sfc_flow_parse_pppoex,
 	},
 	{
-		.type = RTE_FLOW_ITEM_TYPE_PPPOES,
+		SFC_FLOW_ITEM(PPPOES),
 		.prev_layer = SFC_FLOW_ITEM_L2,
 		.layer = SFC_FLOW_ITEM_L2,
 		.ctx_type = SFC_FLOW_PARSE_CTX_FILTER,
 		.parse = sfc_flow_parse_pppoex,
 	},
 	{
-		.type = RTE_FLOW_ITEM_TYPE_IPV4,
+		SFC_FLOW_ITEM(IPV4),
 		.prev_layer = SFC_FLOW_ITEM_L2,
 		.layer = SFC_FLOW_ITEM_L3,
 		.ctx_type = SFC_FLOW_PARSE_CTX_FILTER,
 		.parse = sfc_flow_parse_ipv4,
 	},
 	{
-		.type = RTE_FLOW_ITEM_TYPE_IPV6,
+		SFC_FLOW_ITEM(IPV6),
 		.prev_layer = SFC_FLOW_ITEM_L2,
 		.layer = SFC_FLOW_ITEM_L3,
 		.ctx_type = SFC_FLOW_PARSE_CTX_FILTER,
 		.parse = sfc_flow_parse_ipv6,
 	},
 	{
-		.type = RTE_FLOW_ITEM_TYPE_TCP,
+		SFC_FLOW_ITEM(TCP),
 		.prev_layer = SFC_FLOW_ITEM_L3,
 		.layer = SFC_FLOW_ITEM_L4,
 		.ctx_type = SFC_FLOW_PARSE_CTX_FILTER,
 		.parse = sfc_flow_parse_tcp,
 	},
 	{
-		.type = RTE_FLOW_ITEM_TYPE_UDP,
+		SFC_FLOW_ITEM(UDP),
 		.prev_layer = SFC_FLOW_ITEM_L3,
 		.layer = SFC_FLOW_ITEM_L4,
 		.ctx_type = SFC_FLOW_PARSE_CTX_FILTER,
 		.parse = sfc_flow_parse_udp,
 	},
 	{
-		.type = RTE_FLOW_ITEM_TYPE_VXLAN,
+		SFC_FLOW_ITEM(VXLAN),
 		.prev_layer = SFC_FLOW_ITEM_L4,
 		.layer = SFC_FLOW_ITEM_START_LAYER,
 		.ctx_type = SFC_FLOW_PARSE_CTX_FILTER,
 		.parse = sfc_flow_parse_vxlan,
 	},
 	{
-		.type = RTE_FLOW_ITEM_TYPE_GENEVE,
+		SFC_FLOW_ITEM(GENEVE),
 		.prev_layer = SFC_FLOW_ITEM_L4,
 		.layer = SFC_FLOW_ITEM_START_LAYER,
 		.ctx_type = SFC_FLOW_PARSE_CTX_FILTER,
 		.parse = sfc_flow_parse_geneve,
 	},
 	{
-		.type = RTE_FLOW_ITEM_TYPE_NVGRE,
+		SFC_FLOW_ITEM(NVGRE),
 		.prev_layer = SFC_FLOW_ITEM_L3,
 		.layer = SFC_FLOW_ITEM_START_LAYER,
 		.ctx_type = SFC_FLOW_PARSE_CTX_FILTER,
@@ -1296,7 +1296,8 @@ sfc_flow_get_item(const struct sfc_flow_item *items,
 }
 
 int
-sfc_flow_parse_pattern(const struct sfc_flow_item *flow_items,
+sfc_flow_parse_pattern(struct sfc_adapter *sa,
+		       const struct sfc_flow_item *flow_items,
 		       unsigned int nb_flow_items,
 		       const struct rte_flow_item pattern[],
 		       struct sfc_flow_parse_ctx *parse_ctx,
@@ -1380,8 +1381,11 @@ sfc_flow_parse_pattern(const struct sfc_flow_item *flow_items,
 		}
 
 		rc = item->parse(pattern, parse_ctx, error);
-		if (rc != 0)
+		if (rc != 0) {
+			sfc_err(sa, "failed to parse item %s: %s",
+				item->name, strerror(-rc));
 			return rc;
+		}
 
 		if (item->layer != SFC_FLOW_ITEM_ANY_LAYER)
 			prev_layer = item->layer;
@@ -2477,7 +2481,7 @@ sfc_flow_parse_rte_to_filter(struct rte_eth_dev *dev,
 	ctx.type = SFC_FLOW_PARSE_CTX_FILTER;
 	ctx.filter = &spec_filter->template;
 
-	rc = sfc_flow_parse_pattern(sfc_flow_items, RTE_DIM(sfc_flow_items),
+	rc = sfc_flow_parse_pattern(sa, sfc_flow_items, RTE_DIM(sfc_flow_items),
 				    pattern, &ctx, error);
 	if (rc != 0)
 		goto fail_bad_value;
diff --git a/drivers/net/sfc/sfc_flow.h b/drivers/net/sfc/sfc_flow.h
index bd3b374d68..5b1f34aa7a 100644
--- a/drivers/net/sfc/sfc_flow.h
+++ b/drivers/net/sfc/sfc_flow.h
@@ -136,13 +136,21 @@ typedef int (sfc_flow_item_parse)(const struct rte_flow_item *item,
 
 struct sfc_flow_item {
 	enum rte_flow_item_type type;		/* Type of item */
+	const char *name;			/* Item name */
 	enum sfc_flow_item_layers layer;	/* Layer of item */
 	enum sfc_flow_item_layers prev_layer;	/* Previous layer of item */
 	enum sfc_flow_parse_ctx_type ctx_type;	/* Parse context type */
 	sfc_flow_item_parse *parse;		/* Parsing function */
 };
 
-int sfc_flow_parse_pattern(const struct sfc_flow_item *flow_items,
+#define SFC_FLOW_ITEM(_name) \
+	.type = RTE_FLOW_ITEM_TYPE_##_name,	\
+	.name = #_name
+
+struct sfc_adapter;
+
+int sfc_flow_parse_pattern(struct sfc_adapter *sa,
+			   const struct sfc_flow_item *flow_items,
 			   unsigned int nb_flow_items,
 			   const struct rte_flow_item pattern[],
 			   struct sfc_flow_parse_ctx *parse_ctx,
@@ -156,8 +164,6 @@ int sfc_flow_parse_init(const struct rte_flow_item *item,
 			unsigned int size,
 			struct rte_flow_error *error);
 
-struct sfc_adapter;
-
 void sfc_flow_init(struct sfc_adapter *sa);
 void sfc_flow_fini(struct sfc_adapter *sa);
 int sfc_flow_start(struct sfc_adapter *sa);
diff --git a/drivers/net/sfc/sfc_mae.c b/drivers/net/sfc/sfc_mae.c
index 56b949ddf7..a005d9b1a4 100644
--- a/drivers/net/sfc/sfc_mae.c
+++ b/drivers/net/sfc/sfc_mae.c
@@ -1828,7 +1828,7 @@ sfc_mae_rule_parse_item_tunnel(const struct rte_flow_item *item,
 
 static const struct sfc_flow_item sfc_flow_items[] = {
 	{
-		.type = RTE_FLOW_ITEM_TYPE_PORT_ID,
+		SFC_FLOW_ITEM(PORT_ID),
 		/*
 		 * In terms of RTE flow, this item is a META one,
 		 * and its position in the pattern is don't care.
@@ -1839,7 +1839,7 @@ static const struct sfc_flow_item sfc_flow_items[] = {
 		.parse = sfc_mae_rule_parse_item_port_id,
 	},
 	{
-		.type = RTE_FLOW_ITEM_TYPE_PHY_PORT,
+		SFC_FLOW_ITEM(PHY_PORT),
 		/*
 		 * In terms of RTE flow, this item is a META one,
 		 * and its position in the pattern is don't care.
@@ -1850,7 +1850,7 @@ static const struct sfc_flow_item sfc_flow_items[] = {
 		.parse = sfc_mae_rule_parse_item_phy_port,
 	},
 	{
-		.type = RTE_FLOW_ITEM_TYPE_PF,
+		SFC_FLOW_ITEM(PF),
 		/*
 		 * In terms of RTE flow, this item is a META one,
 		 * and its position in the pattern is don't care.
@@ -1861,7 +1861,7 @@ static const struct sfc_flow_item sfc_flow_items[] = {
 		.parse = sfc_mae_rule_parse_item_pf,
 	},
 	{
-		.type = RTE_FLOW_ITEM_TYPE_VF,
+		SFC_FLOW_ITEM(VF),
 		/*
 		 * In terms of RTE flow, this item is a META one,
 		 * and its position in the pattern is don't care.
@@ -1872,63 +1872,63 @@ static const struct sfc_flow_item sfc_flow_items[] = {
 		.parse = sfc_mae_rule_parse_item_vf,
 	},
 	{
-		.type = RTE_FLOW_ITEM_TYPE_ETH,
+		SFC_FLOW_ITEM(ETH),
 		.prev_layer = SFC_FLOW_ITEM_START_LAYER,
 		.layer = SFC_FLOW_ITEM_L2,
 		.ctx_type = SFC_FLOW_PARSE_CTX_MAE,
 		.parse = sfc_mae_rule_parse_item_eth,
 	},
 	{
-		.type = RTE_FLOW_ITEM_TYPE_VLAN,
+		SFC_FLOW_ITEM(VLAN),
 		.prev_layer = SFC_FLOW_ITEM_L2,
 		.layer = SFC_FLOW_ITEM_L2,
 		.ctx_type = SFC_FLOW_PARSE_CTX_MAE,
 		.parse = sfc_mae_rule_parse_item_vlan,
 	},
 	{
-		.type = RTE_FLOW_ITEM_TYPE_IPV4,
+		SFC_FLOW_ITEM(IPV4),
 		.prev_layer = SFC_FLOW_ITEM_L2,
 		.layer = SFC_FLOW_ITEM_L3,
 		.ctx_type = SFC_FLOW_PARSE_CTX_MAE,
 		.parse = sfc_mae_rule_parse_item_ipv4,
 	},
 	{
-		.type = RTE_FLOW_ITEM_TYPE_IPV6,
+		SFC_FLOW_ITEM(IPV6),
 		.prev_layer = SFC_FLOW_ITEM_L2,
 		.layer = SFC_FLOW_ITEM_L3,
 		.ctx_type = SFC_FLOW_PARSE_CTX_MAE,
 		.parse = sfc_mae_rule_parse_item_ipv6,
 	},
 	{
-		.type = RTE_FLOW_ITEM_TYPE_TCP,
+		SFC_FLOW_ITEM(TCP),
 		.prev_layer = SFC_FLOW_ITEM_L3,
 		.layer = SFC_FLOW_ITEM_L4,
 		.ctx_type = SFC_FLOW_PARSE_CTX_MAE,
 		.parse = sfc_mae_rule_parse_item_tcp,
 	},
 	{
-		.type = RTE_FLOW_ITEM_TYPE_UDP,
+		SFC_FLOW_ITEM(UDP),
 		.prev_layer = SFC_FLOW_ITEM_L3,
 		.layer = SFC_FLOW_ITEM_L4,
 		.ctx_type = SFC_FLOW_PARSE_CTX_MAE,
 		.parse = sfc_mae_rule_parse_item_udp,
 	},
 	{
-		.type = RTE_FLOW_ITEM_TYPE_VXLAN,
+		SFC_FLOW_ITEM(VXLAN),
 		.prev_layer = SFC_FLOW_ITEM_L4,
 		.layer = SFC_FLOW_ITEM_START_LAYER,
 		.ctx_type = SFC_FLOW_PARSE_CTX_MAE,
 		.parse = sfc_mae_rule_parse_item_tunnel,
 	},
 	{
-		.type = RTE_FLOW_ITEM_TYPE_GENEVE,
+		SFC_FLOW_ITEM(GENEVE),
 		.prev_layer = SFC_FLOW_ITEM_L4,
 		.layer = SFC_FLOW_ITEM_START_LAYER,
 		.ctx_type = SFC_FLOW_PARSE_CTX_MAE,
 		.parse = sfc_mae_rule_parse_item_tunnel,
 	},
 	{
-		.type = RTE_FLOW_ITEM_TYPE_NVGRE,
+		SFC_FLOW_ITEM(NVGRE),
 		.prev_layer = SFC_FLOW_ITEM_L3,
 		.layer = SFC_FLOW_ITEM_START_LAYER,
 		.ctx_type = SFC_FLOW_PARSE_CTX_MAE,
@@ -2137,7 +2137,7 @@ sfc_mae_rule_parse_pattern(struct sfc_adapter *sa,
 	if (rc != 0)
 		goto fail_encap_parse_init;
 
-	rc = sfc_flow_parse_pattern(sfc_flow_items, RTE_DIM(sfc_flow_items),
+	rc = sfc_flow_parse_pattern(sa, sfc_flow_items, RTE_DIM(sfc_flow_items),
 				    pattern, &ctx, error);
 	if (rc != 0)
 		goto fail_parse_pattern;
@@ -2728,6 +2728,27 @@ sfc_mae_rule_parse_action_port_id(struct sfc_adapter *sa,
 	return rc;
 }
 
+static const char * const action_names[] = {
+#define SFC_FLOW_ACTION(_name) \
+	[RTE_FLOW_ACTION_TYPE_##_name] = #_name
+
+	SFC_FLOW_ACTION(VXLAN_DECAP),
+	SFC_FLOW_ACTION(OF_POP_VLAN),
+	SFC_FLOW_ACTION(OF_PUSH_VLAN),
+	SFC_FLOW_ACTION(OF_SET_VLAN_VID),
+	SFC_FLOW_ACTION(OF_SET_VLAN_PCP),
+	SFC_FLOW_ACTION(VXLAN_ENCAP),
+	SFC_FLOW_ACTION(FLAG),
+	SFC_FLOW_ACTION(MARK),
+	SFC_FLOW_ACTION(PHY_PORT),
+	SFC_FLOW_ACTION(PF),
+	SFC_FLOW_ACTION(VF),
+	SFC_FLOW_ACTION(PORT_ID),
+	SFC_FLOW_ACTION(DROP),
+
+#undef SFC_FLOW_ACTION
+};
+
 static int
 sfc_mae_rule_parse_action(struct sfc_adapter *sa,
 			  const struct rte_flow_action *action,
@@ -2821,6 +2842,14 @@ sfc_mae_rule_parse_action(struct sfc_adapter *sa,
 	if (rc == 0) {
 		bundle->actions_mask |= (1ULL << action->type);
 	} else if (!custom_error) {
+		if (action->type < RTE_DIM(action_names)) {
+			const char *action_name = action_names[action->type];
+
+			if (action_name != NULL) {
+				sfc_err(sa, "action %s was rejected: %s",
+					action_name, strerror(rc));
+			}
+		}
 		rc = rte_flow_error_set(error, rc, RTE_FLOW_ERROR_TYPE_ACTION,
 				NULL, "Failed to request the action");
 	}
-- 
2.20.1


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [dpdk-dev] [PATCH 2/2] net/sfc: improve logging in MAE backend of RTE flow support
  2021-07-07 10:56 ` [dpdk-dev] [PATCH 2/2] net/sfc: improve " Ivan Malov
@ 2021-07-15 12:55   ` David Marchand
  2021-07-15 13:43     ` Thomas Monjalon
  0 siblings, 1 reply; 12+ messages in thread
From: David Marchand @ 2021-07-15 12:55 UTC (permalink / raw)
  To: Ivan Malov
  Cc: dev, Andrew Rybchenko, Andy Moreton, Yigit, Ferruh, Thomas Monjalon

On Wed, Jul 7, 2021 at 12:56 PM Ivan Malov <ivan.malov@oktetlabs.ru> wrote:
> diff --git a/drivers/net/sfc/sfc_flow.h b/drivers/net/sfc/sfc_flow.h
> index bd3b374d68..5b1f34aa7a 100644
> --- a/drivers/net/sfc/sfc_flow.h
> +++ b/drivers/net/sfc/sfc_flow.h
> @@ -136,13 +136,21 @@ typedef int (sfc_flow_item_parse)(const struct rte_flow_item *item,
>
>  struct sfc_flow_item {
>         enum rte_flow_item_type type;           /* Type of item */
> +       const char *name;                       /* Item name */
>         enum sfc_flow_item_layers layer;        /* Layer of item */
>         enum sfc_flow_item_layers prev_layer;   /* Previous layer of item */
>         enum sfc_flow_parse_ctx_type ctx_type;  /* Parse context type */
>         sfc_flow_item_parse *parse;             /* Parsing function */
>  };
>
> -int sfc_flow_parse_pattern(const struct sfc_flow_item *flow_items,
> +#define SFC_FLOW_ITEM(_name) \
> +       .type = RTE_FLOW_ITEM_TYPE_##_name,     \
> +       .name = #_name

Using this concatenation (same for SFC_FLOW_ACTION) confuses
devtools/parse-flow-support.sh script.

$ ./devtools/check-doc-vs-code.sh
rte_flow doc out of sync for sfc
    item
    item pf
    item phy_port
    item port_id
    item pppoes
    item tcp
    item vf
    action

Either net/sfc keeps full RTE_FLOW_x_TYPE_y form like other drivers,
or the check script must be updated (see exclude/include helpers).


-- 
David Marchand


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [dpdk-dev] [PATCH 2/2] net/sfc: improve logging in MAE backend of RTE flow support
  2021-07-15 12:55   ` David Marchand
@ 2021-07-15 13:43     ` Thomas Monjalon
  0 siblings, 0 replies; 12+ messages in thread
From: Thomas Monjalon @ 2021-07-15 13:43 UTC (permalink / raw)
  To: Ivan Malov, David Marchand
  Cc: dev, Andrew Rybchenko, Andy Moreton, Yigit, Ferruh

15/07/2021 14:55, David Marchand:
> On Wed, Jul 7, 2021 at 12:56 PM Ivan Malov <ivan.malov@oktetlabs.ru> wrote:
> > diff --git a/drivers/net/sfc/sfc_flow.h b/drivers/net/sfc/sfc_flow.h
> > index bd3b374d68..5b1f34aa7a 100644
> > --- a/drivers/net/sfc/sfc_flow.h
> > +++ b/drivers/net/sfc/sfc_flow.h
> > @@ -136,13 +136,21 @@ typedef int (sfc_flow_item_parse)(const struct rte_flow_item *item,
> >
> >  struct sfc_flow_item {
> >         enum rte_flow_item_type type;           /* Type of item */
> > +       const char *name;                       /* Item name */
> >         enum sfc_flow_item_layers layer;        /* Layer of item */
> >         enum sfc_flow_item_layers prev_layer;   /* Previous layer of item */
> >         enum sfc_flow_parse_ctx_type ctx_type;  /* Parse context type */
> >         sfc_flow_item_parse *parse;             /* Parsing function */
> >  };
> >
> > -int sfc_flow_parse_pattern(const struct sfc_flow_item *flow_items,
> > +#define SFC_FLOW_ITEM(_name) \
> > +       .type = RTE_FLOW_ITEM_TYPE_##_name,     \
> > +       .name = #_name
> 
> Using this concatenation (same for SFC_FLOW_ACTION) confuses
> devtools/parse-flow-support.sh script.
> 
> $ ./devtools/check-doc-vs-code.sh
> rte_flow doc out of sync for sfc
>     item
>     item pf
>     item phy_port
>     item port_id
>     item pppoes
>     item tcp
>     item vf
>     action
> 
> Either net/sfc keeps full RTE_FLOW_x_TYPE_y form like other drivers,
> or the check script must be updated (see exclude/include helpers).

Generating code with macros is also counter-intuitive for grep.
I think it should be avoided and keep full form RTE_FLOW_x_TYPE_y.



^ permalink raw reply	[flat|nested] 12+ messages in thread

* [dpdk-dev] [PATCH v2 0/2] RTE flow support logging improvements
  2021-07-07 10:56 [dpdk-dev] [PATCH 1/2] net/sfc: extend logging in MAE backend of RTE flow support Ivan Malov
  2021-07-07 10:56 ` [dpdk-dev] [PATCH 2/2] net/sfc: improve " Ivan Malov
@ 2021-07-16  2:20 ` Ivan Malov
  2021-07-16  2:20   ` [dpdk-dev] [PATCH v2 1/2] net/sfc: extend logging in MAE backend of RTE flow support Ivan Malov
  2021-07-16  2:20   ` [dpdk-dev] [PATCH v2 2/2] net/sfc: improve " Ivan Malov
  2021-07-21  4:15 ` [dpdk-dev] [PATCH v3 0/2] RTE flow support logging improvements Ivan Malov
  2 siblings, 2 replies; 12+ messages in thread
From: Ivan Malov @ 2021-07-16  2:20 UTC (permalink / raw)
  To: dev; +Cc: David Marchand, Thomas Monjalon

Changes in v2:
* [2/2] RTE flow item and action type macros are spelled out in full

Ivan Malov (2):
  net/sfc: extend logging in MAE backend of RTE flow support
  net/sfc: improve logging in MAE backend of RTE flow support

 drivers/net/sfc/sfc_flow.c |  34 +++++----
 drivers/net/sfc/sfc_flow.h |  12 ++-
 drivers/net/sfc/sfc_mae.c  | 149 +++++++++++++++++++++++++++++--------
 3 files changed, 145 insertions(+), 50 deletions(-)

-- 
2.20.1


^ permalink raw reply	[flat|nested] 12+ messages in thread

* [dpdk-dev] [PATCH v2 1/2] net/sfc: extend logging in MAE backend of RTE flow support
  2021-07-16  2:20 ` [dpdk-dev] [PATCH v2 0/2] RTE flow support logging improvements Ivan Malov
@ 2021-07-16  2:20   ` Ivan Malov
  2021-07-20 15:45     ` David Marchand
  2021-07-16  2:20   ` [dpdk-dev] [PATCH v2 2/2] net/sfc: improve " Ivan Malov
  1 sibling, 1 reply; 12+ messages in thread
From: Ivan Malov @ 2021-07-16  2:20 UTC (permalink / raw)
  To: dev; +Cc: David Marchand, Thomas Monjalon, Andrew Rybchenko, Andy Moreton

Extra log statements will provide more details to the user
in the case of errors discovered in the pattern or actions.

Signed-off-by: Ivan Malov <ivan.malov@oktetlabs.ru>
Reviewed-by: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/net/sfc/sfc_mae.c | 92 +++++++++++++++++++++++++++++++--------
 1 file changed, 74 insertions(+), 18 deletions(-)

diff --git a/drivers/net/sfc/sfc_mae.c b/drivers/net/sfc/sfc_mae.c
index 61e795db9b..56b949ddf7 100644
--- a/drivers/net/sfc/sfc_mae.c
+++ b/drivers/net/sfc/sfc_mae.c
@@ -752,6 +752,8 @@ sfc_mae_rule_process_pattern_data(struct sfc_mae_parse_ctx *ctx,
 
 	for (ethertype_idx = 0;
 	     ethertype_idx < pdata->nb_vlan_tags; ++ethertype_idx) {
+		rte_be16_t tpid_v = ethertypes[ethertype_idx].value;
+		rte_be16_t tpid_m = ethertypes[ethertype_idx].mask;
 		unsigned int tpid_idx;
 
 		/*
@@ -771,19 +773,22 @@ sfc_mae_rule_process_pattern_data(struct sfc_mae_parse_ctx *ctx,
 		}
 
 		/* Exact match is supported only. */
-		if (ethertypes[ethertype_idx].mask != RTE_BE16(0xffff)) {
+		if (tpid_m != RTE_BE16(0xffff)) {
+			sfc_info(ctx->sa, "TPID mask must be 0x0 or 0xffff; got 0x%04x",
+				 rte_be_to_cpu_16(tpid_m));
 			rc = EINVAL;
 			goto fail;
 		}
 
 		for (tpid_idx = pdata->nb_vlan_tags - ethertype_idx - 1;
 		     tpid_idx < nb_supported_tpids; ++tpid_idx) {
-			if (ethertypes[ethertype_idx].value ==
-			    supported_tpids[tpid_idx])
+			if (tpid_v == supported_tpids[tpid_idx])
 				break;
 		}
 
 		if (tpid_idx == nb_supported_tpids) {
+			sfc_info(ctx->sa, "TPID 0x%04x is unsupported",
+				 rte_be_to_cpu_16(tpid_v));
 			rc = EINVAL;
 			goto fail;
 		}
@@ -793,14 +798,19 @@ sfc_mae_rule_process_pattern_data(struct sfc_mae_parse_ctx *ctx,
 
 	if (pdata->innermost_ethertype_restriction.mask == RTE_BE16(0xffff)) {
 		struct sfc_mae_ethertype *et = &ethertypes[ethertype_idx];
+		rte_be16_t enforced_et;
+
+		enforced_et = pdata->innermost_ethertype_restriction.value;
 
 		if (et->mask == 0) {
 			et->mask = RTE_BE16(0xffff);
-			et->value =
-			    pdata->innermost_ethertype_restriction.value;
+			et->value = enforced_et;
 		} else if (et->mask != RTE_BE16(0xffff) ||
-			   et->value !=
-			   pdata->innermost_ethertype_restriction.value) {
+			   et->value != enforced_et) {
+			sfc_info(ctx->sa, "L3 EtherType must be 0x0/0x0 or 0x%04x/0xffff; got 0x%04x/0x%04x",
+				 rte_be_to_cpu_16(enforced_et),
+				 rte_be_to_cpu_16(et->value),
+				 rte_be_to_cpu_16(et->mask));
 			rc = EINVAL;
 			goto fail;
 		}
@@ -820,10 +830,14 @@ sfc_mae_rule_process_pattern_data(struct sfc_mae_parse_ctx *ctx,
 		if (pdata->l3_next_proto_mask == 0) {
 			pdata->l3_next_proto_mask = 0xff;
 			pdata->l3_next_proto_value =
-			    pdata->l3_next_proto_restriction_value;
+				pdata->l3_next_proto_restriction_value;
 		} else if (pdata->l3_next_proto_mask != 0xff ||
 			   pdata->l3_next_proto_value !=
 			   pdata->l3_next_proto_restriction_value) {
+			sfc_info(ctx->sa, "L3 next protocol must be 0x0/0x0 or 0x%02x/0xff; got 0x%02x/0x%02x",
+				 pdata->l3_next_proto_restriction_value,
+				 pdata->l3_next_proto_value,
+				 pdata->l3_next_proto_mask);
 			rc = EINVAL;
 			goto fail;
 		}
@@ -2374,6 +2388,7 @@ sfc_mae_rule_parse_action_vxlan_encap(
 	size_t next_proto_ofst = 0;
 	size_t ethertype_ofst = 0;
 	uint64_t exp_items;
+	int rc;
 
 	if (pattern == NULL) {
 		return rte_flow_error_set(error, EINVAL,
@@ -2593,14 +2608,27 @@ sfc_mae_rule_parse_action_vxlan_encap(
 	/* Take care of the masks. */
 	sfc_mae_header_force_item_masks(buf, parsed_items, nb_parsed_items);
 
-	return (spec != NULL) ? efx_mae_action_set_populate_encap(spec) : 0;
+	rc = efx_mae_action_set_populate_encap(spec);
+	if (rc != 0) {
+		rc = rte_flow_error_set(error, rc, RTE_FLOW_ERROR_TYPE_ACTION,
+				NULL, "Failed to request action ENCAP");
+	}
+
+	return rc;
 }
 
 static int
-sfc_mae_rule_parse_action_mark(const struct rte_flow_action_mark *conf,
+sfc_mae_rule_parse_action_mark(struct sfc_adapter *sa,
+			       const struct rte_flow_action_mark *conf,
 			       efx_mae_actions_t *spec)
 {
-	return efx_mae_action_set_populate_mark(spec, conf->id);
+	int rc;
+
+	rc = efx_mae_action_set_populate_mark(spec, conf->id);
+	if (rc != 0)
+		sfc_err(sa, "failed to request action MARK: %s", strerror(rc));
+
+	return rc;
 }
 
 static int
@@ -2618,10 +2646,19 @@ sfc_mae_rule_parse_action_phy_port(struct sfc_adapter *sa,
 		phy_port = conf->index;
 
 	rc = efx_mae_mport_by_phy_port(phy_port, &mport);
-	if (rc != 0)
+	if (rc != 0) {
+		sfc_err(sa, "failed to convert phys. port ID %u to m-port selector: %s",
+			phy_port, strerror(rc));
 		return rc;
+	}
 
-	return efx_mae_action_set_populate_deliver(spec, &mport);
+	rc = efx_mae_action_set_populate_deliver(spec, &mport);
+	if (rc != 0) {
+		sfc_err(sa, "failed to request action DELIVER with m-port selector 0x%08x: %s",
+			mport.sel, strerror(rc));
+	}
+
+	return rc;
 }
 
 static int
@@ -2642,10 +2679,20 @@ sfc_mae_rule_parse_action_pf_vf(struct sfc_adapter *sa,
 		vf = vf_conf->id;
 
 	rc = efx_mae_mport_by_pcie_function(encp->enc_pf, vf, &mport);
-	if (rc != 0)
+	if (rc != 0) {
+		sfc_err(sa, "failed to convert PF %u VF %d to m-port: %s",
+			encp->enc_pf, (vf != EFX_PCI_VF_INVALID) ? (int)vf : -1,
+			strerror(rc));
 		return rc;
+	}
+
+	rc = efx_mae_action_set_populate_deliver(spec, &mport);
+	if (rc != 0) {
+		sfc_err(sa, "failed to request action DELIVER with m-port selector 0x%08x: %s",
+			mport.sel, strerror(rc));
+	}
 
-	return efx_mae_action_set_populate_deliver(spec, &mport);
+	return rc;
 }
 
 static int
@@ -2666,10 +2713,19 @@ sfc_mae_rule_parse_action_port_id(struct sfc_adapter *sa,
 
 	rc = sfc_mae_switch_port_by_ethdev(mae->switch_domain_id,
 					   port_id, &mport);
-	if (rc != 0)
+	if (rc != 0) {
+		sfc_err(sa, "failed to find MAE switch port SW entry for RTE ethdev port %u: %s",
+			port_id, strerror(rc));
 		return rc;
+	}
 
-	return efx_mae_action_set_populate_deliver(spec, &mport);
+	rc = efx_mae_action_set_populate_deliver(spec, &mport);
+	if (rc != 0) {
+		sfc_err(sa, "failed to request action DELIVER with m-port selector 0x%08x: %s",
+			mport.sel, strerror(rc));
+	}
+
+	return rc;
 }
 
 static int
@@ -2729,7 +2785,7 @@ sfc_mae_rule_parse_action(struct sfc_adapter *sa,
 	case RTE_FLOW_ACTION_TYPE_MARK:
 		SFC_BUILD_SET_OVERFLOW(RTE_FLOW_ACTION_TYPE_MARK,
 				       bundle->actions_mask);
-		rc = sfc_mae_rule_parse_action_mark(action->conf, spec);
+		rc = sfc_mae_rule_parse_action_mark(sa, action->conf, spec);
 		break;
 	case RTE_FLOW_ACTION_TYPE_PHY_PORT:
 		SFC_BUILD_SET_OVERFLOW(RTE_FLOW_ACTION_TYPE_PHY_PORT,
-- 
2.20.1


^ permalink raw reply	[flat|nested] 12+ messages in thread

* [dpdk-dev] [PATCH v2 2/2] net/sfc: improve logging in MAE backend of RTE flow support
  2021-07-16  2:20 ` [dpdk-dev] [PATCH v2 0/2] RTE flow support logging improvements Ivan Malov
  2021-07-16  2:20   ` [dpdk-dev] [PATCH v2 1/2] net/sfc: extend logging in MAE backend of RTE flow support Ivan Malov
@ 2021-07-16  2:20   ` Ivan Malov
  1 sibling, 0 replies; 12+ messages in thread
From: Ivan Malov @ 2021-07-16  2:20 UTC (permalink / raw)
  To: dev; +Cc: David Marchand, Thomas Monjalon, Andrew Rybchenko, Andy Moreton

Errors detected during parsing of pattern items and actions
are reflected by setting RTE error, but the name of the bad
element is not disclosed, thus leaving the user to join the
dots themselves. Adjust the code to log missing information.

Signed-off-by: Ivan Malov <ivan.malov@oktetlabs.ru>
Reviewed-by: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/net/sfc/sfc_flow.c | 34 +++++++++++++----------
 drivers/net/sfc/sfc_flow.h | 12 ++++++--
 drivers/net/sfc/sfc_mae.c  | 57 ++++++++++++++++++++++++++++----------
 3 files changed, 71 insertions(+), 32 deletions(-)

diff --git a/drivers/net/sfc/sfc_flow.c b/drivers/net/sfc/sfc_flow.c
index 0bfd284c9e..88a78a1e10 100644
--- a/drivers/net/sfc/sfc_flow.c
+++ b/drivers/net/sfc/sfc_flow.c
@@ -1123,84 +1123,84 @@ sfc_flow_parse_pppoex(const struct rte_flow_item *item,
 
 static const struct sfc_flow_item sfc_flow_items[] = {
 	{
-		.type = RTE_FLOW_ITEM_TYPE_VOID,
+		SFC_FLOW_ITEM(RTE_FLOW_ITEM_TYPE_VOID),
 		.prev_layer = SFC_FLOW_ITEM_ANY_LAYER,
 		.layer = SFC_FLOW_ITEM_ANY_LAYER,
 		.ctx_type = SFC_FLOW_PARSE_CTX_FILTER,
 		.parse = sfc_flow_parse_void,
 	},
 	{
-		.type = RTE_FLOW_ITEM_TYPE_ETH,
+		SFC_FLOW_ITEM(RTE_FLOW_ITEM_TYPE_ETH),
 		.prev_layer = SFC_FLOW_ITEM_START_LAYER,
 		.layer = SFC_FLOW_ITEM_L2,
 		.ctx_type = SFC_FLOW_PARSE_CTX_FILTER,
 		.parse = sfc_flow_parse_eth,
 	},
 	{
-		.type = RTE_FLOW_ITEM_TYPE_VLAN,
+		SFC_FLOW_ITEM(RTE_FLOW_ITEM_TYPE_VLAN),
 		.prev_layer = SFC_FLOW_ITEM_L2,
 		.layer = SFC_FLOW_ITEM_L2,
 		.ctx_type = SFC_FLOW_PARSE_CTX_FILTER,
 		.parse = sfc_flow_parse_vlan,
 	},
 	{
-		.type = RTE_FLOW_ITEM_TYPE_PPPOED,
+		SFC_FLOW_ITEM(RTE_FLOW_ITEM_TYPE_PPPOED),
 		.prev_layer = SFC_FLOW_ITEM_L2,
 		.layer = SFC_FLOW_ITEM_L2,
 		.ctx_type = SFC_FLOW_PARSE_CTX_FILTER,
 		.parse = sfc_flow_parse_pppoex,
 	},
 	{
-		.type = RTE_FLOW_ITEM_TYPE_PPPOES,
+		SFC_FLOW_ITEM(RTE_FLOW_ITEM_TYPE_PPPOES),
 		.prev_layer = SFC_FLOW_ITEM_L2,
 		.layer = SFC_FLOW_ITEM_L2,
 		.ctx_type = SFC_FLOW_PARSE_CTX_FILTER,
 		.parse = sfc_flow_parse_pppoex,
 	},
 	{
-		.type = RTE_FLOW_ITEM_TYPE_IPV4,
+		SFC_FLOW_ITEM(RTE_FLOW_ITEM_TYPE_IPV4),
 		.prev_layer = SFC_FLOW_ITEM_L2,
 		.layer = SFC_FLOW_ITEM_L3,
 		.ctx_type = SFC_FLOW_PARSE_CTX_FILTER,
 		.parse = sfc_flow_parse_ipv4,
 	},
 	{
-		.type = RTE_FLOW_ITEM_TYPE_IPV6,
+		SFC_FLOW_ITEM(RTE_FLOW_ITEM_TYPE_IPV6),
 		.prev_layer = SFC_FLOW_ITEM_L2,
 		.layer = SFC_FLOW_ITEM_L3,
 		.ctx_type = SFC_FLOW_PARSE_CTX_FILTER,
 		.parse = sfc_flow_parse_ipv6,
 	},
 	{
-		.type = RTE_FLOW_ITEM_TYPE_TCP,
+		SFC_FLOW_ITEM(RTE_FLOW_ITEM_TYPE_TCP),
 		.prev_layer = SFC_FLOW_ITEM_L3,
 		.layer = SFC_FLOW_ITEM_L4,
 		.ctx_type = SFC_FLOW_PARSE_CTX_FILTER,
 		.parse = sfc_flow_parse_tcp,
 	},
 	{
-		.type = RTE_FLOW_ITEM_TYPE_UDP,
+		SFC_FLOW_ITEM(RTE_FLOW_ITEM_TYPE_UDP),
 		.prev_layer = SFC_FLOW_ITEM_L3,
 		.layer = SFC_FLOW_ITEM_L4,
 		.ctx_type = SFC_FLOW_PARSE_CTX_FILTER,
 		.parse = sfc_flow_parse_udp,
 	},
 	{
-		.type = RTE_FLOW_ITEM_TYPE_VXLAN,
+		SFC_FLOW_ITEM(RTE_FLOW_ITEM_TYPE_VXLAN),
 		.prev_layer = SFC_FLOW_ITEM_L4,
 		.layer = SFC_FLOW_ITEM_START_LAYER,
 		.ctx_type = SFC_FLOW_PARSE_CTX_FILTER,
 		.parse = sfc_flow_parse_vxlan,
 	},
 	{
-		.type = RTE_FLOW_ITEM_TYPE_GENEVE,
+		SFC_FLOW_ITEM(RTE_FLOW_ITEM_TYPE_GENEVE),
 		.prev_layer = SFC_FLOW_ITEM_L4,
 		.layer = SFC_FLOW_ITEM_START_LAYER,
 		.ctx_type = SFC_FLOW_PARSE_CTX_FILTER,
 		.parse = sfc_flow_parse_geneve,
 	},
 	{
-		.type = RTE_FLOW_ITEM_TYPE_NVGRE,
+		SFC_FLOW_ITEM(RTE_FLOW_ITEM_TYPE_NVGRE),
 		.prev_layer = SFC_FLOW_ITEM_L3,
 		.layer = SFC_FLOW_ITEM_START_LAYER,
 		.ctx_type = SFC_FLOW_PARSE_CTX_FILTER,
@@ -1296,7 +1296,8 @@ sfc_flow_get_item(const struct sfc_flow_item *items,
 }
 
 int
-sfc_flow_parse_pattern(const struct sfc_flow_item *flow_items,
+sfc_flow_parse_pattern(struct sfc_adapter *sa,
+		       const struct sfc_flow_item *flow_items,
 		       unsigned int nb_flow_items,
 		       const struct rte_flow_item pattern[],
 		       struct sfc_flow_parse_ctx *parse_ctx,
@@ -1380,8 +1381,11 @@ sfc_flow_parse_pattern(const struct sfc_flow_item *flow_items,
 		}
 
 		rc = item->parse(pattern, parse_ctx, error);
-		if (rc != 0)
+		if (rc != 0) {
+			sfc_err(sa, "failed to parse item %s: %s",
+				item->name, strerror(-rc));
 			return rc;
+		}
 
 		if (item->layer != SFC_FLOW_ITEM_ANY_LAYER)
 			prev_layer = item->layer;
@@ -2477,7 +2481,7 @@ sfc_flow_parse_rte_to_filter(struct rte_eth_dev *dev,
 	ctx.type = SFC_FLOW_PARSE_CTX_FILTER;
 	ctx.filter = &spec_filter->template;
 
-	rc = sfc_flow_parse_pattern(sfc_flow_items, RTE_DIM(sfc_flow_items),
+	rc = sfc_flow_parse_pattern(sa, sfc_flow_items, RTE_DIM(sfc_flow_items),
 				    pattern, &ctx, error);
 	if (rc != 0)
 		goto fail_bad_value;
diff --git a/drivers/net/sfc/sfc_flow.h b/drivers/net/sfc/sfc_flow.h
index bd3b374d68..5240c8006a 100644
--- a/drivers/net/sfc/sfc_flow.h
+++ b/drivers/net/sfc/sfc_flow.h
@@ -136,13 +136,21 @@ typedef int (sfc_flow_item_parse)(const struct rte_flow_item *item,
 
 struct sfc_flow_item {
 	enum rte_flow_item_type type;		/* Type of item */
+	const char *name;			/* Item name */
 	enum sfc_flow_item_layers layer;	/* Layer of item */
 	enum sfc_flow_item_layers prev_layer;	/* Previous layer of item */
 	enum sfc_flow_parse_ctx_type ctx_type;	/* Parse context type */
 	sfc_flow_item_parse *parse;		/* Parsing function */
 };
 
-int sfc_flow_parse_pattern(const struct sfc_flow_item *flow_items,
+#define SFC_FLOW_ITEM(_type) \
+	.type = _type,	\
+	.name = #_type
+
+struct sfc_adapter;
+
+int sfc_flow_parse_pattern(struct sfc_adapter *sa,
+			   const struct sfc_flow_item *flow_items,
 			   unsigned int nb_flow_items,
 			   const struct rte_flow_item pattern[],
 			   struct sfc_flow_parse_ctx *parse_ctx,
@@ -156,8 +164,6 @@ int sfc_flow_parse_init(const struct rte_flow_item *item,
 			unsigned int size,
 			struct rte_flow_error *error);
 
-struct sfc_adapter;
-
 void sfc_flow_init(struct sfc_adapter *sa);
 void sfc_flow_fini(struct sfc_adapter *sa);
 int sfc_flow_start(struct sfc_adapter *sa);
diff --git a/drivers/net/sfc/sfc_mae.c b/drivers/net/sfc/sfc_mae.c
index 56b949ddf7..ba52761335 100644
--- a/drivers/net/sfc/sfc_mae.c
+++ b/drivers/net/sfc/sfc_mae.c
@@ -1828,7 +1828,7 @@ sfc_mae_rule_parse_item_tunnel(const struct rte_flow_item *item,
 
 static const struct sfc_flow_item sfc_flow_items[] = {
 	{
-		.type = RTE_FLOW_ITEM_TYPE_PORT_ID,
+		SFC_FLOW_ITEM(RTE_FLOW_ITEM_TYPE_PORT_ID),
 		/*
 		 * In terms of RTE flow, this item is a META one,
 		 * and its position in the pattern is don't care.
@@ -1839,7 +1839,7 @@ static const struct sfc_flow_item sfc_flow_items[] = {
 		.parse = sfc_mae_rule_parse_item_port_id,
 	},
 	{
-		.type = RTE_FLOW_ITEM_TYPE_PHY_PORT,
+		SFC_FLOW_ITEM(RTE_FLOW_ITEM_TYPE_PHY_PORT),
 		/*
 		 * In terms of RTE flow, this item is a META one,
 		 * and its position in the pattern is don't care.
@@ -1850,7 +1850,7 @@ static const struct sfc_flow_item sfc_flow_items[] = {
 		.parse = sfc_mae_rule_parse_item_phy_port,
 	},
 	{
-		.type = RTE_FLOW_ITEM_TYPE_PF,
+		SFC_FLOW_ITEM(RTE_FLOW_ITEM_TYPE_PF),
 		/*
 		 * In terms of RTE flow, this item is a META one,
 		 * and its position in the pattern is don't care.
@@ -1861,7 +1861,7 @@ static const struct sfc_flow_item sfc_flow_items[] = {
 		.parse = sfc_mae_rule_parse_item_pf,
 	},
 	{
-		.type = RTE_FLOW_ITEM_TYPE_VF,
+		SFC_FLOW_ITEM(RTE_FLOW_ITEM_TYPE_VF),
 		/*
 		 * In terms of RTE flow, this item is a META one,
 		 * and its position in the pattern is don't care.
@@ -1872,63 +1872,63 @@ static const struct sfc_flow_item sfc_flow_items[] = {
 		.parse = sfc_mae_rule_parse_item_vf,
 	},
 	{
-		.type = RTE_FLOW_ITEM_TYPE_ETH,
+		SFC_FLOW_ITEM(RTE_FLOW_ITEM_TYPE_ETH),
 		.prev_layer = SFC_FLOW_ITEM_START_LAYER,
 		.layer = SFC_FLOW_ITEM_L2,
 		.ctx_type = SFC_FLOW_PARSE_CTX_MAE,
 		.parse = sfc_mae_rule_parse_item_eth,
 	},
 	{
-		.type = RTE_FLOW_ITEM_TYPE_VLAN,
+		SFC_FLOW_ITEM(RTE_FLOW_ITEM_TYPE_VLAN),
 		.prev_layer = SFC_FLOW_ITEM_L2,
 		.layer = SFC_FLOW_ITEM_L2,
 		.ctx_type = SFC_FLOW_PARSE_CTX_MAE,
 		.parse = sfc_mae_rule_parse_item_vlan,
 	},
 	{
-		.type = RTE_FLOW_ITEM_TYPE_IPV4,
+		SFC_FLOW_ITEM(RTE_FLOW_ITEM_TYPE_IPV4),
 		.prev_layer = SFC_FLOW_ITEM_L2,
 		.layer = SFC_FLOW_ITEM_L3,
 		.ctx_type = SFC_FLOW_PARSE_CTX_MAE,
 		.parse = sfc_mae_rule_parse_item_ipv4,
 	},
 	{
-		.type = RTE_FLOW_ITEM_TYPE_IPV6,
+		SFC_FLOW_ITEM(RTE_FLOW_ITEM_TYPE_IPV6),
 		.prev_layer = SFC_FLOW_ITEM_L2,
 		.layer = SFC_FLOW_ITEM_L3,
 		.ctx_type = SFC_FLOW_PARSE_CTX_MAE,
 		.parse = sfc_mae_rule_parse_item_ipv6,
 	},
 	{
-		.type = RTE_FLOW_ITEM_TYPE_TCP,
+		SFC_FLOW_ITEM(RTE_FLOW_ITEM_TYPE_TCP),
 		.prev_layer = SFC_FLOW_ITEM_L3,
 		.layer = SFC_FLOW_ITEM_L4,
 		.ctx_type = SFC_FLOW_PARSE_CTX_MAE,
 		.parse = sfc_mae_rule_parse_item_tcp,
 	},
 	{
-		.type = RTE_FLOW_ITEM_TYPE_UDP,
+		SFC_FLOW_ITEM(RTE_FLOW_ITEM_TYPE_UDP),
 		.prev_layer = SFC_FLOW_ITEM_L3,
 		.layer = SFC_FLOW_ITEM_L4,
 		.ctx_type = SFC_FLOW_PARSE_CTX_MAE,
 		.parse = sfc_mae_rule_parse_item_udp,
 	},
 	{
-		.type = RTE_FLOW_ITEM_TYPE_VXLAN,
+		SFC_FLOW_ITEM(RTE_FLOW_ITEM_TYPE_VXLAN),
 		.prev_layer = SFC_FLOW_ITEM_L4,
 		.layer = SFC_FLOW_ITEM_START_LAYER,
 		.ctx_type = SFC_FLOW_PARSE_CTX_MAE,
 		.parse = sfc_mae_rule_parse_item_tunnel,
 	},
 	{
-		.type = RTE_FLOW_ITEM_TYPE_GENEVE,
+		SFC_FLOW_ITEM(RTE_FLOW_ITEM_TYPE_GENEVE),
 		.prev_layer = SFC_FLOW_ITEM_L4,
 		.layer = SFC_FLOW_ITEM_START_LAYER,
 		.ctx_type = SFC_FLOW_PARSE_CTX_MAE,
 		.parse = sfc_mae_rule_parse_item_tunnel,
 	},
 	{
-		.type = RTE_FLOW_ITEM_TYPE_NVGRE,
+		SFC_FLOW_ITEM(RTE_FLOW_ITEM_TYPE_NVGRE),
 		.prev_layer = SFC_FLOW_ITEM_L3,
 		.layer = SFC_FLOW_ITEM_START_LAYER,
 		.ctx_type = SFC_FLOW_PARSE_CTX_MAE,
@@ -2137,7 +2137,7 @@ sfc_mae_rule_parse_pattern(struct sfc_adapter *sa,
 	if (rc != 0)
 		goto fail_encap_parse_init;
 
-	rc = sfc_flow_parse_pattern(sfc_flow_items, RTE_DIM(sfc_flow_items),
+	rc = sfc_flow_parse_pattern(sa, sfc_flow_items, RTE_DIM(sfc_flow_items),
 				    pattern, &ctx, error);
 	if (rc != 0)
 		goto fail_parse_pattern;
@@ -2728,6 +2728,27 @@ sfc_mae_rule_parse_action_port_id(struct sfc_adapter *sa,
 	return rc;
 }
 
+static const char * const action_names[] = {
+#define SFC_FLOW_ACTION(_type) \
+	[_type] = #_type
+
+	SFC_FLOW_ACTION(RTE_FLOW_ACTION_TYPE_VXLAN_DECAP),
+	SFC_FLOW_ACTION(RTE_FLOW_ACTION_TYPE_OF_POP_VLAN),
+	SFC_FLOW_ACTION(RTE_FLOW_ACTION_TYPE_OF_PUSH_VLAN),
+	SFC_FLOW_ACTION(RTE_FLOW_ACTION_TYPE_OF_SET_VLAN_VID),
+	SFC_FLOW_ACTION(RTE_FLOW_ACTION_TYPE_OF_SET_VLAN_PCP),
+	SFC_FLOW_ACTION(RTE_FLOW_ACTION_TYPE_VXLAN_ENCAP),
+	SFC_FLOW_ACTION(RTE_FLOW_ACTION_TYPE_FLAG),
+	SFC_FLOW_ACTION(RTE_FLOW_ACTION_TYPE_MARK),
+	SFC_FLOW_ACTION(RTE_FLOW_ACTION_TYPE_PHY_PORT),
+	SFC_FLOW_ACTION(RTE_FLOW_ACTION_TYPE_PF),
+	SFC_FLOW_ACTION(RTE_FLOW_ACTION_TYPE_VF),
+	SFC_FLOW_ACTION(RTE_FLOW_ACTION_TYPE_PORT_ID),
+	SFC_FLOW_ACTION(RTE_FLOW_ACTION_TYPE_DROP),
+
+#undef SFC_FLOW_ACTION
+};
+
 static int
 sfc_mae_rule_parse_action(struct sfc_adapter *sa,
 			  const struct rte_flow_action *action,
@@ -2821,6 +2842,14 @@ sfc_mae_rule_parse_action(struct sfc_adapter *sa,
 	if (rc == 0) {
 		bundle->actions_mask |= (1ULL << action->type);
 	} else if (!custom_error) {
+		if (action->type < RTE_DIM(action_names)) {
+			const char *action_name = action_names[action->type];
+
+			if (action_name != NULL) {
+				sfc_err(sa, "action %s was rejected: %s",
+					action_name, strerror(rc));
+			}
+		}
 		rc = rte_flow_error_set(error, rc, RTE_FLOW_ERROR_TYPE_ACTION,
 				NULL, "Failed to request the action");
 	}
-- 
2.20.1


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [dpdk-dev] [PATCH v2 1/2] net/sfc: extend logging in MAE backend of RTE flow support
  2021-07-16  2:20   ` [dpdk-dev] [PATCH v2 1/2] net/sfc: extend logging in MAE backend of RTE flow support Ivan Malov
@ 2021-07-20 15:45     ` David Marchand
  0 siblings, 0 replies; 12+ messages in thread
From: David Marchand @ 2021-07-20 15:45 UTC (permalink / raw)
  To: Ivan Malov; +Cc: dev, Thomas Monjalon, Andrew Rybchenko, Andy Moreton

On Fri, Jul 16, 2021 at 4:20 AM Ivan Malov <ivan.malov@oktetlabs.ru> wrote:
>
> Extra log statements will provide more details to the user
> in the case of errors discovered in the pattern or actions.
>
> Signed-off-by: Ivan Malov <ivan.malov@oktetlabs.ru>
> Reviewed-by: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
> Reviewed-by: Andy Moreton <amoreton@xilinx.com>
> ---
>  drivers/net/sfc/sfc_mae.c | 92 +++++++++++++++++++++++++++++++--------
>  1 file changed, 74 insertions(+), 18 deletions(-)
>
> diff --git a/drivers/net/sfc/sfc_mae.c b/drivers/net/sfc/sfc_mae.c
> index 61e795db9b..56b949ddf7 100644
> --- a/drivers/net/sfc/sfc_mae.c
> +++ b/drivers/net/sfc/sfc_mae.c
> @@ -752,6 +752,8 @@ sfc_mae_rule_process_pattern_data(struct sfc_mae_parse_ctx *ctx,
>
>         for (ethertype_idx = 0;
>              ethertype_idx < pdata->nb_vlan_tags; ++ethertype_idx) {
> +               rte_be16_t tpid_v = ethertypes[ethertype_idx].value;
> +               rte_be16_t tpid_m = ethertypes[ethertype_idx].mask;
>                 unsigned int tpid_idx;
>
>                 /*

Probably missing this hunk for consistency:

@@ -919,7 +919,7 @@ sfc_mae_rule_process_pattern_data(struct
sfc_mae_parse_ctx *ctx,
                 */
                enforce_tag_presence[0] = B_FALSE;

-               if (ethertypes[ethertype_idx].mask == RTE_BE16(0)) {
+               if (tpid_m == RTE_BE16(0)) {
                        if (pdata->tci_masks[ethertype_idx] == RTE_BE16(0))
                                enforce_tag_presence[ethertype_idx] = B_TRUE;



> @@ -771,19 +773,22 @@ sfc_mae_rule_process_pattern_data(struct sfc_mae_parse_ctx *ctx,
>                 }
>
>                 /* Exact match is supported only. */
> -               if (ethertypes[ethertype_idx].mask != RTE_BE16(0xffff)) {
> +               if (tpid_m != RTE_BE16(0xffff)) {
> +                       sfc_info(ctx->sa, "TPID mask must be 0x0 or 0xffff; got 0x%04x",
> +                                rte_be_to_cpu_16(tpid_m));

Is there a reason for marking some logs as info only while others are err level?


>                         rc = EINVAL;
>                         goto fail;
>                 }
>


-- 
David Marchand


^ permalink raw reply	[flat|nested] 12+ messages in thread

* [dpdk-dev] [PATCH v3 0/2] RTE flow support logging improvements
  2021-07-07 10:56 [dpdk-dev] [PATCH 1/2] net/sfc: extend logging in MAE backend of RTE flow support Ivan Malov
  2021-07-07 10:56 ` [dpdk-dev] [PATCH 2/2] net/sfc: improve " Ivan Malov
  2021-07-16  2:20 ` [dpdk-dev] [PATCH v2 0/2] RTE flow support logging improvements Ivan Malov
@ 2021-07-21  4:15 ` Ivan Malov
  2021-07-21  4:15   ` [dpdk-dev] [PATCH v3 1/2] net/sfc: extend logging in MAE backend of RTE flow support Ivan Malov
                     ` (2 more replies)
  2 siblings, 3 replies; 12+ messages in thread
From: Ivan Malov @ 2021-07-21  4:15 UTC (permalink / raw)
  To: dev; +Cc: David Marchand, Thomas Monjalon

Changes in v3:
* [1/2] Improved style consistency and revised some log levels
* [2/2] RTE flow item and action types/names use no macros now

Changes in v2:
* [2/2] RTE flow item and action type macros are spelled out in full

Ivan Malov (2):
  net/sfc: extend logging in MAE backend of RTE flow support
  net/sfc: improve logging in MAE backend of RTE flow support

 drivers/net/sfc/sfc_flow.c |  22 +++++-
 drivers/net/sfc/sfc_flow.h |   8 ++-
 drivers/net/sfc/sfc_mae.c  | 133 +++++++++++++++++++++++++++++++------
 3 files changed, 137 insertions(+), 26 deletions(-)

-- 
2.20.1


^ permalink raw reply	[flat|nested] 12+ messages in thread

* [dpdk-dev] [PATCH v3 1/2] net/sfc: extend logging in MAE backend of RTE flow support
  2021-07-21  4:15 ` [dpdk-dev] [PATCH v3 0/2] RTE flow support logging improvements Ivan Malov
@ 2021-07-21  4:15   ` Ivan Malov
  2021-07-21  4:15   ` [dpdk-dev] [PATCH v3 2/2] net/sfc: improve " Ivan Malov
  2021-07-23 21:31   ` [dpdk-dev] [PATCH v3 0/2] RTE flow support logging improvements Thomas Monjalon
  2 siblings, 0 replies; 12+ messages in thread
From: Ivan Malov @ 2021-07-21  4:15 UTC (permalink / raw)
  To: dev; +Cc: David Marchand, Thomas Monjalon, Andrew Rybchenko, Andy Moreton

Extra log statements will provide more details to the user
in the case of errors discovered in the pattern or actions.

Signed-off-by: Ivan Malov <ivan.malov@oktetlabs.ru>
Reviewed-by: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/net/sfc/sfc_mae.c | 94 +++++++++++++++++++++++++++++++--------
 1 file changed, 75 insertions(+), 19 deletions(-)

diff --git a/drivers/net/sfc/sfc_mae.c b/drivers/net/sfc/sfc_mae.c
index 61e795db9b..14fc6fe5be 100644
--- a/drivers/net/sfc/sfc_mae.c
+++ b/drivers/net/sfc/sfc_mae.c
@@ -752,6 +752,8 @@ sfc_mae_rule_process_pattern_data(struct sfc_mae_parse_ctx *ctx,
 
 	for (ethertype_idx = 0;
 	     ethertype_idx < pdata->nb_vlan_tags; ++ethertype_idx) {
+		rte_be16_t tpid_v = ethertypes[ethertype_idx].value;
+		rte_be16_t tpid_m = ethertypes[ethertype_idx].mask;
 		unsigned int tpid_idx;
 
 		/*
@@ -761,7 +763,7 @@ sfc_mae_rule_process_pattern_data(struct sfc_mae_parse_ctx *ctx,
 		 */
 		enforce_tag_presence[0] = B_FALSE;
 
-		if (ethertypes[ethertype_idx].mask == RTE_BE16(0)) {
+		if (tpid_m == RTE_BE16(0)) {
 			if (pdata->tci_masks[ethertype_idx] == RTE_BE16(0))
 				enforce_tag_presence[ethertype_idx] = B_TRUE;
 
@@ -771,19 +773,22 @@ sfc_mae_rule_process_pattern_data(struct sfc_mae_parse_ctx *ctx,
 		}
 
 		/* Exact match is supported only. */
-		if (ethertypes[ethertype_idx].mask != RTE_BE16(0xffff)) {
+		if (tpid_m != RTE_BE16(0xffff)) {
+			sfc_err(ctx->sa, "TPID mask must be 0x0 or 0xffff; got 0x%04x",
+				rte_be_to_cpu_16(tpid_m));
 			rc = EINVAL;
 			goto fail;
 		}
 
 		for (tpid_idx = pdata->nb_vlan_tags - ethertype_idx - 1;
 		     tpid_idx < nb_supported_tpids; ++tpid_idx) {
-			if (ethertypes[ethertype_idx].value ==
-			    supported_tpids[tpid_idx])
+			if (tpid_v == supported_tpids[tpid_idx])
 				break;
 		}
 
 		if (tpid_idx == nb_supported_tpids) {
+			sfc_err(ctx->sa, "TPID 0x%04x is unsupported",
+				rte_be_to_cpu_16(tpid_v));
 			rc = EINVAL;
 			goto fail;
 		}
@@ -793,14 +798,19 @@ sfc_mae_rule_process_pattern_data(struct sfc_mae_parse_ctx *ctx,
 
 	if (pdata->innermost_ethertype_restriction.mask == RTE_BE16(0xffff)) {
 		struct sfc_mae_ethertype *et = &ethertypes[ethertype_idx];
+		rte_be16_t enforced_et;
+
+		enforced_et = pdata->innermost_ethertype_restriction.value;
 
 		if (et->mask == 0) {
 			et->mask = RTE_BE16(0xffff);
-			et->value =
-			    pdata->innermost_ethertype_restriction.value;
+			et->value = enforced_et;
 		} else if (et->mask != RTE_BE16(0xffff) ||
-			   et->value !=
-			   pdata->innermost_ethertype_restriction.value) {
+			   et->value != enforced_et) {
+			sfc_err(ctx->sa, "L3 EtherType must be 0x0/0x0 or 0x%04x/0xffff; got 0x%04x/0x%04x",
+				rte_be_to_cpu_16(enforced_et),
+				rte_be_to_cpu_16(et->value),
+				rte_be_to_cpu_16(et->mask));
 			rc = EINVAL;
 			goto fail;
 		}
@@ -820,10 +830,14 @@ sfc_mae_rule_process_pattern_data(struct sfc_mae_parse_ctx *ctx,
 		if (pdata->l3_next_proto_mask == 0) {
 			pdata->l3_next_proto_mask = 0xff;
 			pdata->l3_next_proto_value =
-			    pdata->l3_next_proto_restriction_value;
+				pdata->l3_next_proto_restriction_value;
 		} else if (pdata->l3_next_proto_mask != 0xff ||
 			   pdata->l3_next_proto_value !=
 			   pdata->l3_next_proto_restriction_value) {
+			sfc_err(ctx->sa, "L3 next protocol must be 0x0/0x0 or 0x%02x/0xff; got 0x%02x/0x%02x",
+				pdata->l3_next_proto_restriction_value,
+				pdata->l3_next_proto_value,
+				pdata->l3_next_proto_mask);
 			rc = EINVAL;
 			goto fail;
 		}
@@ -2374,6 +2388,7 @@ sfc_mae_rule_parse_action_vxlan_encap(
 	size_t next_proto_ofst = 0;
 	size_t ethertype_ofst = 0;
 	uint64_t exp_items;
+	int rc;
 
 	if (pattern == NULL) {
 		return rte_flow_error_set(error, EINVAL,
@@ -2593,14 +2608,27 @@ sfc_mae_rule_parse_action_vxlan_encap(
 	/* Take care of the masks. */
 	sfc_mae_header_force_item_masks(buf, parsed_items, nb_parsed_items);
 
-	return (spec != NULL) ? efx_mae_action_set_populate_encap(spec) : 0;
+	rc = efx_mae_action_set_populate_encap(spec);
+	if (rc != 0) {
+		rc = rte_flow_error_set(error, rc, RTE_FLOW_ERROR_TYPE_ACTION,
+				NULL, "failed to request action ENCAP");
+	}
+
+	return rc;
 }
 
 static int
-sfc_mae_rule_parse_action_mark(const struct rte_flow_action_mark *conf,
+sfc_mae_rule_parse_action_mark(struct sfc_adapter *sa,
+			       const struct rte_flow_action_mark *conf,
 			       efx_mae_actions_t *spec)
 {
-	return efx_mae_action_set_populate_mark(spec, conf->id);
+	int rc;
+
+	rc = efx_mae_action_set_populate_mark(spec, conf->id);
+	if (rc != 0)
+		sfc_err(sa, "failed to request action MARK: %s", strerror(rc));
+
+	return rc;
 }
 
 static int
@@ -2618,10 +2646,19 @@ sfc_mae_rule_parse_action_phy_port(struct sfc_adapter *sa,
 		phy_port = conf->index;
 
 	rc = efx_mae_mport_by_phy_port(phy_port, &mport);
-	if (rc != 0)
+	if (rc != 0) {
+		sfc_err(sa, "failed to convert phys. port ID %u to m-port selector: %s",
+			phy_port, strerror(rc));
 		return rc;
+	}
 
-	return efx_mae_action_set_populate_deliver(spec, &mport);
+	rc = efx_mae_action_set_populate_deliver(spec, &mport);
+	if (rc != 0) {
+		sfc_err(sa, "failed to request action DELIVER with m-port selector 0x%08x: %s",
+			mport.sel, strerror(rc));
+	}
+
+	return rc;
 }
 
 static int
@@ -2642,10 +2679,20 @@ sfc_mae_rule_parse_action_pf_vf(struct sfc_adapter *sa,
 		vf = vf_conf->id;
 
 	rc = efx_mae_mport_by_pcie_function(encp->enc_pf, vf, &mport);
-	if (rc != 0)
+	if (rc != 0) {
+		sfc_err(sa, "failed to convert PF %u VF %d to m-port: %s",
+			encp->enc_pf, (vf != EFX_PCI_VF_INVALID) ? (int)vf : -1,
+			strerror(rc));
 		return rc;
+	}
+
+	rc = efx_mae_action_set_populate_deliver(spec, &mport);
+	if (rc != 0) {
+		sfc_err(sa, "failed to request action DELIVER with m-port selector 0x%08x: %s",
+			mport.sel, strerror(rc));
+	}
 
-	return efx_mae_action_set_populate_deliver(spec, &mport);
+	return rc;
 }
 
 static int
@@ -2666,10 +2713,19 @@ sfc_mae_rule_parse_action_port_id(struct sfc_adapter *sa,
 
 	rc = sfc_mae_switch_port_by_ethdev(mae->switch_domain_id,
 					   port_id, &mport);
-	if (rc != 0)
+	if (rc != 0) {
+		sfc_err(sa, "failed to find MAE switch port SW entry for RTE ethdev port %u: %s",
+			port_id, strerror(rc));
 		return rc;
+	}
 
-	return efx_mae_action_set_populate_deliver(spec, &mport);
+	rc = efx_mae_action_set_populate_deliver(spec, &mport);
+	if (rc != 0) {
+		sfc_err(sa, "failed to request action DELIVER with m-port selector 0x%08x: %s",
+			mport.sel, strerror(rc));
+	}
+
+	return rc;
 }
 
 static int
@@ -2729,7 +2785,7 @@ sfc_mae_rule_parse_action(struct sfc_adapter *sa,
 	case RTE_FLOW_ACTION_TYPE_MARK:
 		SFC_BUILD_SET_OVERFLOW(RTE_FLOW_ACTION_TYPE_MARK,
 				       bundle->actions_mask);
-		rc = sfc_mae_rule_parse_action_mark(action->conf, spec);
+		rc = sfc_mae_rule_parse_action_mark(sa, action->conf, spec);
 		break;
 	case RTE_FLOW_ACTION_TYPE_PHY_PORT:
 		SFC_BUILD_SET_OVERFLOW(RTE_FLOW_ACTION_TYPE_PHY_PORT,
-- 
2.20.1


^ permalink raw reply	[flat|nested] 12+ messages in thread

* [dpdk-dev] [PATCH v3 2/2] net/sfc: improve logging in MAE backend of RTE flow support
  2021-07-21  4:15 ` [dpdk-dev] [PATCH v3 0/2] RTE flow support logging improvements Ivan Malov
  2021-07-21  4:15   ` [dpdk-dev] [PATCH v3 1/2] net/sfc: extend logging in MAE backend of RTE flow support Ivan Malov
@ 2021-07-21  4:15   ` Ivan Malov
  2021-07-23 21:31   ` [dpdk-dev] [PATCH v3 0/2] RTE flow support logging improvements Thomas Monjalon
  2 siblings, 0 replies; 12+ messages in thread
From: Ivan Malov @ 2021-07-21  4:15 UTC (permalink / raw)
  To: dev; +Cc: David Marchand, Thomas Monjalon, Andrew Rybchenko, Andy Moreton

Errors detected during parsing of pattern items and actions
are reflected by setting RTE error, but the name of the bad
element is not disclosed, thus leaving the user to join the
dots themselves. Adjust the code to log missing information.

Signed-off-by: Ivan Malov <ivan.malov@oktetlabs.ru>
Reviewed-by: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
 drivers/net/sfc/sfc_flow.c | 22 ++++++++++++++++++---
 drivers/net/sfc/sfc_flow.h |  8 +++++---
 drivers/net/sfc/sfc_mae.c  | 39 +++++++++++++++++++++++++++++++++++++-
 3 files changed, 62 insertions(+), 7 deletions(-)

diff --git a/drivers/net/sfc/sfc_flow.c b/drivers/net/sfc/sfc_flow.c
index 0bfd284c9e..20b9e48ba1 100644
--- a/drivers/net/sfc/sfc_flow.c
+++ b/drivers/net/sfc/sfc_flow.c
@@ -1124,6 +1124,7 @@ sfc_flow_parse_pppoex(const struct rte_flow_item *item,
 static const struct sfc_flow_item sfc_flow_items[] = {
 	{
 		.type = RTE_FLOW_ITEM_TYPE_VOID,
+		.name = "VOID",
 		.prev_layer = SFC_FLOW_ITEM_ANY_LAYER,
 		.layer = SFC_FLOW_ITEM_ANY_LAYER,
 		.ctx_type = SFC_FLOW_PARSE_CTX_FILTER,
@@ -1131,6 +1132,7 @@ static const struct sfc_flow_item sfc_flow_items[] = {
 	},
 	{
 		.type = RTE_FLOW_ITEM_TYPE_ETH,
+		.name = "ETH",
 		.prev_layer = SFC_FLOW_ITEM_START_LAYER,
 		.layer = SFC_FLOW_ITEM_L2,
 		.ctx_type = SFC_FLOW_PARSE_CTX_FILTER,
@@ -1138,6 +1140,7 @@ static const struct sfc_flow_item sfc_flow_items[] = {
 	},
 	{
 		.type = RTE_FLOW_ITEM_TYPE_VLAN,
+		.name = "VLAN",
 		.prev_layer = SFC_FLOW_ITEM_L2,
 		.layer = SFC_FLOW_ITEM_L2,
 		.ctx_type = SFC_FLOW_PARSE_CTX_FILTER,
@@ -1145,6 +1148,7 @@ static const struct sfc_flow_item sfc_flow_items[] = {
 	},
 	{
 		.type = RTE_FLOW_ITEM_TYPE_PPPOED,
+		.name = "PPPOED",
 		.prev_layer = SFC_FLOW_ITEM_L2,
 		.layer = SFC_FLOW_ITEM_L2,
 		.ctx_type = SFC_FLOW_PARSE_CTX_FILTER,
@@ -1152,6 +1156,7 @@ static const struct sfc_flow_item sfc_flow_items[] = {
 	},
 	{
 		.type = RTE_FLOW_ITEM_TYPE_PPPOES,
+		.name = "PPPOES",
 		.prev_layer = SFC_FLOW_ITEM_L2,
 		.layer = SFC_FLOW_ITEM_L2,
 		.ctx_type = SFC_FLOW_PARSE_CTX_FILTER,
@@ -1159,6 +1164,7 @@ static const struct sfc_flow_item sfc_flow_items[] = {
 	},
 	{
 		.type = RTE_FLOW_ITEM_TYPE_IPV4,
+		.name = "IPV4",
 		.prev_layer = SFC_FLOW_ITEM_L2,
 		.layer = SFC_FLOW_ITEM_L3,
 		.ctx_type = SFC_FLOW_PARSE_CTX_FILTER,
@@ -1166,6 +1172,7 @@ static const struct sfc_flow_item sfc_flow_items[] = {
 	},
 	{
 		.type = RTE_FLOW_ITEM_TYPE_IPV6,
+		.name = "IPV6",
 		.prev_layer = SFC_FLOW_ITEM_L2,
 		.layer = SFC_FLOW_ITEM_L3,
 		.ctx_type = SFC_FLOW_PARSE_CTX_FILTER,
@@ -1173,6 +1180,7 @@ static const struct sfc_flow_item sfc_flow_items[] = {
 	},
 	{
 		.type = RTE_FLOW_ITEM_TYPE_TCP,
+		.name = "TCP",
 		.prev_layer = SFC_FLOW_ITEM_L3,
 		.layer = SFC_FLOW_ITEM_L4,
 		.ctx_type = SFC_FLOW_PARSE_CTX_FILTER,
@@ -1180,6 +1188,7 @@ static const struct sfc_flow_item sfc_flow_items[] = {
 	},
 	{
 		.type = RTE_FLOW_ITEM_TYPE_UDP,
+		.name = "UDP",
 		.prev_layer = SFC_FLOW_ITEM_L3,
 		.layer = SFC_FLOW_ITEM_L4,
 		.ctx_type = SFC_FLOW_PARSE_CTX_FILTER,
@@ -1187,6 +1196,7 @@ static const struct sfc_flow_item sfc_flow_items[] = {
 	},
 	{
 		.type = RTE_FLOW_ITEM_TYPE_VXLAN,
+		.name = "VXLAN",
 		.prev_layer = SFC_FLOW_ITEM_L4,
 		.layer = SFC_FLOW_ITEM_START_LAYER,
 		.ctx_type = SFC_FLOW_PARSE_CTX_FILTER,
@@ -1194,6 +1204,7 @@ static const struct sfc_flow_item sfc_flow_items[] = {
 	},
 	{
 		.type = RTE_FLOW_ITEM_TYPE_GENEVE,
+		.name = "GENEVE",
 		.prev_layer = SFC_FLOW_ITEM_L4,
 		.layer = SFC_FLOW_ITEM_START_LAYER,
 		.ctx_type = SFC_FLOW_PARSE_CTX_FILTER,
@@ -1201,6 +1212,7 @@ static const struct sfc_flow_item sfc_flow_items[] = {
 	},
 	{
 		.type = RTE_FLOW_ITEM_TYPE_NVGRE,
+		.name = "NVGRE",
 		.prev_layer = SFC_FLOW_ITEM_L3,
 		.layer = SFC_FLOW_ITEM_START_LAYER,
 		.ctx_type = SFC_FLOW_PARSE_CTX_FILTER,
@@ -1296,7 +1308,8 @@ sfc_flow_get_item(const struct sfc_flow_item *items,
 }
 
 int
-sfc_flow_parse_pattern(const struct sfc_flow_item *flow_items,
+sfc_flow_parse_pattern(struct sfc_adapter *sa,
+		       const struct sfc_flow_item *flow_items,
 		       unsigned int nb_flow_items,
 		       const struct rte_flow_item pattern[],
 		       struct sfc_flow_parse_ctx *parse_ctx,
@@ -1380,8 +1393,11 @@ sfc_flow_parse_pattern(const struct sfc_flow_item *flow_items,
 		}
 
 		rc = item->parse(pattern, parse_ctx, error);
-		if (rc != 0)
+		if (rc != 0) {
+			sfc_err(sa, "failed to parse item %s: %s",
+				item->name, strerror(-rc));
 			return rc;
+		}
 
 		if (item->layer != SFC_FLOW_ITEM_ANY_LAYER)
 			prev_layer = item->layer;
@@ -2477,7 +2493,7 @@ sfc_flow_parse_rte_to_filter(struct rte_eth_dev *dev,
 	ctx.type = SFC_FLOW_PARSE_CTX_FILTER;
 	ctx.filter = &spec_filter->template;
 
-	rc = sfc_flow_parse_pattern(sfc_flow_items, RTE_DIM(sfc_flow_items),
+	rc = sfc_flow_parse_pattern(sa, sfc_flow_items, RTE_DIM(sfc_flow_items),
 				    pattern, &ctx, error);
 	if (rc != 0)
 		goto fail_bad_value;
diff --git a/drivers/net/sfc/sfc_flow.h b/drivers/net/sfc/sfc_flow.h
index bd3b374d68..ab1097ddff 100644
--- a/drivers/net/sfc/sfc_flow.h
+++ b/drivers/net/sfc/sfc_flow.h
@@ -136,13 +136,17 @@ typedef int (sfc_flow_item_parse)(const struct rte_flow_item *item,
 
 struct sfc_flow_item {
 	enum rte_flow_item_type type;		/* Type of item */
+	const char *name;			/* Item name */
 	enum sfc_flow_item_layers layer;	/* Layer of item */
 	enum sfc_flow_item_layers prev_layer;	/* Previous layer of item */
 	enum sfc_flow_parse_ctx_type ctx_type;	/* Parse context type */
 	sfc_flow_item_parse *parse;		/* Parsing function */
 };
 
-int sfc_flow_parse_pattern(const struct sfc_flow_item *flow_items,
+struct sfc_adapter;
+
+int sfc_flow_parse_pattern(struct sfc_adapter *sa,
+			   const struct sfc_flow_item *flow_items,
 			   unsigned int nb_flow_items,
 			   const struct rte_flow_item pattern[],
 			   struct sfc_flow_parse_ctx *parse_ctx,
@@ -156,8 +160,6 @@ int sfc_flow_parse_init(const struct rte_flow_item *item,
 			unsigned int size,
 			struct rte_flow_error *error);
 
-struct sfc_adapter;
-
 void sfc_flow_init(struct sfc_adapter *sa);
 void sfc_flow_fini(struct sfc_adapter *sa);
 int sfc_flow_start(struct sfc_adapter *sa);
diff --git a/drivers/net/sfc/sfc_mae.c b/drivers/net/sfc/sfc_mae.c
index 14fc6fe5be..e6ad6085a6 100644
--- a/drivers/net/sfc/sfc_mae.c
+++ b/drivers/net/sfc/sfc_mae.c
@@ -1829,6 +1829,7 @@ sfc_mae_rule_parse_item_tunnel(const struct rte_flow_item *item,
 static const struct sfc_flow_item sfc_flow_items[] = {
 	{
 		.type = RTE_FLOW_ITEM_TYPE_PORT_ID,
+		.name = "PORT_ID",
 		/*
 		 * In terms of RTE flow, this item is a META one,
 		 * and its position in the pattern is don't care.
@@ -1840,6 +1841,7 @@ static const struct sfc_flow_item sfc_flow_items[] = {
 	},
 	{
 		.type = RTE_FLOW_ITEM_TYPE_PHY_PORT,
+		.name = "PHY_PORT",
 		/*
 		 * In terms of RTE flow, this item is a META one,
 		 * and its position in the pattern is don't care.
@@ -1851,6 +1853,7 @@ static const struct sfc_flow_item sfc_flow_items[] = {
 	},
 	{
 		.type = RTE_FLOW_ITEM_TYPE_PF,
+		.name = "PF",
 		/*
 		 * In terms of RTE flow, this item is a META one,
 		 * and its position in the pattern is don't care.
@@ -1862,6 +1865,7 @@ static const struct sfc_flow_item sfc_flow_items[] = {
 	},
 	{
 		.type = RTE_FLOW_ITEM_TYPE_VF,
+		.name = "VF",
 		/*
 		 * In terms of RTE flow, this item is a META one,
 		 * and its position in the pattern is don't care.
@@ -1873,6 +1877,7 @@ static const struct sfc_flow_item sfc_flow_items[] = {
 	},
 	{
 		.type = RTE_FLOW_ITEM_TYPE_ETH,
+		.name = "ETH",
 		.prev_layer = SFC_FLOW_ITEM_START_LAYER,
 		.layer = SFC_FLOW_ITEM_L2,
 		.ctx_type = SFC_FLOW_PARSE_CTX_MAE,
@@ -1880,6 +1885,7 @@ static const struct sfc_flow_item sfc_flow_items[] = {
 	},
 	{
 		.type = RTE_FLOW_ITEM_TYPE_VLAN,
+		.name = "VLAN",
 		.prev_layer = SFC_FLOW_ITEM_L2,
 		.layer = SFC_FLOW_ITEM_L2,
 		.ctx_type = SFC_FLOW_PARSE_CTX_MAE,
@@ -1887,6 +1893,7 @@ static const struct sfc_flow_item sfc_flow_items[] = {
 	},
 	{
 		.type = RTE_FLOW_ITEM_TYPE_IPV4,
+		.name = "IPV4",
 		.prev_layer = SFC_FLOW_ITEM_L2,
 		.layer = SFC_FLOW_ITEM_L3,
 		.ctx_type = SFC_FLOW_PARSE_CTX_MAE,
@@ -1894,6 +1901,7 @@ static const struct sfc_flow_item sfc_flow_items[] = {
 	},
 	{
 		.type = RTE_FLOW_ITEM_TYPE_IPV6,
+		.name = "IPV6",
 		.prev_layer = SFC_FLOW_ITEM_L2,
 		.layer = SFC_FLOW_ITEM_L3,
 		.ctx_type = SFC_FLOW_PARSE_CTX_MAE,
@@ -1901,6 +1909,7 @@ static const struct sfc_flow_item sfc_flow_items[] = {
 	},
 	{
 		.type = RTE_FLOW_ITEM_TYPE_TCP,
+		.name = "TCP",
 		.prev_layer = SFC_FLOW_ITEM_L3,
 		.layer = SFC_FLOW_ITEM_L4,
 		.ctx_type = SFC_FLOW_PARSE_CTX_MAE,
@@ -1908,6 +1917,7 @@ static const struct sfc_flow_item sfc_flow_items[] = {
 	},
 	{
 		.type = RTE_FLOW_ITEM_TYPE_UDP,
+		.name = "UDP",
 		.prev_layer = SFC_FLOW_ITEM_L3,
 		.layer = SFC_FLOW_ITEM_L4,
 		.ctx_type = SFC_FLOW_PARSE_CTX_MAE,
@@ -1915,6 +1925,7 @@ static const struct sfc_flow_item sfc_flow_items[] = {
 	},
 	{
 		.type = RTE_FLOW_ITEM_TYPE_VXLAN,
+		.name = "VXLAN",
 		.prev_layer = SFC_FLOW_ITEM_L4,
 		.layer = SFC_FLOW_ITEM_START_LAYER,
 		.ctx_type = SFC_FLOW_PARSE_CTX_MAE,
@@ -1922,6 +1933,7 @@ static const struct sfc_flow_item sfc_flow_items[] = {
 	},
 	{
 		.type = RTE_FLOW_ITEM_TYPE_GENEVE,
+		.name = "GENEVE",
 		.prev_layer = SFC_FLOW_ITEM_L4,
 		.layer = SFC_FLOW_ITEM_START_LAYER,
 		.ctx_type = SFC_FLOW_PARSE_CTX_MAE,
@@ -1929,6 +1941,7 @@ static const struct sfc_flow_item sfc_flow_items[] = {
 	},
 	{
 		.type = RTE_FLOW_ITEM_TYPE_NVGRE,
+		.name = "NVGRE",
 		.prev_layer = SFC_FLOW_ITEM_L3,
 		.layer = SFC_FLOW_ITEM_START_LAYER,
 		.ctx_type = SFC_FLOW_PARSE_CTX_MAE,
@@ -2137,7 +2150,7 @@ sfc_mae_rule_parse_pattern(struct sfc_adapter *sa,
 	if (rc != 0)
 		goto fail_encap_parse_init;
 
-	rc = sfc_flow_parse_pattern(sfc_flow_items, RTE_DIM(sfc_flow_items),
+	rc = sfc_flow_parse_pattern(sa, sfc_flow_items, RTE_DIM(sfc_flow_items),
 				    pattern, &ctx, error);
 	if (rc != 0)
 		goto fail_parse_pattern;
@@ -2728,6 +2741,22 @@ sfc_mae_rule_parse_action_port_id(struct sfc_adapter *sa,
 	return rc;
 }
 
+static const char * const action_names[] = {
+	[RTE_FLOW_ACTION_TYPE_VXLAN_DECAP] = "VXLAN_DECAP",
+	[RTE_FLOW_ACTION_TYPE_OF_POP_VLAN] = "OF_POP_VLAN",
+	[RTE_FLOW_ACTION_TYPE_OF_PUSH_VLAN] = "OF_PUSH_VLAN",
+	[RTE_FLOW_ACTION_TYPE_OF_SET_VLAN_VID] = "OF_SET_VLAN_VID",
+	[RTE_FLOW_ACTION_TYPE_OF_SET_VLAN_PCP] = "OF_SET_VLAN_PCP",
+	[RTE_FLOW_ACTION_TYPE_VXLAN_ENCAP] = "VXLAN_ENCAP",
+	[RTE_FLOW_ACTION_TYPE_FLAG] = "FLAG",
+	[RTE_FLOW_ACTION_TYPE_MARK] = "MARK",
+	[RTE_FLOW_ACTION_TYPE_PHY_PORT] = "PHY_PORT",
+	[RTE_FLOW_ACTION_TYPE_PF] = "PF",
+	[RTE_FLOW_ACTION_TYPE_VF] = "VF",
+	[RTE_FLOW_ACTION_TYPE_PORT_ID] = "PORT_ID",
+	[RTE_FLOW_ACTION_TYPE_DROP] = "DROP",
+};
+
 static int
 sfc_mae_rule_parse_action(struct sfc_adapter *sa,
 			  const struct rte_flow_action *action,
@@ -2821,6 +2850,14 @@ sfc_mae_rule_parse_action(struct sfc_adapter *sa,
 	if (rc == 0) {
 		bundle->actions_mask |= (1ULL << action->type);
 	} else if (!custom_error) {
+		if (action->type < RTE_DIM(action_names)) {
+			const char *action_name = action_names[action->type];
+
+			if (action_name != NULL) {
+				sfc_err(sa, "action %s was rejected: %s",
+					action_name, strerror(rc));
+			}
+		}
 		rc = rte_flow_error_set(error, rc, RTE_FLOW_ERROR_TYPE_ACTION,
 				NULL, "Failed to request the action");
 	}
-- 
2.20.1


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [dpdk-dev] [PATCH v3 0/2] RTE flow support logging improvements
  2021-07-21  4:15 ` [dpdk-dev] [PATCH v3 0/2] RTE flow support logging improvements Ivan Malov
  2021-07-21  4:15   ` [dpdk-dev] [PATCH v3 1/2] net/sfc: extend logging in MAE backend of RTE flow support Ivan Malov
  2021-07-21  4:15   ` [dpdk-dev] [PATCH v3 2/2] net/sfc: improve " Ivan Malov
@ 2021-07-23 21:31   ` Thomas Monjalon
  2 siblings, 0 replies; 12+ messages in thread
From: Thomas Monjalon @ 2021-07-23 21:31 UTC (permalink / raw)
  To: Ivan Malov; +Cc: dev, David Marchand

21/07/2021 06:15, Ivan Malov:
> Changes in v3:
> * [1/2] Improved style consistency and revised some log levels
> * [2/2] RTE flow item and action types/names use no macros now
> 
> Changes in v2:
> * [2/2] RTE flow item and action type macros are spelled out in full
> 
> Ivan Malov (2):
>   net/sfc: extend logging in MAE backend of RTE flow support
>   net/sfc: improve logging in MAE backend of RTE flow support

Applied, thanks.



^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2021-07-23 21:31 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-07-07 10:56 [dpdk-dev] [PATCH 1/2] net/sfc: extend logging in MAE backend of RTE flow support Ivan Malov
2021-07-07 10:56 ` [dpdk-dev] [PATCH 2/2] net/sfc: improve " Ivan Malov
2021-07-15 12:55   ` David Marchand
2021-07-15 13:43     ` Thomas Monjalon
2021-07-16  2:20 ` [dpdk-dev] [PATCH v2 0/2] RTE flow support logging improvements Ivan Malov
2021-07-16  2:20   ` [dpdk-dev] [PATCH v2 1/2] net/sfc: extend logging in MAE backend of RTE flow support Ivan Malov
2021-07-20 15:45     ` David Marchand
2021-07-16  2:20   ` [dpdk-dev] [PATCH v2 2/2] net/sfc: improve " Ivan Malov
2021-07-21  4:15 ` [dpdk-dev] [PATCH v3 0/2] RTE flow support logging improvements Ivan Malov
2021-07-21  4:15   ` [dpdk-dev] [PATCH v3 1/2] net/sfc: extend logging in MAE backend of RTE flow support Ivan Malov
2021-07-21  4:15   ` [dpdk-dev] [PATCH v3 2/2] net/sfc: improve " Ivan Malov
2021-07-23 21:31   ` [dpdk-dev] [PATCH v3 0/2] RTE flow support logging improvements Thomas Monjalon

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).