app/testpmd: add GTPU to RSS hash commands
[dpdk.git] / app / test-pmd / cmdline_flow.c
index e6ab8ff..4e2006c 100644 (file)
@@ -67,6 +67,7 @@ enum index {
        DUMP,
        QUERY,
        LIST,
+       AGED,
        ISOLATE,
 
        /* Destroy arguments. */
@@ -78,6 +79,9 @@ enum index {
        /* List arguments. */
        LIST_GROUP,
 
+       /* Destroy aged flow arguments. */
+       AGED_DESTROY,
+
        /* Validate/create arguments. */
        GROUP,
        PRIORITY,
@@ -343,6 +347,8 @@ enum index {
        ACTION_SET_IPV4_DSCP_VALUE,
        ACTION_SET_IPV6_DSCP,
        ACTION_SET_IPV6_DSCP_VALUE,
+       ACTION_AGE,
+       ACTION_AGE_TIMEOUT,
 };
 
 /** Maximum size for pattern in struct rte_flow_item_raw. */
@@ -662,6 +668,9 @@ struct buffer {
                struct {
                        int set;
                } isolate; /**< Isolated mode arguments. */
+               struct {
+                       int destroy;
+               } aged; /**< Aged arguments. */
        } args; /**< Command arguments. */
 };
 
@@ -717,6 +726,12 @@ static const enum index next_list_attr[] = {
        ZERO,
 };
 
+static const enum index next_aged_attr[] = {
+       AGED_DESTROY,
+       END,
+       ZERO,
+};
+
 static const enum index item_param[] = {
        ITEM_PARAM_IS,
        ITEM_PARAM_SPEC,
@@ -1145,6 +1160,7 @@ static const enum index next_action[] = {
        ACTION_SET_META,
        ACTION_SET_IPV4_DSCP,
        ACTION_SET_IPV6_DSCP,
+       ACTION_AGE,
        ZERO,
 };
 
@@ -1370,6 +1386,13 @@ static const enum index action_set_ipv6_dscp[] = {
        ZERO,
 };
 
+static const enum index action_age[] = {
+       ACTION_AGE,
+       ACTION_AGE_TIMEOUT,
+       ACTION_NEXT,
+       ZERO,
+};
+
 static int parse_set_raw_encap_decap(struct context *, const struct token *,
                                     const char *, unsigned int,
                                     void *, unsigned int);
@@ -1456,6 +1479,9 @@ static int parse_action(struct context *, const struct token *,
 static int parse_list(struct context *, const struct token *,
                      const char *, unsigned int,
                      void *, unsigned int);
+static int parse_aged(struct context *, const struct token *,
+                     const char *, unsigned int,
+                     void *, unsigned int);
 static int parse_isolate(struct context *, const struct token *,
                         const char *, unsigned int,
                         void *, unsigned int);
@@ -1639,6 +1665,7 @@ static const struct token token_list[] = {
                              FLUSH,
                              DUMP,
                              LIST,
+                             AGED,
                              QUERY,
                              ISOLATE)),
                .call = parse_init,
@@ -1698,6 +1725,13 @@ static const struct token token_list[] = {
                .args = ARGS(ARGS_ENTRY(struct buffer, port)),
                .call = parse_list,
        },
+       [AGED] = {
+               .name = "aged",
+               .help = "list and destroy aged flows",
+               .next = NEXT(next_aged_attr, NEXT_ENTRY(PORT_ID)),
+               .args = ARGS(ARGS_ENTRY(struct buffer, port)),
+               .call = parse_aged,
+       },
        [ISOLATE] = {
                .name = "isolate",
                .help = "restrict ingress traffic to the defined flow rules",
@@ -1731,6 +1765,12 @@ static const struct token token_list[] = {
                .args = ARGS(ARGS_ENTRY_PTR(struct buffer, args.list.group)),
                .call = parse_list,
        },
+       [AGED_DESTROY] = {
+               .name = "destroy",
+               .help = "specify aged flows need be destroyed",
+               .call = parse_aged,
+               .comp = comp_none,
+       },
        /* Validate/create attributes. */
        [GROUP] = {
                .name = "group",
@@ -3694,6 +3734,22 @@ static const struct token token_list[] = {
                             (struct rte_flow_action_set_dscp, dscp)),
                .call = parse_vc_conf,
        },
+       [ACTION_AGE] = {
+               .name = "age",
+               .help = "set a specific metadata header",
+               .next = NEXT(action_age),
+               .priv = PRIV_ACTION(AGE,
+                       sizeof(struct rte_flow_action_age)),
+               .call = parse_vc,
+       },
+       [ACTION_AGE_TIMEOUT] = {
+               .name = "timeout",
+               .help = "flow age timeout value",
+               .args = ARGS(ARGS_ENTRY_BF(struct rte_flow_action_age,
+                                          timeout, 24)),
+               .next = NEXT(action_age, NEXT_ENTRY(UNSIGNED)),
+               .call = parse_vc_conf,
+       },
 };
 
 /** Remove and return last entry from argument stack. */
@@ -5341,6 +5397,35 @@ parse_list(struct context *ctx, const struct token *token,
        return len;
 }
 
+/** Parse tokens for list all aged flows command. */
+static int
+parse_aged(struct context *ctx, const struct token *token,
+          const char *str, unsigned int len,
+          void *buf, unsigned int size)
+{
+       struct buffer *out = buf;
+
+       /* Token name must match. */
+       if (parse_default(ctx, token, str, len, NULL, 0) < 0)
+               return -1;
+       /* Nothing else to do if there is no buffer. */
+       if (!out)
+               return len;
+       if (!out->command) {
+               if (ctx->curr != AGED)
+                       return -1;
+               if (sizeof(*out) > size)
+                       return -1;
+               out->command = ctx->curr;
+               ctx->objdata = 0;
+               ctx->object = out;
+               ctx->objmask = NULL;
+       }
+       if (ctx->curr == AGED_DESTROY)
+               out->args.aged.destroy = 1;
+       return len;
+}
+
 /** Parse tokens for isolate command. */
 static int
 parse_isolate(struct context *ctx, const struct token *token,
@@ -6341,6 +6426,9 @@ cmd_flow_parsed(const struct buffer *in)
        case ISOLATE:
                port_flow_isolate(in->port, in->args.isolate.set);
                break;
+       case AGED:
+               port_flow_aged(in->port, in->args.aged.destroy);
+               break;
        default:
                break;
        }