On 20.11.2019 16:28, Eli Britstein wrote:
> Signed-off-by: Eli Britstein <[email protected]>
> Reviewed-by: Oz Shlomo <[email protected]>
> ---
> NEWS | 4 +--
> lib/netdev-offload-dpdk-flow.c | 60
> ++++++++++++++++++++++++++++++++++++++++++
> 2 files changed, 62 insertions(+), 2 deletions(-)
>
> diff --git a/NEWS b/NEWS
> index 2fb3e1357..ef947234d 100644
> --- a/NEWS
> +++ b/NEWS
> @@ -11,8 +11,8 @@ Post-v2.12.0
> * Add option to enable, disable and query TCP sequence checking in
> conntrack.
> - DPDK:
> - * Add hardware offload support for output, drop and set actions of
> - MAC and IPv4.
> + * Add hardware offload support for output, drop, set of MAC, IPv4
> + and tunnel push-output actions.
>
> v2.12.0 - 03 Sep 2019
> ---------------------
> diff --git a/lib/netdev-offload-dpdk-flow.c b/lib/netdev-offload-dpdk-flow.c
> index c57548e99..b50fee312 100644
> --- a/lib/netdev-offload-dpdk-flow.c
> +++ b/lib/netdev-offload-dpdk-flow.c
> @@ -337,6 +337,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");
> + 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);
> }
> @@ -767,6 +781,44 @@ netdev_dpdk_flow_add_set_actions(struct flow_actions
> *actions,
> return 0;
> }
>
> +static int
> +netdev_dpdk_flow_add_clone_actions(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 &&
> + cleft <= NLA_ALIGN(ca->nla_len)) {
> + if (netdev_dpdk_flow_add_output_action(actions, ca, info)) {
> + return -1;
> + }
> + } else {
> + VLOG_DBG_RL(&error_rl,
> + "Unsupported clone action. clone_type=%d",
> clone_type);
> + return -1;
> + }
> + }
> +
> + return 0;
> +}
> +
> int
> netdev_dpdk_flow_actions_add(struct flow_actions *actions,
> struct nlattr *nl_actions,
> @@ -792,6 +844,14 @@ netdev_dpdk_flow_actions_add(struct flow_actions
> *actions,
> set_actions_len, masked)) {
> return -1;
> }
> + } else if (nl_attr_type(nla) == OVS_ACTION_ATTR_CLONE) {
You need to be sure that clone action is the last action in a list.
Otherwise, further actions will be performed on a modified packet.
> + const struct nlattr *clone_actions = nl_attr_get(nla);
> + size_t clone_actions_len = nl_attr_get_size(nla);
> +
> + if (netdev_dpdk_flow_add_clone_actions(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
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev