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

Reply via email to