summaryrefslogtreecommitdiff
path: root/include/openflow
diff options
context:
space:
mode:
authorJan Scheurich <jan.scheurich@web.de>2016-06-29 00:29:25 +0200
committerBen Pfaff <blp@ovn.org>2016-07-02 21:10:32 -0700
commit88b87a36123e5ce3704b5e79950e83651db43ef7 (patch)
tree09c12f1d18fe6c61453be9a2569c2ac7ed64ad53 /include/openflow
parent2c5cbb15ff5231858df2608e8cd7ac46ff6bd78c (diff)
downloadopenvswitch-88b87a36123e5ce3704b5e79950e83651db43ef7.tar.gz
ofproto: Add relaxed group_mod command ADD_OR_MOD
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 Signed-off-by: Jan Scheurich <jan.scheurich at web.de> Signed-off-by: Ben Pfaff <blp@ovn.org>
Diffstat (limited to 'include/openflow')
-rw-r--r--include/openflow/openflow-1.1.h1
-rw-r--r--include/openflow/openflow-1.5.h1
2 files changed, 2 insertions, 0 deletions
diff --git a/include/openflow/openflow-1.1.h b/include/openflow/openflow-1.1.h
index 805f222ce..de2847543 100644
--- a/include/openflow/openflow-1.1.h
+++ b/include/openflow/openflow-1.1.h
@@ -172,6 +172,7 @@ enum ofp11_group_mod_command {
OFPGC11_ADD, /* New group. */
OFPGC11_MODIFY, /* Modify all matching groups. */
OFPGC11_DELETE, /* Delete all matching groups. */
+ OFPGC11_ADD_OR_MOD = 0x8000, /* Create new or modify existing group. */
};
/* OpenFlow 1.1 specific capabilities supported by the datapath (struct
diff --git a/include/openflow/openflow-1.5.h b/include/openflow/openflow-1.5.h
index 0c478d1f0..3649e6c29 100644
--- a/include/openflow/openflow-1.5.h
+++ b/include/openflow/openflow-1.5.h
@@ -59,6 +59,7 @@ enum ofp15_group_mod_command {
/* OFPGCXX_YYY = 4, */ /* Reserved for future use. */
OFPGC15_REMOVE_BUCKET = 5,/* Remove all action buckets or any specific
action bucket from matching group */
+ OFPGC15_ADD_OR_MOD = 0x8000, /* Create new or modify existing group. */
};
/* Group bucket property types. */