[ovs-dev] [PATCH 4/6] lib/odp-util: Add new ODP actions for recirculation

Simon Horman horms at verge.net.au
Wed Feb 12 08:04:44 UTC 2014


Hi Andy,

On Tue, Feb 04, 2014 at 04:36:22PM -0800, Andy Zhou wrote:
> 
> Signed-off-by: Andy Zhou <azhou at nicira.com>
> ---
>  include/linux/openvswitch.h |   26 ++++++++++++++++++++++++++
>  lib/dpif-netdev.c           |    2 ++
>  lib/dpif.c                  |    2 ++
>  lib/odp-execute.c           |    2 ++
>  lib/odp-util.c              |   13 +++++++++++++
>  5 files changed, 45 insertions(+)
> 
> diff --git a/include/linux/openvswitch.h b/include/linux/openvswitch.h
> index 5137c2f..1dea78e 100644
> --- a/include/linux/openvswitch.h
> +++ b/include/linux/openvswitch.h
> @@ -530,6 +530,26 @@ struct ovs_action_push_vlan {
>  	__be16 vlan_tci;	/* 802.1Q TCI (VLAN ID and priority). */
>  };
>  
> +/*
> + * struct ovs_action_recirc - %OVS_ACTION_ATTR_RECIRC action argument.
> + * @recirc_id: The Recirculation label, Zero is invalid.
> + */
> +struct ovs_action_recirc {
> +	uint32_t  recirc_id;	/* Recirculation label. */
> +	/* XXX only support output action for now */
> +	uint32_t  out_port;	/* Output port for the first packet. */
> +};

I have also been working on recirculation. The aim of my work is to support
sequences of actions which involve MPLS which are difficult to implement in
one pass because the payload of an MPLS packet is opaque.  And as such I
have been working on a solution that can support arbitrary sequences of
actions after recirculation.

With this and the "XXX" commend above in mind I am wondering how
you see this approach being extended to support other actions.


I will post v18 or my recirculation code to illustrate what I have been
working on. I has been reworked quite heavily since I posted v16 in July.
This has been to take into account multi threaded miss handling and the
removal of facets from ovs-vswitchd. (v17 was never posted because as I was
preparing it multi-threaded miss handling was merged.)

I hope that now we are able to see each others implementations we can
work towards something that works for both of us.



