On Wed, Nov 11, 2015 at 11:39:53AM -0800, Joe Stringer wrote:
> Add an ofproto-level function to allow implementations to reject
> specific action types based on internal implementation details. The
> first user will be the next patch, which checks for datapath (kernel)
> support for various aspects of connection tracking and uses this to
> allow or reject ct() actions.
>
> Signed-off-by: Joe Stringer <[email protected]>
> CC: Jarno Rajahalme <[email protected]>
> ---
> ofproto/ofproto-dpif.c | 1 +
> ofproto/ofproto-provider.h | 14 ++++++++++++++
> ofproto/ofproto.c | 9 +++++++++
> 3 files changed, 24 insertions(+)
>
> diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c
> index f0a2ca59e2e8..8b1760c95409 100644
> --- a/ofproto/ofproto-dpif.c
> +++ b/ofproto/ofproto-dpif.c
> @@ -5689,6 +5689,7 @@ const struct ofproto_class ofproto_dpif_class = {
> port_poll_wait,
> port_is_lacp_current,
> port_get_lacp_stats,
> + NULL,
> NULL, /* rule_choose_table */
> rule_alloc,
> rule_construct,
> diff --git a/ofproto/ofproto-provider.h b/ofproto/ofproto-provider.h
> index 117cd1fcc02e..da6cb37c0b60 100644
> --- a/ofproto/ofproto-provider.h
> +++ b/ofproto/ofproto-provider.h
> @@ -1077,6 +1077,20 @@ struct ofproto_class {
> /* ## OpenFlow Rule Functions ## */
> /* ## ----------------------- ## */
>
> + /* Checks whether the action 'ofpact' is supported by 'ofproto'. On
> + * success, returns 0. On failure, returns an OpenFlow error code.
> + *
> + * Some actions are marked as optional by the OpenFlow specification.
> + * Furthermore, OVS includes support for several vendor extensions which
> + * may not be supported by all ofproto implementations. This function
> + * allows specific actions to be rejected based on internal datapath
> + * support. Failure implies that an OpenFlow rule that includes 'ofpact'
> + * in its actions can never be inserted into 'ofproto'.
> + *
> + * If this function is NULL then all actions are supported. */
> + enum ofperr (*rule_check_action)(const struct ofproto *ofproto,
> + const struct ofpact *ofpact);
Checking that the datapath can implement the actions is supposed to be
part of the job of ->rule_construct(), see this comment on
ofproto-provider.h:
* ->rule_construct() must also:
*
* - Validate that the datapath supports the matching rule in 'rule->cr'
* datapath. For example, if the rule's table does not support
* registers, then it is an error if 'rule->cr' does not wildcard all
* registers.
*
* - Validate that the datapath can correctly implement 'rule->ofpacts'.
_______________________________________________
dev mailing list
[email protected]
http://openvswitch.org/mailman/listinfo/dev