app/testpmd: support port and encap for sample action
authorJiawei Wang <jiaweiw@nvidia.com>
Fri, 9 Oct 2020 13:46:06 +0000 (16:46 +0300)
committerFerruh Yigit <ferruh.yigit@intel.com>
Fri, 16 Oct 2020 17:47:58 +0000 (19:47 +0200)
Use sample action with ratio is 1 for mirroring flow, add
supports to set the different port or encap action for mirrored
packets.

The example of test-pmd command:

1. set sample_actions 1 port_id id 1 / end
   flow create 0 ... pattern eth / end actions
sample ratio 1 index 1 / port_id id 2...
The flow will result in all the matched ingress packets will be sent to
port 2, and also mirrored the packets and sent to port 1.

2. set raw_encap 0 eth src.../ ipv4.../...
   set raw_encap 1 eth src.../ ipv4.../...
   set sample_actions 2 raw_encap index 0 / port_id id 0 / end
   flow create 0 ... pattern eth / end actions
sample ratio 1 index 2 / raw_encap index 1 / port_id id 0...
The flow will result in all the matched egress packets will be
encapsulated and sent to wire, and also mirrored the packets and with
the different encapsulated data and sent to wire.

Signed-off-by: Jiawei Wang <jiaweiw@nvidia.com>
Acked-by: Viacheslav Ovsiienko <viacheslavo@nvidia.com>
app/test-pmd/cmdline_flow.c

index 038101a..32a9214 100644 (file)
@@ -517,6 +517,8 @@ struct raw_sample_conf raw_sample_confs[RAW_SAMPLE_CONFS_MAX_NUM];
 struct rte_flow_action_mark sample_mark[RAW_SAMPLE_CONFS_MAX_NUM];
 struct rte_flow_action_queue sample_queue[RAW_SAMPLE_CONFS_MAX_NUM];
 struct rte_flow_action_count sample_count[RAW_SAMPLE_CONFS_MAX_NUM];
+struct rte_flow_action_port_id sample_port_id[RAW_SAMPLE_CONFS_MAX_NUM];
+struct rte_flow_action_raw_encap sample_encap[RAW_SAMPLE_CONFS_MAX_NUM];
 
 /** Maximum number of subsequent tokens and arguments on the stack. */
 #define CTX_STACK_SIZE 16
@@ -1461,6 +1463,8 @@ static const enum index next_action_sample[] = {
        ACTION_QUEUE,
        ACTION_MARK,
        ACTION_COUNT,
+       ACTION_PORT_ID,
+       ACTION_RAW_ENCAP,
        ACTION_NEXT,
        ZERO,
 };
@@ -7028,6 +7032,18 @@ cmd_set_raw_parsed_sample(const struct buffer *in)
                                (const void *)action->conf, size);
                        action->conf = &sample_queue[idx];
                        break;
+               case RTE_FLOW_ACTION_TYPE_RAW_ENCAP:
+                       size = sizeof(struct rte_flow_action_raw_encap);
+                       rte_memcpy(&sample_encap[idx],
+                               (const void *)action->conf, size);
+                       action->conf = &sample_encap[idx];
+                       break;
+               case RTE_FLOW_ACTION_TYPE_PORT_ID:
+                       size = sizeof(struct rte_flow_action_port_id);
+                       rte_memcpy(&sample_port_id[idx],
+                               (const void *)action->conf, size);
+                       action->conf = &sample_port_id[idx];
+                       break;
                default:
                        printf("Error - Not supported action\n");
                        return;