> +
> +/**
> + * struct ovs_action_hash - %OVS_ACTION_ATTR_HASH action argument.
> + * @hash_type: The hash function, value of enum ovs_hash_type_attr.
> + * @hash_bias: Bias used for hash computation.
> + */
> +struct ovs_action_hash {
> +	uint8_t hash_type;	/* enum ovs_hash_type_attr. */
> +	uint32_t bias;		/* bias for the hash function. */
> +};
> +
>  /**
>   * enum ovs_action_attr - Action types.
>   *
> @@ -553,6 +573,10 @@ struct ovs_action_push_vlan {
>   * indicate the new packet contents This could potentially still be
>   * %ETH_P_MPLS_* if the resulting MPLS label stack is not empty.  If there
>   * is no MPLS label stack, as determined by ethertype, no action is taken.
> + * @OVS_ACTION_HASH: Compute packet hash and set the hash vlaue into the flow
> + * key.
> + * @OVS_ACTION_RECIRC: Recirculate within the data path.
> + *
>   *
>   * Only a single header can be set with a single %OVS_ACTION_ATTR_SET.  Not all
>   * fields within a header are modifiable, e.g. the IPv4 protocol and fragment
> @@ -569,6 +593,8 @@ enum ovs_action_attr {
>  	OVS_ACTION_ATTR_SAMPLE,       /* Nested OVS_SAMPLE_ATTR_*. */
>  	OVS_ACTION_ATTR_PUSH_MPLS,    /* struct ovs_action_push_mpls. */
>  	OVS_ACTION_ATTR_POP_MPLS,     /* __be16 ethertype. */
> +	OVS_ACTION_ATTR_HASH,	      /* struct ovs_action_hash. */
> +	OVS_ACTION_ATTR_RECIRC,	      /* struct ovs_action_recirc. */
>  	__OVS_ACTION_ATTR_MAX
>  };
>  
> diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
> index cb64bdc..cb66c1e 100644
> --- a/lib/dpif-netdev.c
> +++ b/lib/dpif-netdev.c
> @@ -1805,6 +1805,8 @@ dp_execute_cb(void *aux_, struct ofpbuf *packet,
>      case OVS_ACTION_ATTR_SET:
>      case OVS_ACTION_ATTR_SAMPLE:
>      case OVS_ACTION_ATTR_UNSPEC:
> +    case OVS_ACTION_ATTR_HASH:
> +    case OVS_ACTION_ATTR_RECIRC:
>      case __OVS_ACTION_ATTR_MAX:
>          OVS_NOT_REACHED();
>      }
> diff --git a/lib/dpif.c b/lib/dpif.c
> index 2b79a6e..e934aa0 100644
> --- a/lib/dpif.c
> +++ b/lib/dpif.c
> @@ -1093,6 +1093,8 @@ dpif_execute_helper_cb(void *aux_, struct ofpbuf *packet,
>      case OVS_ACTION_ATTR_SET:
>      case OVS_ACTION_ATTR_SAMPLE:
>      case OVS_ACTION_ATTR_UNSPEC:
> +    case OVS_ACTION_ATTR_HASH:
> +    case OVS_ACTION_ATTR_RECIRC:
>      case __OVS_ACTION_ATTR_MAX:
>          OVS_NOT_REACHED();
>      }
> diff --git a/lib/odp-execute.c b/lib/odp-execute.c
> index 096c113..20c36b8 100644
> --- a/lib/odp-execute.c
> +++ b/lib/odp-execute.c
> @@ -232,6 +232,8 @@ odp_execute_actions__(void *dp, struct ofpbuf *packet, struct pkt_metadata *md,
>                                 more_actions || left > NLA_ALIGN(a->nla_len));
>              break;
>  
> +        case OVS_ACTION_ATTR_HASH:
> +        case OVS_ACTION_ATTR_RECIRC:
>          case OVS_ACTION_ATTR_UNSPEC:
>          case __OVS_ACTION_ATTR_MAX:
>              OVS_NOT_REACHED();
> diff --git a/lib/odp-util.c b/lib/odp-util.c
> index 873e05a..9aa871c 100644
> --- a/lib/odp-util.c
> +++ b/lib/odp-util.c
> @@ -82,6 +82,8 @@ odp_action_len(uint16_t type)
>      case OVS_ACTION_ATTR_SET: return -2;
>      case OVS_ACTION_ATTR_SAMPLE: return -2;
>  
> +    case OVS_ACTION_ATTR_HASH: return sizeof(struct ovs_action_hash);
> +    case OVS_ACTION_ATTR_RECIRC: return sizeof(struct ovs_action_recirc);
>      case OVS_ACTION_ATTR_UNSPEC:
>      case __OVS_ACTION_ATTR_MAX:
>          return -1;
> @@ -424,6 +426,17 @@ format_odp_action(struct ds *ds, const struct nlattr *a)
>      case OVS_ACTION_ATTR_SAMPLE:
>          format_odp_sample_action(ds, a);
>          break;
> +    case OVS_ACTION_ATTR_HASH: {
> +        const struct ovs_action_hash *hash_act = nl_attr_get(a);
> +        ds_put_format(ds, "hash(bias=%#"PRIx32")", hash_act->bias);
> +        break;
> +    }
> +    case OVS_ACTION_ATTR_RECIRC: {
> +        const struct ovs_action_recirc *recirc_act = nl_attr_get(a);
> +        ds_put_format(ds, "recirc(id=%"PRIu32")", recirc_act->recirc_id);
> +        break;
> +    }
> +
>      case OVS_ACTION_ATTR_UNSPEC:
>      case __OVS_ACTION_ATTR_MAX:
>      default:
> -- 
> 1.7.9.5
> 
> _______________________________________________
> dev mailing list
> dev at openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev
> 



More information about the dev mailing list