Flow actions parameters in indirect actions list are created as
read-only and shared between all flows that reference that indirect
list.

If a flow rule needs to apply rule specific actions list parameters it
does it with the indirect actions list conf parameter.

The patch allows flow rule to set meter_mark init_color value when
meter_mark action was created in indirect actions list.

Example:

# create indirect actions list with meter_mark flow action:
testpmd> flow indirect_action 0 create action_id 10 ingress \
  list actions meter_mark mtr_profile 20 \
  mtr_state 1 mtr_color_mode 1 / end

# create a flow specific meter_mark init_color configuration:
testpmd> flow indirect_action 0 create action_id 11 flow_conf \
   actions meter_mark_conf mtr_update_init_color red / end

# queue a flow rule with indirect actions list
# and flow specific configuration:
testpmd> flow queue 0 create 0 template_table 1 pattern_template 0 \
   actions_template 0 postpone no pattern eth / ipv4 / udp / end \
   actions indirect_list handle 10 conf 11 / \
   jump group 10 / end

cc: sta...@dpdk.org

Signed-off-by: Gregory Etelson <getel...@nvidia.com>
---
 app/test-pmd/cmdline_flow.c | 52 +++++++++++++++++++++++++++++--------
 1 file changed, 41 insertions(+), 11 deletions(-)

diff --git a/app/test-pmd/cmdline_flow.c b/app/test-pmd/cmdline_flow.c
index e1720e54d7..6add4e56ec 100644
--- a/app/test-pmd/cmdline_flow.c
+++ b/app/test-pmd/cmdline_flow.c
@@ -62,6 +62,7 @@ enum index {
        COMMON_ACTIONS_TEMPLATE_ID,
        COMMON_TABLE_ID,
        COMMON_QUEUE_ID,
+       COMMON_METER_COLOR_NAME,
 
        /* TOP-level command. */
        ADD,
@@ -556,7 +557,6 @@ enum index {
        ITEM_PPP_PROTO_ID,
        ITEM_METER,
        ITEM_METER_COLOR,
-       ITEM_METER_COLOR_NAME,
        ITEM_QUOTA,
        ITEM_QUOTA_STATE,
        ITEM_QUOTA_STATE_NAME,
@@ -642,6 +642,8 @@ enum index {
        ACTION_METER_COLOR_RED,
        ACTION_METER_ID,
        ACTION_METER_MARK,
+       ACTION_METER_MARK_CONF,
+       ACTION_METER_MARK_CONF_COLOR,
        ACTION_METER_PROFILE,
        ACTION_METER_PROFILE_ID2PTR,
        ACTION_METER_POLICY,
@@ -2270,6 +2272,7 @@ static const enum index next_action[] = {
        ACTION_METER,
        ACTION_METER_COLOR,
        ACTION_METER_MARK,
+       ACTION_METER_MARK_CONF,
        ACTION_OF_DEC_NW_TTL,
        ACTION_OF_POP_VLAN,
        ACTION_OF_PUSH_VLAN,
@@ -3235,6 +3238,12 @@ static const struct token token_list[] = {
                .call = parse_int,
                .comp = comp_queue_id,
        },
+       [COMMON_METER_COLOR_NAME] = {
+               .name = "color_name",
+               .help = "meter color name",
+               .call = parse_meter_color,
+               .comp = comp_meter_color,
+       },
        /* Top-level command. */
        [FLOW] = {
                .name = "flow",
@@ -6280,17 +6289,11 @@ static const struct token token_list[] = {
                .name = "color",
                .help = "meter color",
                .next = NEXT(item_meter,
-                            NEXT_ENTRY(ITEM_METER_COLOR_NAME),
+                            NEXT_ENTRY(COMMON_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,
-       },
        [ITEM_QUOTA] = {
                .name = "quota",
                .help = "match quota",
@@ -6856,6 +6859,23 @@ static const struct token token_list[] = {
                .next = NEXT(action_meter_mark),
                .call = parse_vc,
        },
+       [ACTION_METER_MARK_CONF] = {
+               .name = "meter_mark_conf",
+               .help = "meter mark configuration",
+               .priv = PRIV_ACTION(METER_MARK,
+                                   sizeof(struct rte_flow_action_meter_mark)),
+               .next = NEXT(NEXT_ENTRY(ACTION_METER_MARK_CONF_COLOR)),
+               .call = parse_vc,
+       },
+       [ACTION_METER_MARK_CONF_COLOR] = {
+               .name = "mtr_update_init_color",
+               .help = "meter update init color",
+               .next = NEXT(NEXT_ENTRY(ACTION_NEXT),
+                            NEXT_ENTRY(COMMON_METER_COLOR_NAME)),
+               .args = ARGS(ARGS_ENTRY
+                            (struct rte_flow_indirect_update_flow_meter_mark,
+                             init_color)),
+       },
        [ACTION_METER_PROFILE] = {
                .name = "mtr_profile",
                .help = "meter profile id to use",
@@ -12375,8 +12395,8 @@ 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;
+       struct buffer *out = buf;
 
        (void)token;
        (void)buf;
@@ -12388,8 +12408,18 @@ parse_meter_color(struct context *ctx, const struct 
token *token,
                return -1;
        if (!ctx->object)
                return len;
-       meter_color = ctx->object;
-       meter_color->color = (enum rte_color)i;
+       if (ctx->prev == ACTION_METER_MARK_CONF_COLOR) {
+               struct rte_flow_action *action =
+                       out->args.vc.actions + out->args.vc.actions_n - 1;
+               const struct arg *arg = pop_args(ctx);
+
+               if (!arg)
+                       return -1;
+               *(int *)RTE_PTR_ADD(action->conf, arg->offset) = i;
+       } else {
+               ((struct rte_flow_item_meter_color *)
+                       ctx->object)->color = (enum rte_color)i;
+       }
        return len;
 }
 
-- 
2.45.2

Reply via email to