On Tue, Sep 8, 2020 at 11:50 PM Jiawei Wang <jiaw...@nvidia.com> wrote: > > 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 2.
^ You probably meant "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 <jiaw...@nvidia.com> > --- > app/test-pmd/cmdline_flow.c | 16 ++++++++++++++++ > 1 file changed, 16 insertions(+) > > diff --git a/app/test-pmd/cmdline_flow.c b/app/test-pmd/cmdline_flow.c > index 27fa294..1860657 100644 > --- a/app/test-pmd/cmdline_flow.c > +++ b/app/test-pmd/cmdline_flow.c > @@ -514,6 +514,8 @@ struct raw_sample_conf { > 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 > @@ -1456,6 +1458,8 @@ struct parse_action_priv { > ACTION_QUEUE, > ACTION_MARK, > ACTION_COUNT, > + ACTION_PORT_ID, > + ACTION_RAW_ENCAP, > ACTION_NEXT, > ZERO, > }; > @@ -7009,6 +7013,18 @@ static int comp_set_sample_index(struct context *, > const struct token *, > (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; > -- > 1.8.3.1 >