> -----Original Message----- > From: Yigit, Ferruh <ferruh.yi...@intel.com> > Sent: Friday, April 30, 2021 1:51 PM > To: Haifei Luo <haif...@nvidia.com>; ma...@nvidia.com; or...@nvidia.com; > viachesl...@nvidia.com; Dumitrescu, Cristian > <cristian.dumitre...@intel.com> > Cc: dev@dpdk.org; tho...@monjalon.net; rasl...@nvidia.com; Iremonger, > Bernard <bernard.iremon...@intel.com>; Xing, Beilei > <beilei.x...@intel.com>; Lu, Wenzhuo <wenzhuo...@intel.com> > Subject: Re: [PATCH] app/testpmd: support meter color action in policy > > On 4/28/2021 3:10 PM, Haifei Luo wrote: > > Currently action RTE_FLOW_ACTION_TYPE_METER_COLOR is defined. > > Add the CLI for this action in meter policy: color type (types) > > There are three types: green, yellow and red. > > > > Example for the new policy meter CLIs: > > add port meter policy 0 1 g_actions color type green / end y_actions > > color type yellow / end r_actions color type red / end > > > > In the above command, the action type is > RTE_FLOW_ACTION_TYPE_METER_COLOR, > > the meter policy action list: green -> green, yellow -> yellow, red -> red. > > > > Ori can you please review this patch too? > > +Cristian for meter. >
Cc Jasvinder > > Signed-off-by: Haifei Luo <haif...@nvidia.com> > > --- > > app/test-pmd/cmdline_flow.c | 85 > +++++++++++++++++++++++++++++++++++++++++++++ > > 1 file changed, 85 insertions(+) > > > > diff --git a/app/test-pmd/cmdline_flow.c b/app/test-pmd/cmdline_flow.c > > index 5947341..1c587bb 100644 > > --- a/app/test-pmd/cmdline_flow.c > > +++ b/app/test-pmd/cmdline_flow.c > > @@ -348,6 +348,11 @@ enum index { > > ACTION_PORT_ID_ORIGINAL, > > ACTION_PORT_ID_ID, > > ACTION_METER, > > + ACTION_METER_COLOR, > > + ACTION_METER_COLOR_TYPE, > > + ACTION_METER_COLOR_GREEN, > > + ACTION_METER_COLOR_YELLOW, > > + ACTION_METER_COLOR_RED, > > ACTION_METER_ID, > > ACTION_OF_SET_MPLS_TTL, > > ACTION_OF_SET_MPLS_TTL_MPLS_TTL, > > @@ -1377,6 +1382,7 @@ struct parse_action_priv { > > ACTION_PHY_PORT, > > ACTION_PORT_ID, > > ACTION_METER, > > + ACTION_METER_COLOR, > > ACTION_OF_SET_MPLS_TTL, > > ACTION_OF_DEC_MPLS_TTL, > > ACTION_OF_SET_NW_TTL, > > @@ -1486,6 +1492,12 @@ struct parse_action_priv { > > ZERO, > > }; > > > > +static const enum index action_meter_color[] = { > > + ACTION_METER_COLOR_TYPE, > > + ACTION_NEXT, > > + ZERO, > > +}; > > + > > static const enum index action_of_set_mpls_ttl[] = { > > ACTION_OF_SET_MPLS_TTL_MPLS_TTL, > > ACTION_NEXT, > > @@ -1723,6 +1735,10 @@ static int parse_vc_conf(struct context *, const > struct token *, > > static int parse_vc_item_ecpri_type(struct context *, const struct token *, > > const char *, unsigned int, > > void *, unsigned int); > > +static int parse_vc_action_meter_color_type(struct context *, > > + const struct token *, > > + const char *, unsigned int, void *, > > + unsigned int); > > static int parse_vc_action_rss(struct context *, const struct token *, > > const char *, unsigned int, void *, > > unsigned int); > > @@ -3801,6 +3817,37 @@ static int comp_set_modify_field_id(struct > context *, const struct token *, > > .next = NEXT(action_meter), > > .call = parse_vc, > > }, > > + [ACTION_METER_COLOR] = { > > + .name = "color", > > + .help = "meter color for the packets", > > + .priv = PRIV_ACTION(METER_COLOR, > > + sizeof(struct rte_flow_action_meter_color)), > > + .next = NEXT(action_meter_color), > > + .call = parse_vc, > > + }, > > + [ACTION_METER_COLOR_TYPE] = { > > + .name = "type", > > + .help = "specific meter color", > > + .next = NEXT(NEXT_ENTRY(ACTION_NEXT), > > + > NEXT_ENTRY(ACTION_METER_COLOR_GREEN, > > + ACTION_METER_COLOR_YELLOW, > > + ACTION_METER_COLOR_RED)), > > + }, > > + [ACTION_METER_COLOR_GREEN] = { > > + .name = "green", > > + .help = "meter color green", > > + .call = parse_vc_action_meter_color_type, > > + }, > > + [ACTION_METER_COLOR_YELLOW] = { > > + .name = "yellow", > > + .help = "meter color yellow", > > + .call = parse_vc_action_meter_color_type, > > + }, > > + [ACTION_METER_COLOR_RED] = { > > + .name = "red", > > + .help = "meter color red", > > + .call = parse_vc_action_meter_color_type, > > + }, > > [ACTION_METER_ID] = { > > .name = "mtr_id", > > .help = "meter id to use", > > @@ -5318,6 +5365,44 @@ static int comp_set_modify_field_id(struct > context *, const struct token *, > > return len; > > } > > > > +/** Parse meter color action type. */ > > +static int > > +parse_vc_action_meter_color_type(struct context *ctx, const struct > token *token, > > + const char *str, unsigned int len, > > + void *buf, unsigned int size) > > +{ > > + struct rte_flow_action *action_data; > > + struct rte_flow_action_meter_color *conf; > > + enum rte_color color; > > + > > + (void)buf; > > + (void)size; > > + /* Token name must match. */ > > + if (parse_default(ctx, token, str, len, NULL, 0) < 0) > > + return -1; > > + switch (ctx->curr) { > > + case ACTION_METER_COLOR_GREEN: > > + color = RTE_COLOR_GREEN; > > + break; > > + case ACTION_METER_COLOR_YELLOW: > > + color = RTE_COLOR_YELLOW; > > + break; > > + case ACTION_METER_COLOR_RED: > > + color = RTE_COLOR_RED; > > + break; > > + default: > > + return -1; > > + } > > + > > + if (!ctx->object) > > + return len; > > + action_data = ctx->object; > > + conf = (struct rte_flow_action_meter_color *) > > + (uintptr_t)(action_data->conf); > > + conf->color = color; > > + return len; > > +} > > + > > /** Parse RSS action. */ > > static int > > parse_vc_action_rss(struct context *ctx, const struct token *token, > >