[ovs-dev] [PATCH] ofp-actions: Allow write_metadata instruction before goto_table instruction.
Jing Ai
ai_jing2000 at hotmail.com
Thu Jan 3 20:17:16 UTC 2013
Thanks Ben. You solution looks better.
I have no further comments on your codes and tests. Also, I have tested it manually by running various combinations of instructions/actions and it works as intended.
One more question, do you think we should normalize any action specified after resubmit action? For example, actions="resubmit(,1)",write_metadata=<metadata>, metadata will not be propagated. It is fine to do in a separate patch.
Best,Jing
> Date: Thu, 3 Jan 2013 09:03:50 -0800
> From: blp at nicira.com
> To: ai_jing2000 at hotmail.com
> CC: dev at openvswitch.org
> Subject: Re: [ovs-dev] [PATCH] ofp-actions: Allow write_metadata instruction before goto_table instruction.
>
> On Thu, Jan 03, 2013 at 06:41:37AM +0000, Jing Ai wrote:
> > In the current codes, when running "ovs-ofctl add-flow br0 <match
> > conditions>,actions=write_metadata:<64-bit
> > metadata>,goto_table:<table_id>", it gives the following
> > error:2012-12-29T00:23:23Z|00001|ofp_actions|WARN|write_metadata
> > instruction must be specified after other
> > instructions/actionsovs-ofctl: Incorrect instruction orderingAccording
> > to OpenFlow spec 1.2, only goto_table instruction could go after
> > write_metadata instruction. This patch intends to address the above
> > issue.
>
> It doesn't generalize enough to all the possible order violations.
> Here's a more general version. Will you please verify that it also
> solves the problem you see?
>
> Thanks,
>
> Ben.
>
> --8<--------------------------cut here-------------------------->8--
>
> From: Ben Pfaff <blp at nicira.com>
> Date: Thu, 3 Jan 2013 09:02:52 -0800
> Subject: [PATCH] ofp-actions: Fix the check for instruction ordering and
> duplication.
>
> Open vSwitch enforces that, when instructions appear as Nicira extensions
> in OpenFlow 1.0 action lists, the instructions appear in the order that
> an OpenFlow 1.1+ switch would execute them and that no duplicates appear.
> But the check wasn't general enough, because it had been implemented when
> only one instruction was implemented and never later generalized. This
> commit fixes the problem.
>
> One of the tests was actually testing for the wrong behavior that the
> check implemented, so this commit corrects that test. It also updates
> another test with updated log messages.
>
> Reported-by: Jing Ai <ai_jing2000 at hotmail.com>
> Signed-off-by: Ben Pfaff <blp at nicira.com>
> ---
> AUTHORS | 1 +
> lib/ofp-actions.c | 38 ++++++++++++++++++++++++++------------
> tests/ofp-actions.at | 37 ++++++++++++++++++++++++++++++++-----
> 3 files changed, 59 insertions(+), 17 deletions(-)
>
> diff --git a/AUTHORS b/AUTHORS
> index 5d34fbe..060fc19 100644
> --- a/AUTHORS
> +++ b/AUTHORS
> @@ -133,6 +133,7 @@ Janis Hamme janis.hamme at student.kit.edu
> Jari Sundell sundell.software at gmail.com
> Jed Daniels openvswitch at jeddaniels.com
> Jeongkeun Lee jklee at hp.com
> +Jing Ai ai_jing2000 at hotmail.com
> Joan Cirer joan at ev0.net
> John Galgay john at galgay.net
> Kevin Mancuso kevin.mancuso at rackspace.com
> diff --git a/lib/ofp-actions.c b/lib/ofp-actions.c
> index 6468cac..37205b2 100644
> --- a/lib/ofp-actions.c
> +++ b/lib/ofp-actions.c
> @@ -1,5 +1,5 @@
> /*
> - * Copyright (c) 2008, 2009, 2010, 2011, 2012 Nicira, Inc.
> + * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013 Nicira, Inc.
> *
> * Licensed under the Apache License, Version 2.0 (the "License");
> * you may not use this file except in compliance with the License.
> @@ -1153,23 +1153,37 @@ enum ofperr
> ofpacts_verify(const struct ofpact ofpacts[], size_t ofpacts_len)
> {
> const struct ofpact *a;
> - const struct ofpact_metadata *om = NULL;
> + enum ovs_instruction_type inst = 0;
>
> OFPACT_FOR_EACH (a, ofpacts, ofpacts_len) {
> - if (om) {
> - if (a->type == OFPACT_WRITE_METADATA) {
> - VLOG_WARN("duplicate write_metadata instruction specified");
> - return OFPERR_OFPBAC_UNSUPPORTED_ORDER;
> + enum ovs_instruction_type next;
> +
> + if (a->type == OFPACT_CLEAR_ACTIONS) {
> + next = OVSINST_OFPIT11_CLEAR_ACTIONS;
> + } else if (a->type == OFPACT_WRITE_METADATA) {
> + next = OVSINST_OFPIT11_WRITE_METADATA;
> + } else if (a->type == OFPACT_GOTO_TABLE) {
> + next = OVSINST_OFPIT11_GOTO_TABLE;
> + } else {
> + next = OVSINST_OFPIT11_APPLY_ACTIONS;
> + }
> +
> + if (inst != OVSINST_OFPIT11_APPLY_ACTIONS && next <= inst) {
> + const char *name = ofpact_instruction_name_from_type(inst);
> + const char *next_name = ofpact_instruction_name_from_type(next);
> +
> + if (next == inst) {
> + VLOG_WARN("duplicate %s instruction not allowed, for OpenFlow "
> + "1.1+ compatibility", name);
> } else {
> - VLOG_WARN("write_metadata instruction must be specified after "
> - "other instructions/actions");
> - return OFPERR_OFPBAC_UNSUPPORTED_ORDER;
> + VLOG_WARN("invalid instruction ordering: %s must appear "
> + "before %s, for OpenFlow 1.1+ compatibility",
> + next_name, name);
> }
> + return OFPERR_OFPBAC_UNSUPPORTED_ORDER;
> }
>
> - if (a->type == OFPACT_WRITE_METADATA) {
> - om = (const struct ofpact_metadata *) a;
> - }
> + inst = next;
> }
>
> return 0;
> diff --git a/tests/ofp-actions.at b/tests/ofp-actions.at
> index 30fcf51..aa51e08 100644
> --- a/tests/ofp-actions.at
> +++ b/tests/ofp-actions.at
> @@ -240,12 +240,12 @@ dnl action instead, so parse-ofp11-actions will recognise and drop this action.
> ffff 0020 00002320 0016 000000000000 fedcba9876543210 ffffffffffffffff
>
> dnl Write-Metadata duplicated.
> -& ofp_actions|WARN|duplicate write_metadata instruction specified
> +& ofp_actions|WARN|duplicate write_metadata instruction not allowed, for OpenFlow 1.1+ compatibility
> # bad OF1.1 actions: OFPBAC_UNSUPPORTED_ORDER
> ffff 0020 00002320 0016 000000000000 fedcba9876543210 ffffffffffffffff ffff 0020 00002320 0016 000000000000 fedcba9876543210 ffffffffffffffff
>
> dnl Write-Metadata in wrong position.
> -& ofp_actions|WARN|write_metadata instruction must be specified after other instructions/actions
> +& ofp_actions|WARN|invalid instruction ordering: apply_actions must appear before write_metadata, for OpenFlow 1.1+ compatibility
> # bad OF1.1 actions: OFPBAC_UNSUPPORTED_ORDER
> ffff 0020 00002320 0016 000000000000 fedcba9876543210 ffffffffffffffff ffff 0010 00002320 0002 0000 12345678
>
> @@ -382,9 +382,36 @@ dnl Write-Metadata duplicated.
> # bad OF1.1 instructions: OFPBAC_UNSUPPORTED_ORDER
> 0002 0018 00000000 fedcba9876543210 ff00ff00ff00ff00 0002 0018 00000000 fedcba9876543210 ff00ff00ff00ff00
>
> -dnl Write-Metadata in wrong position.
> -& ofp_actions|WARN|write_metadata instruction must be specified after other instructions/actions
> -# bad OF1.1 instructions: OFPBAC_UNSUPPORTED_ORDER
> +dnl Write-Metadata in wrong position (OpenFlow 1.1+ disregards the order
> +dnl and OVS reorders it to the canonical order)
> +# actions=write_metadata:0xfedcba9876543210,goto_table:1
> +# 1: 01 -> 02
> +# 3: 08 -> 18
> +# 4: 01 -> 00
> +# 8: 00 -> fe
> +# 9: 02 -> dc
> +# 10: 00 -> ba
> +# 11: 18 -> 98
> +# 12: 00 -> 76
> +# 13: 00 -> 54
> +# 14: 00 -> 32
> +# 15: 00 -> 10
> +# 16: fe -> ff
> +# 17: dc -> ff
> +# 18: ba -> ff
> +# 19: 98 -> ff
> +# 20: 76 -> ff
> +# 21: 54 -> ff
> +# 22: 32 -> ff
> +# 23: 10 -> ff
> +# 24: ff -> 00
> +# 25: ff -> 01
> +# 26: ff -> 00
> +# 27: ff -> 08
> +# 28: ff -> 01
> +# 29: ff -> 00
> +# 30: ff -> 00
> +# 31: ff -> 00
> 0001 0008 01 000000 0002 0018 00000000 fedcba9876543210 ffffffffffffffff
>
> dnl Write-Actions not supported yet.
> --
> 1.7.10.4
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openvswitch.org/pipermail/ovs-dev/attachments/20130103/2596a290/attachment-0003.html>
More information about the dev
mailing list