* [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 = ðertypes[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 = ðertypes[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
* 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 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
* [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 = ðertypes[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).