--- openflow-2013-06-21.h	2015-07-23 09:54:17.492479376 -0700
+++ openflow-2013-06-21-2.h	2015-07-23 09:54:17.496479376 -0700
@@ -158,6 +158,10 @@
 
     /* Request forwarding by the switch. */
     OFPT_REQUESTFORWARD     = 32, /* Async message */
+
+    /* Bundle operations (multiple messages as a single operation). */
+    OFPT_BUNDLE_CONTROL     = 33,
+    OFPT_BUNDLE_ADD_MESSAGE = 34,
 };
 
 /* Header on all OpenFlow packets. */
@@ -1632,6 +1636,7 @@
     OFPET_BAD_PROPERTY         = 14, /* Some property is invalid. */
     OFPET_ASYNC_CONFIG_FAILED  = 15, /* Asynchronous config request failed. */
     OFPET_FLOW_MONITOR_FAILED  = 16, /* Setting flow monitor failed. */
+    OFPET_BUNDLE_FAILED        = 17, /* Bundle operation failed. */
     OFPET_EXPERIMENTER = 0xffff      /* Experimenter error messages. */
 };
 
@@ -1892,6 +1897,27 @@
     OFPMOFC_BAD_OUT       = 7,  /* Error in output port/group. */
 };
 
+/* ofp_error_msg 'code' values for OFPET_BUNDLE_FAILED.  'data' contains
+ * at least the first 64 bytes of the failed request. */
+enum ofp_bundle_failed_code {
+  OFPBFC_UNKNOWN        = 0,  /* Unspecified error. */
+  OFPBFC_EPERM          = 1,  /* Permissions error. */
+  OFPBFC_BAD_ID         = 2,  /* Bundle ID doesn't exist. */
+  OFPBFC_BUNDLE_EXIST   = 3,  /* Bundle ID already exist. */
+  OFPBFC_BUNDLE_CLOSED  = 4,  /* Bundle ID is closed. */
+  OFPBFC_OUT_OF_BUNDLES = 5,  /* Too many bundles IDs. */
+  OFPBFC_BAD_TYPE       = 6,  /* Unsupported or unknown message control type. */
+  OFPBFC_BAD_FLAGS      = 7,  /* Unsupported, unknown, or inconsistent flags. */
+  OFPBFC_MSG_BAD_LEN    = 8,  /* Length problem in included message. */
+  OFPBFC_MSG_BAD_XID    = 9,  /* Inconsistent or duplicate XID. */
+  OFPBFC_MSG_UNSUP      = 10, /* Unsupported message in this bundle. */
+  OFPBFC_MSG_CONFLICT   = 11, /* Unsupported message combination in this bundle. */
+  OFPBFC_MSG_TOO_MANY   = 12, /* Can’t handle this many messages in bundle. */
+  OFPBFC_MSG_FAILED     = 13, /* One message in bundle failed. */
+  OFPBFC_TIMEOUT        = 14, /* Bundle is taking too long. */
+  OFPBFC_BUNDLE_IN_PROGRESS = 15, /* Bundle is locking the resource. */
+};
+
 /* OFPT_ERROR: Error message (datapath -> controller). */
 struct ofp_error_msg {
     struct ofp_header header;
@@ -2973,4 +2999,81 @@
 };
 OFP_ASSERT(sizeof(struct ofp_requestforward_header) == 16);
 
+/* Bundle property types. */
+enum ofp_bundle_prop_type {
+    OFPBPT_EXPERIMENTER           = 0xFFFF, /* Experimenter property. */
+};
+
+/* Common header for all Bundle Properties */
+struct ofp_bundle_prop_header {
+    uint16_t         type;    /* One of OFPBPT_*. */
+    uint16_t         length;  /* Length in bytes of this property. */
+};
+OFP_ASSERT(sizeof(struct ofp_bundle_prop_header) == 4);
+
+/* Experimenter bundle property */
+struct ofp_bundle_prop_experimenter {
+    uint16_t         type;    /* OFPBPT_EXPERIMENTER. */
+    uint16_t         length;  /* Length in bytes of this property. */
+    uint32_t         experimenter;  /* Experimenter ID which takes the same
+                                       form as in struct
+                                       ofp_experimenter_header. */
+    uint32_t         exp_type;      /* Experimenter defined. */
+    /* Followed by:
+     *   - Exactly (length - 12) bytes containing the experimenter data, then
+     *   - Exactly (length + 7)/8*8 - (length) (between 0 and 7)
+     *     bytes of all-zero bytes */
+    uint32_t         experimenter_data[0];
+};
+OFP_ASSERT(sizeof(struct ofp_bundle_prop_experimenter) == 12);
+
+/* Bundle control message types */
+enum ofp_bundle_ctrl_type {
+    OFPBCT_OPEN_REQUEST    = 0,
+    OFPBCT_OPEN_REPLY      = 1,
+    OFPBCT_CLOSE_REQUEST   = 2,
+    OFPBCT_CLOSE_REPLY     = 3,
+    OFPBCT_COMMIT_REQUEST  = 4,
+    OFPBCT_COMMIT_REPLY    = 5,
+    OFPBCT_DISCARD_REQUEST = 6,
+    OFPBCT_DISCARD_REPLY   = 7,
+};
+
+/* Bundle configuration flags. */
+enum ofp_bundle_flags {
+    OFPBF_ATOMIC  = 1 << 0,  /* Execute atomically. */
+    OFPBF_ORDERED = 1 << 1,  /* Execute in specified order. */
+};
+
+/* Message structure for OFPT_BUNDLE_CONTROL. */
+struct ofp_bundle_ctrl_msg {
+    struct ofp_header     header;
+    uint32_t              bundle_id;      /* Identify the bundle. */
+    uint16_t              type;           /* OFPBCT_*. */
+    uint16_t              flags;          /* Bitmap of OFPBF_* flags. */
+
+    /* Bundle Property list. */
+    struct ofp_bundle_prop_header properties[0]; /* Zero or more properties. */
+};
+OFP_ASSERT(sizeof(struct ofp_bundle_ctrl_msg) == 16);
+
+/* Message structure for OFPT_BUNDLE_ADD_MESSAGE.
+ * Adding a message in a bundle is done with. */
+struct ofp_bundle_add_msg {
+    struct ofp_header     header;
+    uint32_t              bundle_id;      /* Identify the bundle. */
+    uint16_t              pad;            /* Align to 64 bits. */
+    uint16_t              flags;          /* Bitmap of OFPBF_* flags. */
+
+    struct ofp_header     message;        /* Message added to the bundle. */
+
+    /* If there is one property or more, 'message' is followed by:
+     *   - Exactly (message.length + 7)/8*8 - (message.length) (between 0 and 7)
+     *     bytes of all-zero bytes */
+
+    /* Bundle Property list. */
+    //struct ofp_bundle_prop_header properties[0]; /* Zero or more properties. */
+};
+OFP_ASSERT(sizeof(struct ofp_bundle_add_msg) == 24);
+
 #endif /* openflow/openflow.h */
