--- openflow-2014-04-08.h	2015-07-23 09:54:17.756479387 -0700
+++ openflow-2014-05-08.h	2015-07-23 09:54:17.764479387 -0700
@@ -3038,6 +3038,49 @@
 };
 OFP_ASSERT(sizeof(struct ofp_flow_update_paused) == 8);
 
+/* Controller status property types.
+ */
+enum ofp_controller_status_prop_type {
+    OFPCSPT_URI                    = 0,      /* Connection URI property. */
+    OFPCSPT_EXPERIMENTER           = 0xFFFF, /* Experimenter property. */
+};
+
+/* Common header for all Controller Status Properties */
+struct ofp_controller_status_prop_header {
+    uint16_t         type;    /* One of OFPCSPT_*. */
+    uint16_t         length;  /* Length in bytes of this property. */
+};
+OFP_ASSERT(sizeof(struct ofp_controller_status_prop_header) == 4);
+
+/* Connection URI controller status property */
+struct ofp_controller_status_prop_uri {
+    uint16_t         type;    /* OFPCSPT_URI. */
+    uint16_t         length;  /* Length in bytes of this property. */
+
+    /* Followed by:
+     *   - Exactly (length - 4) bytes containing Connection URI, then
+     *   - Exactly (length + 7)/8*8 - (length) (between 0 and 7)
+     *     bytes of all-zero bytes */
+    char             uri[0];
+};
+OFP_ASSERT(sizeof(struct ofp_controller_status_prop_uri) == 4);
+
+/* Experimenter controller status property */
+struct ofp_controller_status_prop_experimenter {
+    uint16_t         type;    /* OFPCSPT_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_controller_status_prop_experimenter) == 12);
+
 /* Why is the controller status being reported? */
 enum ofp_controller_status_reason {
     OFPCSR_REQUEST            = 0,  /* Controller requested status. */
@@ -3051,15 +3094,19 @@
 /* Body of OFPMP_CONTROLLER_STATUS reply message and body of async
  * OFPT_CONTROLLER_STATUS message */
 struct ofp_controller_status {
-   uint16_t length;            /* Length of struct, including variable URI. */
+   uint16_t length;            /* Length of this entry. */
    uint16_t short_id;          /* ID number which identifies the controller. */
    uint32_t role;              /* Controller's role. One of OFPCR_ROLE_*. */
    uint8_t reason;             /* One of OFPCSR_* reason codes. */
    uint8_t channel_status;     /* Status of control channel.
                                 * One of OFPCT_STATUS_*. */
-   char uri[0];                /* Connection URI for controller, null
-                                * terminated. */
+   uint8_t pad[6];             /* Align to 64-bits. */
+
+    /* Controller Status Property list.  The Connection URI property is
+       required; other properties are optional. */
+    struct ofp_controller_status_prop_header properties[0];
 };
+OFP_ASSERT(sizeof(struct ofp_controller_status) == 16);
 
 struct ofp_controller_status_header {
     struct ofp_header header;               /* Type OFPT_CONTROLLER_STATUS. */
