--- openflow-2012-10-01.h	2015-07-23 09:54:17.348479370 -0700
+++ openflow-2012-10-03.h	2015-07-23 09:54:17.356479371 -0700
@@ -2511,28 +2511,16 @@
  * for OFPMP_FLOW.
  *
  * 'id' identifies a particular monitor for the purpose of allowing it to be
- * canceled later with OFP_FLOW_MONITOR_CANCEL.  'id' must be unique among
+ * canceled later with OFPFMC_DELETE.  'id' must be unique among
  * existing monitors that have not already been canceled.
- *
- * The reply includes the initial flow matches for monitors that have the
- * OFPFMF_INITIAL flag set.  No single flow will be included in the reply more
- * than once, even if more than one requested monitor matches that flow.  The
- * reply will be empty if none of the monitors has OFPFMF_INITIAL set or if none
- * of the monitors initially matches any flows.
- *
- * For OFPFMF_ADD, an event will be reported if 'out_port' matches against the
- * actions of the flow being added or, for a flow that is replacing an existing
- * flow, if 'out_port' matches against the actions of the flow being replaced.
- * For OFPFMF_DELETE, 'out_port' matches against the actions of a flow being
- * deleted.  For OFPFMF_MODIFY, an event will be reported if 'out_port' matches
- * either the old or the new actions. */
+ */
 struct ofp_flow_monitor_request {
-    uint32_t id;                /* Controller-assigned ID for this monitor. */
-    uint32_t flags;             /* OFFMF_*. */
+    uint32_t monitor_id;        /* Controller-assigned ID for this monitor. */
     uint32_t out_port;          /* Required output port, if not OFPP_ANY. */
-    uint8_t table_id;           /* One table's ID or 0xff for all tables. */
+    uint32_t out_group;         /* Required output port, if not OFPG_ANY. */
+    uint16_t flags;             /* OFFMF_*. */
+    uint8_t table_id;           /* One table's ID or OFPTT_ALL (all tables). */
     uint8_t command;            /* One of OFPFMC_*. */
-    uint8_t zeros[3];           /* Align to 64 bits (must be zero). */
     struct ofp_match match;     /* Fields to match. Variable size. */
 };
 OFP_ASSERT(sizeof(struct ofp_flow_monitor_request) == 24);
@@ -2540,8 +2528,8 @@
 /* Flow monitor commands */
 enum ofp_flow_monitor_command {
     OFPFMC_ADD    = 0,       /* New flow monitor. */
-    OFPFMC_MODIFY = 1,       /* Modify flow monitor. */
-    OFPFMC_DELETE = 2,       /* Delete flow monitor. */
+    OFPFMC_MODIFY = 1,       /* Modify existing flow monitor. */
+    OFPFMC_DELETE = 2,       /* Delete/cancel existing flow monitor. */
 };
 
 /* 'flags' bits in struct of_flow_monitor_request. */
@@ -2592,16 +2580,16 @@
 struct ofp_flow_update_full {
     uint16_t length;            /* Length is 24. */
     uint16_t event;             /* One of OFPFME_*. */
-    uint64_t cookie;            /* Opaque controller-issued identifier. */
     uint8_t table_id;           /* ID of flow's table. */
     uint8_t reason;             /* OFPRR_* for OFPFME_DELETED, else zero. */
     uint16_t idle_timeout;      /* Number of seconds idle before expiration. */
     uint16_t hard_timeout;      /* Number of seconds before expiration. */
     uint16_t priority;          /* Priority of the entry. */
     uint8_t zeros[4];           /* Reserved, currently zeroed. */
+    uint64_t cookie;            /* Opaque controller-issued identifier. */
     struct ofp_match match;     /* Fields to match. Variable size. */
     /*     Instruction set.
-     *     If OFPFMF_ACTIONS was not specified, or 'event' is
+     *     If OFPFMF_INSTRUCTIONS was not specified, or 'event' is
      *     OFPFME_DELETED, no instructions are included.
      */
     //struct ofp_instruction instructions[0];
@@ -2615,35 +2603,8 @@
  * OpenFlow channel) will be abbreviated, when possible, to this form, which
  * simply specifies the 'xid' of the OpenFlow request (e.g. an OFPT_FLOW_MOD)
  * that caused the change.
- *
- * Some changes cannot be abbreviated and will be sent in full:
- *
- *   - Changes that only partially succeed.  This can happen if, for example,
- *     a flow_mod with type OFPFC_MODIFY affects multiple flows, but only some
- *     of those modifications succeed (e.g. due to hardware limitations).
- *
- *     This cannot occur with the current implementation of the Open vSwitch
- *     software datapath.  It could happen with other datapath implementations.
- *
- *   - Changes that race with conflicting changes made by other controllers or
- *     other flow_mods (not separated by barriers) by the same controller.
- *
- *     This cannot occur with the current Open vSwitch implementation
- *     (regardless of datapath) because Open vSwitch internally serializes
- *     potentially conflicting changes.
- *
- * A flow_mod that does not change the flow table will not trigger any
- * notification, even an abbreviated one.  For example, a "modify" or "delete"
- * flow_mod that does not match any flows will not trigger a notification.
- * Whether an "add" or "modify" that specifies all the same parameters that a
- * flow already has triggers a notification is unspecified and subject to
- * change in future versions of Open vSwitch.
- *
- * OVS will always send the notifications for a given flow table change before
- * the reply to a OFPT_BARRIER_REQUEST request that precedes the flow table
- * change.  Thus, if the controller does not receive an abbreviated
- * notification for a flow_mod before the next OFPT_BARRIER_REPLY, it will
- * never receive one. */
+ * Some changes cannot be abbreviated and will be sent in full.
+ */
 struct ofp_flow_update_abbrev {
     uint16_t length;            /* Length is 8. */
     uint16_t event;             /* OFPFME_ABBREV. */
