[ovs-dev] [PATCH 2/2] ofproto: Document that ->rule_construct() should uninitialize victim rules.
Hao Zheng
hzheng at nicira.com
Fri Sep 9 19:53:43 UTC 2011
Looks good.
On Fri, Sep 9, 2011 at 12:46 PM, Ben Pfaff <blp at nicira.com> wrote:
> Hao pointed out out-of-band that this version still wasn't right.
> Third time's the charm?
>
> Additional incremental:
>
> diff --git a/ofproto/ofproto.c b/ofproto/ofproto.c
> index c0b3474..15bcd13 100644
> --- a/ofproto/ofproto.c
> +++ b/ofproto/ofproto.c
> @@ -2844,8 +2844,7 @@ ofoperation_destroy(struct ofoperation *op)
> * restores the original rule. The caller must have uninitialized any
> * derived state in the new rule, as in step 5 of in the "Life Cycle"
> in
> * ofproto/ofproto-provider.h. ofoperation_complete() performs steps 6
> and
> - * and 7 for the new rule, most notably by calling its
> ->rule_destruct()
> - * and ->rule_dealloc() function.
> + * and 7 for the new rule, calling its ->rule_dealloc() function.
> *
> * - If 'op' is a "modify flow" operation, ofproto restores the original
> * actions.
>
> Full revised commit:
>
> --8<--------------------------cut here-------------------------->8--
>
> From: Ben Pfaff <blp at nicira.com>
> Date: Fri, 9 Sep 2011 12:45:15 -0700
> Subject: [PATCH] ofproto: Document that ->rule_construct() should
> uninitialize victim rules.
>
> The comments didn't say how this should work, so this clarifies it.
> ---
> ofproto/ofproto-provider.h | 11 ++++++++---
> ofproto/ofproto.c | 25 +++++++++++++++++++++++--
> 2 files changed, 31 insertions(+), 5 deletions(-)
>
> diff --git a/ofproto/ofproto-provider.h b/ofproto/ofproto-provider.h
> index c9d74ee..8284418 100644
> --- a/ofproto/ofproto-provider.h
> +++ b/ofproto/ofproto-provider.h
> @@ -686,7 +686,8 @@ struct ofproto_class {
> *
> * - 'rule' is replacing an existing rule in its flow table that had
> the
> * same matching criteria and priority. In this case,
> - * ofoperation_get_victim(rule) returns the rule being replaced.
> + * ofoperation_get_victim(rule) returns the rule being replaced
> (the
> + * "victim" rule).
> *
> * ->rule_construct() should set the following in motion:
> *
> @@ -706,9 +707,13 @@ struct ofproto_class {
> * - If the rule is valid, update the datapath flow table, adding the
> new
> * rule or replacing the existing one.
> *
> + * - If 'rule' is replacing an existing rule, uninitialize any
> derived
> + * state for the victim rule, as in step 5 in the "Life Cycle"
> + * described above.
> + *
> * (On failure, the ofproto code will roll back the insertion from the
> flow
> - * table, either removing 'rule' or replacing it by the flow that was
> - * originally in its place.)
> + * table, either removing 'rule' or replacing it by the victim rule if
> + * there is one.)
> *
> * ->rule_construct() must act in one of the following ways:
> *
> diff --git a/ofproto/ofproto.c b/ofproto/ofproto.c
> index 849a376..15bcd13 100644
> --- a/ofproto/ofproto.c
> +++ b/ofproto/ofproto.c
> @@ -2828,8 +2828,29 @@ ofoperation_destroy(struct ofoperation *op)
> * indicate success or an OpenFlow error code (constructed with
> * e.g. ofp_mkerr()).
> *
> - * If 'op' is a "delete flow" operation, 'error' must be 0. That is, flow
> - * deletions are not allowed to fail.
> + * If 'error' is 0, indicating success, the operation will be committed
> + * permanently to the flow table. There is one interesting subcase:
> + *
> + * - If 'op' is an "add flow" operation that is replacing an existing
> rule in
> + * the flow table (the "victim" rule) by a new one, then the caller
> must
> + * have uninitialized any derived state in the victim rule, as in step
> 5 in
> + * the "Life Cycle" in ofproto/ofproto-provider.h.
> ofoperation_complete()
> + * performs steps 6 and 7 for the victim rule, most notably by calling
> its
> + * ->rule_dealloc() function.
> + *
> + * If 'error' is nonzero, then generally the operation will be rolled
> back:
> + *
> + * - If 'op' is an "add flow" operation, ofproto removes the new rule or
> + * restores the original rule. The caller must have uninitialized any
> + * derived state in the new rule, as in step 5 of in the "Life Cycle"
> in
> + * ofproto/ofproto-provider.h. ofoperation_complete() performs steps
> 6 and
> + * and 7 for the new rule, calling its ->rule_dealloc() function.
> + *
> + * - If 'op' is a "modify flow" operation, ofproto restores the original
> + * actions.
> + *
> + * - 'op' must not be a "delete flow" operation. Removing a rule is not
> + * allowed to fail. It must always succeed.
> *
> * Please see the large comment in ofproto/ofproto-provider.h titled
> * "Asynchronous Operation Support" for more information. */
> --
> 1.7.4.4
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openvswitch.org/pipermail/ovs-dev/attachments/20110909/54690f0c/attachment-0003.html>
More information about the dev
mailing list