ethdev: add meter color flow matching item

Provide an ability to use a Color Marker set by a Meter
as a matching item in Flow API. The Color Marker reflects
the metering result by setting the metadata for a
packet to a particular codepoint: green, yellow or red.

Add testpmd command line to match on a meter color:
	flow create 0 ingress group 0 pattern meter color is green / end

Signed-off-by: Alexander Kozyrev <akozyrev@nvidia.com>
Acked-by: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
Acked-by: Ori Kam <orika@nvidia.com>
Acked-by: Ajit Khaparde <ajit.khaparde@broadcom.com>
Acked-by: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
This commit is contained in:
Alexander Kozyrev 2022-09-26 17:57:39 +03:00 committed by Andrew Rybchenko
parent d971cf02cd
commit 3af7a4af1a
6 changed files with 122 additions and 0 deletions

View File

@ -459,6 +459,9 @@ enum index {
ITEM_PPP_ADDR,
ITEM_PPP_CTRL,
ITEM_PPP_PROTO_ID,
ITEM_METER,
ITEM_METER_COLOR,
ITEM_METER_COLOR_NAME,
/* Validate/create actions. */
ACTIONS,
@ -799,6 +802,10 @@ static const char *const modify_field_ids[] = {
"ipv4_ecn", "ipv6_ecn", "gtp_psc_qfi", NULL
};
static const char *const meter_colors[] = {
"green", "yellow", "red", "all", NULL
};
/** Maximum number of subsequent tokens and arguments on the stack. */
#define CTX_STACK_SIZE 16
@ -1337,6 +1344,7 @@ static const enum index next_item[] = {
ITEM_FLEX,
ITEM_L2TPV2,
ITEM_PPP,
ITEM_METER,
END_SET,
ZERO,
};
@ -1797,6 +1805,12 @@ static const enum index item_ppp[] = {
ZERO,
};
static const enum index item_meter[] = {
ITEM_METER_COLOR,
ITEM_NEXT,
ZERO,
};
static const enum index next_action[] = {
ACTION_END,
ACTION_VOID,
@ -2357,6 +2371,9 @@ static int parse_ia_id2ptr(struct context *ctx, const struct token *token,
static int parse_mp(struct context *, const struct token *,
const char *, unsigned int,
void *, unsigned int);
static int parse_meter_color(struct context *ctx, const struct token *token,
const char *str, unsigned int len, void *buf,
unsigned int size);
static int comp_none(struct context *, const struct token *,
unsigned int, char *, unsigned int);
static int comp_boolean(struct context *, const struct token *,
@ -2387,6 +2404,8 @@ static int comp_table_id(struct context *, const struct token *,
unsigned int, char *, unsigned int);
static int comp_queue_id(struct context *, const struct token *,
unsigned int, char *, unsigned int);
static int comp_meter_color(struct context *, const struct token *,
unsigned int, char *, unsigned int);
/** Token definitions. */
static const struct token token_list[] = {
@ -5038,6 +5057,29 @@ static const struct token token_list[] = {
.args = ARGS(ARGS_ENTRY(struct rte_flow_item_ppp,
hdr.proto_id)),
},
[ITEM_METER] = {
.name = "meter",
.help = "match meter color",
.priv = PRIV_ITEM(METER_COLOR,
sizeof(struct rte_flow_item_meter_color)),
.next = NEXT(item_meter),
.call = parse_vc,
},
[ITEM_METER_COLOR] = {
.name = "color",
.help = "meter color",
.next = NEXT(item_meter,
NEXT_ENTRY(ITEM_METER_COLOR_NAME),
item_param),
.args = ARGS(ARGS_ENTRY(struct rte_flow_item_meter_color,
color)),
},
[ITEM_METER_COLOR_NAME] = {
.name = "color_name",
.help = "meter color name",
.call = parse_meter_color,
.comp = comp_meter_color,
},
/* Validate/create actions. */
[ACTIONS] = {
.name = "actions",
@ -9819,6 +9861,30 @@ parse_flex_handle(struct context *ctx, const struct token *token,
return ret;
}
/** Parse Meter color name */
static int
parse_meter_color(struct context *ctx, const struct token *token,
const char *str, unsigned int len, void *buf,
unsigned int size)
{
struct rte_flow_item_meter_color *meter_color;
unsigned int i;
(void)token;
(void)buf;
(void)size;
for (i = 0; meter_colors[i]; ++i)
if (!strcmp_partial(meter_colors[i], str, len))
break;
if (!meter_colors[i])
return -1;
if (!ctx->object)
return len;
meter_color = ctx->object;
meter_color->color = (enum rte_color)i;
return len;
}
/** No completion. */
static int
comp_none(struct context *ctx, const struct token *token,
@ -10110,6 +10176,20 @@ comp_queue_id(struct context *ctx, const struct token *token,
return i;
}
/** Complete available Meter colors. */
static int
comp_meter_color(struct context *ctx, const struct token *token,
unsigned int ent, char *buf, unsigned int size)
{
RTE_SET_USED(ctx);
RTE_SET_USED(token);
if (!buf)
return RTE_DIM(meter_colors);
if (ent < RTE_DIM(meter_colors) - 1)
return strlcpy(buf, meter_colors[ent], size);
return -1;
}
/** Internal context. */
static struct context cmd_flow_context;
@ -10727,6 +10807,9 @@ flow_item_default_mask(const struct rte_flow_item *item)
case RTE_FLOW_ITEM_TYPE_PPP:
mask = &rte_flow_item_ppp_mask;
break;
case RTE_FLOW_ITEM_TYPE_METER_COLOR:
mask = &rte_flow_item_meter_color_mask;
break;
default:
break;
}

View File

@ -1542,6 +1542,13 @@ Matches a PPP header.
- ``proto_id``: PPP protocol identifier.
- Default ``mask`` matches addr, ctrl, proto_id.
Item: ``METER_COLOR``
^^^^^^^^^^^^^^^^^^^^^
Matches Color Marker set by a Meter.
- ``color``: Metering color marker.
Actions
~~~~~~~

View File

@ -74,6 +74,10 @@ New Features
Added new function ``rte_flow_async_action_handle_query()``,
to query the action asynchronously.
* **Extended metering and marking support in the flow API.**
* Added METER_COLOR item to match color marker set by a meter.
* **Updated Intel iavf driver.**
* Added flow subscription support.

View File

@ -3687,6 +3687,10 @@ This section lists supported pattern items and their attributes, if any.
- ``ctrl {unsigned}``: PPP control.
- ``proto_id {unsigned}``: PPP protocol identifier.
- ``meter``: match meter color.
- ``color {value}``: meter color value (green/yellow/red).
Actions list
^^^^^^^^^^^^

View File

@ -156,6 +156,7 @@ static const struct rte_flow_desc_data rte_flow_desc_item[] = {
rte_flow_item_flex_conv),
MK_FLOW_ITEM(L2TPV2, sizeof(struct rte_flow_item_l2tpv2)),
MK_FLOW_ITEM(PPP, sizeof(struct rte_flow_item_ppp)),
MK_FLOW_ITEM(METER_COLOR, sizeof(struct rte_flow_item_meter_color)),
};
/** Generate flow_action[] entry. */

View File

@ -634,6 +634,13 @@ enum rte_flow_item_type {
* See struct rte_flow_item_macsec.
*/
RTE_FLOW_ITEM_TYPE_MACSEC,
/**
* Matches Meter Color Marker.
*
* See struct rte_flow_item_meter_color.
*/
RTE_FLOW_ITEM_TYPE_METER_COLOR,
};
/**
@ -2097,6 +2104,22 @@ struct rte_flow_item_flex_conf {
uint32_t nb_outputs;
};
/**
* RTE_FLOW_ITEM_TYPE_METER_COLOR.
*
* Matches Color Marker set by a Meter.
*/
struct rte_flow_item_meter_color {
enum rte_color color; /**< Meter color marker. */
};
/** Default mask for RTE_FLOW_ITEM_TYPE_METER_COLOR. */
#ifndef __cplusplus
static const struct rte_flow_item_meter_color rte_flow_item_meter_color_mask = {
.color = RTE_COLORS,
};
#endif
/**
* Action types.
*