@@ -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;
@@ -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);
@@ -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");
}