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