[ovs-dev] [PATCH 2/2] ofproto: Document that ->rule_construct() should uninitialize victim rules.
Hao Zheng
hzheng at nicira.com
Thu Sep 8 23:53:47 UTC 2011
Please see inline.
Thanks,
-Hao
On Thu, Sep 8, 2011 at 4:27 PM, Ben Pfaff <blp at nicira.com> wrote:
> The comments didn't say how this should work, so this clarifies it.
> ---
> ofproto/ofproto-provider.h | 11 ++++++++---
> ofproto/ofproto.c | 24 ++++++++++++++++++++++--
> 2 files changed, 30 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..e42cfb5 100644
> --- a/ofproto/ofproto.c
> +++ b/ofproto/ofproto.c
> @@ -2828,8 +2828,28 @@ 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. ofoperation_complete() performs steps
> 5, 6,
> + * and 7 for the new rule, most notably by calling its
> ->rule_destruct()
> + * and ->rule_dealloc() function.
>
I don't see ofoperation_complete() calls ->rule_destruct() in case of "add
flow" operation when 'error' is nonzero.
> + *
> + * - 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/20110908/006f2f48/attachment-0003.html>
More information about the dev
mailing list