On Wed, Jun 29, 2016 at 12:29:25AM +0200, Jan Scheurich wrote:
> This patch adds support for a new Group Mod command OFPGC_ADD_OR_MOD to
> OVS for all OpenFlow versions that support groups (OF11 and higher).
> The new ADD_OR_MOD creates a group that does not yet exist (like ADD)
> and modifies an existing group (like MODIFY).
>
> Rational: In OpenFlow 1.x the Group Mod commands OFPGC_ADD and
> OFPGC_MODIFY have strict semantics: ADD fails if the group exists,
> while MODIFY fails if the group does not exist. This requires a
> controller to exactly know the state of the switch when programming a
> group in order not run the risk of getting an OFP Error message in
> response. This is hard to achieve and maintain at all times in view of
> possible switch and controller restarts or other connection losses
> between switch and controller.
>
> Due to the un-acknowledged nature of the Group Mod message programming
> groups safely and efficiently at the same time is virtually impossible
> as the controller has to either query the existence of the group prior
> to each Group Mod message or to insert a Barrier Request/Reply after
> every group to be sure that no Error can be received at a later stage
> and require a complicated roll-back of any dependent actions taken
> between the failed Group Mod and the Error.
>
> In the ovs-ofctl command line the ADD_OR_MOD command is made available
> through the new option --may-create in the mod-group command:
>
> $ ovs-ofctl -Oopenflow13 del-groups br-int group_id=100
>
> $ ovs-ofctl -Oopenflow13 mod-group br-int
> group_id=100,type=indirect,bucket=actions=2 OFPT_ERROR (OF1.3)
> (xid=0x2): OFPGMFC_UNKNOWN_GROUP OFPT_GROUP_MOD (OF1.3) (xid=0x2):
> MOD group_id=100,type=indirect,bucket=actions=output:2
>
> $ ovs-ofctl -Oopenflow13 --may-create mod-group br-int
> group_id=100,type=indirect,bucket=actions=2
>
> $ ovs-ofctl -Oopenflow13 dump-groups br-int
> OFPST_GROUP_DESC reply (OF1.3) (xid=0x2):
> group_id=100,type=indirect,bucket=actions=output:2
>
> $ ovs-ofctl -Oopenflow13 --may-create mod-group br-int
> group_id=100,type=indirect,bucket=actions=3
>
> $ ovs-ofctl -Oopenflow13 dump-groups br-int
> OFPST_GROUP_DESC reply (OF1.3) (xid=0x2):
> group_id=100,type=indirect,bucket=actions=output:3
>
> Patch v3:
> - Rebased to master
>
> Patch v2:
> - Replaced new ovs-ofctl write-group command with --may-create option for
> mod-group
> - Updated ovs-ofctl --help message
> - Added a test for the new command option
> - Updated documentation
>
> Signed-off-by: Jan Scheurich <jan.scheurich at web.de>
Thanks for the patch! I applied this to master, folding in the
following incremental.
--8<--------------------------cut here-------------------------->8--
diff --git a/utilities/ovs-ofctl.8.in b/utilities/ovs-ofctl.8.in
index d69fe13..94e78d7 100755
--- a/utilities/ovs-ofctl.8.in
+++ b/utilities/ovs-ofctl.8.in
@@ -434,7 +434,11 @@ Add each group entry to \fIswitch\fR's tables.
.IP "[\fB\-\-may\-create\fR] \fBmod\-group \fIswitch group\fR"
.IQ "[\fB\-\-may\-create\fR] \fBmod\-group \fIswitch \fB\- < \fIfile\fR"
Modify the action buckets in entries from \fIswitch\fR's tables for
-each group entry. Optionally create non-existing group entries.
+each group entry. If a specified group does not already exist, then
+without \fB\-\-may\-create\fR, this command has no effect; with
+\fB\-\-may\-create\fR, it creates a new group. The
+\fB\-\-may\-create\fR option uses an Open vSwitch extension to
+OpenFlow only implemented in Open vSwitch 2.6 and later.
.
.IP "\fBdel\-groups \fIswitch\fR"
.IQ "\fBdel\-groups \fIswitch \fR[\fIgroup\fR]"
@@ -2944,14 +2948,8 @@ Bundles require OpenFlow 1.4 or higher. An explicit
\fB-O
OpenFlow14\fR option is not needed, but you may need to enable
OpenFlow 1.4 support for OVS by setting the OVSDB \fIprotocols\fR
column in the \fIbridge\fR table.
-.
.RE
.
-.IP "\fB\-\-may\-create\fR"
-A mod-group command creates a group if it doesn't exist yet. This uses
-an Open vSwitch extension to OpenFlow and only works with Open vSwitch
-2.6 and later.
-.
.so lib/ofp-version.man
.
.IP "\fB\-F \fIformat\fR[\fB,\fIformat\fR...]"
diff --git a/utilities/ovs-ofctl.c b/utilities/ovs-ofctl.c
index 0bf8e44..8b02722 100644
--- a/utilities/ovs-ofctl.c
+++ b/utilities/ovs-ofctl.c
@@ -84,9 +84,9 @@ static bool enable_color;
*/
static bool strict;
-/* --may-create: A mod-group command creates a group that does not yet exist.
- */
-static bool may_create = false;
+/* --may-create: If true, the mod-group command creates a group that does not
+ * yet exist; otherwise, such a command has no effect. */
+static bool may_create;
/* --readd: If true, on replace-flows, re-add even flows that have not changed
* (to reset flow counters). */
@@ -416,7 +416,7 @@ usage(void)
" snoop SWITCH snoop on SWITCH and its controller\n"
" add-group SWITCH GROUP add group described by GROUP\n"
" add-groups SWITCH FILE add group from FILE\n"
- " mod-group SWITCH GROUP modify specific group\n"
+ " [--may-create] mod-group SWITCH GROUP modify specific group\n"
" del-groups SWITCH [GROUP] delete matching GROUPs\n"
" insert-buckets SWITCH [GROUP] add buckets to GROUP\n"
" remove-buckets SWITCH [GROUP] remove buckets from GROUP\n"
@@ -452,7 +452,6 @@ usage(void)
vlog_usage();
printf("\nOther options:\n"
" --strict use strict match for flow commands\n"
- " --may-create mod-group creates a non-existing
group\n"
" --readd replace flows that haven't changed\n"
" -F, --flow-format=FORMAT force particular flow format\n"
" -P, --packet-in-format=FRMT force particular packet in format\n"
_______________________________________________
dev mailing list
[email protected]
http://openvswitch.org/mailman/listinfo/dev