app/testpmd: store VXLAN/NVGRE encap data globally
authorJiawei Wang <jiaweiw@nvidia.com>
Wed, 7 Apr 2021 11:48:15 +0000 (14:48 +0300)
committerFerruh Yigit <ferruh.yigit@intel.com>
Wed, 7 Apr 2021 23:09:24 +0000 (01:09 +0200)
With the current code the VXLAN/NVGRE parsing routine
stored the configuration of the header on stack, this
might lead to overwriting the data on the stack.

Currently having VXLAN/NVGRE encap as sample actions
is done using RAW_ENCAP, for example:
1. set raw_encap 1 eth src.../ vxlan vni.../ ipv4.../ ...
   set sample_actions 0 raw_encap / port_id id 0 / end
   flow create 0 ... pattern eth / end actions
      sample ration 1 index 0 / jump group 1 / end

The goal is to utilize the rte_flow_action_vxlan_encap
and rte_flow_action_nvgre_encap for sample actions.

This patch prepares storing the external data of vxlan and
nvgre encap into global data as a pre-step to supporting
vxlan and nvgre encap as a sample actions.

Signed-off-by: Jiawei Wang <jiaweiw@nvidia.com>
Reviewed-by: Ferruh Yigit <ferruh.yigit@intel.com>
app/test-pmd/cmdline_flow.c

index 2c40c69..7ba074e 100644 (file)
@@ -5244,31 +5244,11 @@ end:
        return len;
 }
 
-/** Parse VXLAN encap action. */
+/** Setup VXLAN encap configuration. */
 static int
-parse_vc_action_vxlan_encap(struct context *ctx, const struct token *token,
-                           const char *str, unsigned int len,
-                           void *buf, unsigned int size)
+parse_setup_vxlan_encap_data(struct action_vxlan_encap_data *action_vxlan_encap_data)
 {
-       struct buffer *out = buf;
-       struct rte_flow_action *action;
-       struct action_vxlan_encap_data *action_vxlan_encap_data;
-       int ret;
-
-       ret = parse_vc(ctx, token, str, len, buf, size);
-       if (ret < 0)
-               return ret;
-       /* Nothing else to do if there is no buffer. */
-       if (!out)
-               return ret;
-       if (!out->args.vc.actions_n)
-               return -1;
-       action = &out->args.vc.actions[out->args.vc.actions_n - 1];
-       /* Point to selected object. */
-       ctx->object = out->args.vc.data;
-       ctx->objmask = NULL;
        /* Set up default configuration. */
-       action_vxlan_encap_data = ctx->object;
        *action_vxlan_encap_data = (struct action_vxlan_encap_data){
                .conf = (struct rte_flow_action_vxlan_encap){
                        .definition = action_vxlan_encap_data->items,
@@ -5372,19 +5352,18 @@ parse_vc_action_vxlan_encap(struct context *ctx, const struct token *token,
        }
        memcpy(action_vxlan_encap_data->item_vxlan.vni, vxlan_encap_conf.vni,
               RTE_DIM(vxlan_encap_conf.vni));
-       action->conf = &action_vxlan_encap_data->conf;
-       return ret;
+       return 0;
 }
 
-/** Parse NVGRE encap action. */
+/** Parse VXLAN encap action. */
 static int
-parse_vc_action_nvgre_encap(struct context *ctx, const struct token *token,
+parse_vc_action_vxlan_encap(struct context *ctx, const struct token *token,
                            const char *str, unsigned int len,
                            void *buf, unsigned int size)
 {
        struct buffer *out = buf;
        struct rte_flow_action *action;
-       struct action_nvgre_encap_data *action_nvgre_encap_data;
+       struct action_vxlan_encap_data *action_vxlan_encap_data;
        int ret;
 
        ret = parse_vc(ctx, token, str, len, buf, size);
@@ -5399,8 +5378,17 @@ parse_vc_action_nvgre_encap(struct context *ctx, const struct token *token,
        /* Point to selected object. */
        ctx->object = out->args.vc.data;
        ctx->objmask = NULL;
+       action_vxlan_encap_data = ctx->object;
+       parse_setup_vxlan_encap_data(action_vxlan_encap_data);
+       action->conf = &action_vxlan_encap_data->conf;
+       return ret;
+}
+
+/** Setup NVGRE encap configuration. */
+static int
+parse_setup_nvgre_encap_data(struct action_nvgre_encap_data *action_nvgre_encap_data)
+{
        /* Set up default configuration. */
-       action_nvgre_encap_data = ctx->object;
        *action_nvgre_encap_data = (struct action_nvgre_encap_data){
                .conf = (struct rte_flow_action_nvgre_encap){
                        .definition = action_nvgre_encap_data->items,
@@ -5465,6 +5453,34 @@ parse_vc_action_nvgre_encap(struct context *ctx, const struct token *token,
                        RTE_FLOW_ITEM_TYPE_VOID;
        memcpy(action_nvgre_encap_data->item_nvgre.tni, nvgre_encap_conf.tni,
               RTE_DIM(nvgre_encap_conf.tni));
+       return 0;
+}
+
+/** Parse NVGRE encap action. */
+static int
+parse_vc_action_nvgre_encap(struct context *ctx, const struct token *token,
+                           const char *str, unsigned int len,
+                           void *buf, unsigned int size)
+{
+       struct buffer *out = buf;
+       struct rte_flow_action *action;
+       struct action_nvgre_encap_data *action_nvgre_encap_data;
+       int ret;
+
+       ret = parse_vc(ctx, token, str, len, buf, size);
+       if (ret < 0)
+               return ret;
+       /* Nothing else to do if there is no buffer. */
+       if (!out)
+               return ret;
+       if (!out->args.vc.actions_n)
+               return -1;
+       action = &out->args.vc.actions[out->args.vc.actions_n - 1];
+       /* Point to selected object. */
+       ctx->object = out->args.vc.data;
+       ctx->objmask = NULL;
+       action_nvgre_encap_data = ctx->object;
+       parse_setup_nvgre_encap_data(action_nvgre_encap_data);
        action->conf = &action_nvgre_encap_data->conf;
        return ret;
 }