On 08.12.2019 14:23, Eli Britstein wrote: > Signed-off-by: Eli Britstein <el...@mellanox.com> > Reviewed-by: Oz Shlomo <o...@mellanox.com> > --- > Documentation/howto/dpdk.rst | 2 ++ > NEWS | 4 ++-- > lib/netdev-dpdk.c | 14 +++++++++++++ > lib/netdev-offload-dpdk.c | 48 > ++++++++++++++++++++++++++++++++++++++++++++ > 4 files changed, 66 insertions(+), 2 deletions(-) > > diff --git a/Documentation/howto/dpdk.rst b/Documentation/howto/dpdk.rst > index b9be83002..b9aaf26bf 100644 > --- a/Documentation/howto/dpdk.rst > +++ b/Documentation/howto/dpdk.rst > @@ -394,6 +394,8 @@ Supported actions for hardware offload are: > - Drop. > - Modification of Ethernet (mod_dl_src/mod_dl_dst). > - Modification of IPv4 (mod_nw_src/mod_nw_dst/mod_nw_ttl). > +- Clone with tnl_push and output (a single clone, as the last action, > + with a single output, as the last nested clone action). > > Further Reading > --------------- > diff --git a/NEWS b/NEWS > index 297ca6fff..25125801b 100644 > --- a/NEWS > +++ b/NEWS > @@ -26,8 +26,8 @@ Post-v2.12.0 > * DPDK ring ports (dpdkr) are deprecated and will be removed in next > releases. > * Add support for DPDK 19.11. > - * Add hardware offload support for output, drop and set actions of > - MAC and IPv4 (experimental). > + * Add hardware offload support for output, drop, set of MAC, IPv4 > + and tunnel push-output actions (experimental). > > v2.12.0 - 03 Sep 2019 > --------------------- > diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c > index c4606363d..14f5d6f3b 100644 > --- a/lib/netdev-dpdk.c > +++ b/lib/netdev-dpdk.c > @@ -4762,6 +4762,20 @@ ds_put_flow_action(struct ds *s, const struct > rte_flow_action *actions) > } else { > ds_put_cstr(s, " Set-ttl = null\n"); > } > + } else if (actions->type == RTE_FLOW_ACTION_TYPE_RAW_ENCAP) { > + const struct rte_flow_action_raw_encap *raw_encap = actions->conf; > + > + ds_put_cstr(s, "rte flow raw-encap action:\n"); > + if (raw_encap) { > + ds_put_format(s, > + " Raw-encap: size=%ld\n", > + raw_encap->size); > + ds_put_format(s, > + " Raw-encap: encap=\n");
Why so multilined? > + ds_put_hex_dump(s, raw_encap->data, raw_encap->size, 0, false); > + } else { > + ds_put_cstr(s, " Raw-encap = null\n"); > + } > } else { > ds_put_format(s, "unknown rte flow action (%d)\n", actions->type); > } > diff --git a/lib/netdev-offload-dpdk.c b/lib/netdev-offload-dpdk.c > index 3fccac956..b0403a085 100644 > --- a/lib/netdev-offload-dpdk.c > +++ b/lib/netdev-offload-dpdk.c > @@ -634,6 +634,45 @@ parse_set_actions(struct flow_actions *actions, > return 0; > } > > +static int > +parse_clone_actions(struct netdev *netdev, > + struct flow_actions *actions, > + const struct nlattr *clone_actions, > + const size_t clone_actions_len, > + struct offload_info *info) > +{ > + const struct nlattr *ca; > + unsigned int cleft; > + > + NL_ATTR_FOR_EACH_UNSAFE (ca, cleft, clone_actions, clone_actions_len) { > + int clone_type = nl_attr_type(ca); > + > + if (clone_type == OVS_ACTION_ATTR_TUNNEL_PUSH) { > + const struct ovs_action_push_tnl *tnl_push = nl_attr_get(ca); > + struct rte_flow_action_raw_encap *raw_encap = > + xzalloc(sizeof *raw_encap); > + > + raw_encap->data = (uint8_t *)tnl_push->header; > + raw_encap->preserve = NULL; > + raw_encap->size = tnl_push->header_len; > + > + add_flow_action(actions, RTE_FLOW_ACTION_TYPE_RAW_ENCAP, > + raw_encap); > + } else if (clone_type == OVS_ACTION_ATTR_OUTPUT) { > + if (!(cleft <= NLA_ALIGN(ca->nla_len)) || The same question as for the simple output action: Why it should be the last here? I guess, any combination of encaps and outputs should be valid here. Isn't it? > + add_output_action(netdev, actions, ca, info)) { > + return -1; > + } > + } else { > + VLOG_DBG_RL(&error_rl, > + "Unsupported clone action. clone_type=%d", > clone_type); Maybe, "Unsupported nested action inside clone(), action type: %d" ? > + return -1; > + } > + } > + > + return 0; > +} > + > static int > parse_flow_actions(struct netdev *netdev, > struct flow_actions *actions, > @@ -661,6 +700,15 @@ parse_flow_actions(struct netdev *netdev, > masked)) { > return -1; > } > + } else if (nl_attr_type(nla) == OVS_ACTION_ATTR_CLONE) { > + const struct nlattr *clone_actions = nl_attr_get(nla); > + size_t clone_actions_len = nl_attr_get_size(nla); > + > + if (!(left <= NLA_ALIGN(nla->nla_len)) || > + parse_clone_actions(netdev, actions, clone_actions, > + clone_actions_len, info)) { > + return -1; > + } > } else { > VLOG_DBG_RL(&error_rl, > "Unsupported action type %d", nl_attr_type(nla)); > _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev