--- openflow-2012-02-29-5.h	2015-07-23 09:54:17.096479360 -0700
+++ openflow-2012-03-19-2.h	2015-07-23 09:54:17.100479360 -0700
@@ -1823,84 +1823,99 @@
 };
 OFP_ASSERT(sizeof(struct ofp_aggregate_stats_reply) == 24);
 
+/* Table Feature property types.
+ * Low order bit cleared indicates a property for a regular Flow Entry.
+ * Low order bit set indicates a property for the Table-Miss Flow Entry.
+ */
+enum ofp_table_feature_prop_type {
+    OFPTFPT_INSTRUCTIONS           = 0,  /* Instructions property. */
+    OFPTFPT_INSTRUCTIONS_MISS      = 1,  /* Instructions for table-miss. */
+    OFPTFPT_NEXT_TABLES            = 2,  /* Next Table property. */
+    OFPTFPT_NEXT_TABLES_MISS       = 3,  /* Next Table for table-miss. */
+    OFPTFPT_WRITE_ACTIONS          = 4,  /* Write Actions property. */
+    OFPTFPT_WRITE_ACTIONS_MISS     = 5,  /* Write Actions for table-miss. */
+    OFPTFPT_APPLY_ACTIONS          = 6,  /* Apply Actions property. */
+    OFPTFPT_APPLY_ACTIONS_MISS     = 7,  /* Apply Actions for table-miss. */
+    OFPTFPT_MATCH                  = 8,  /* Match property. */
+    OFPTFPT_WILDCARDS              = 10, /* Wildcards property. */
+    OFPTFPT_WRITE_SETFIELD         = 12, /* Write Set-Field property. */
+    OFPTFPT_WRITE_SETFIELD_MISS    = 13, /* Write Set-Field for table-miss. */
+    OFPTFPT_APPLY_SETFIELD         = 14, /* Apply Set-Field property. */
+    OFPTFPT_APPLY_SETFIELD_MISS    = 15, /* Apply Set-Field for table-miss. */
+};
+
+/* Common header for all Table Feature Properties */
+struct ofp_table_feature_prop_header {
+    uint16_t         type;    /* One of OFPTFPT_*. */
+    uint16_t         len;     /* Length in bytes of this property. */
+};
+OFP_ASSERT(sizeof(struct ofp_table_feature_prop_header) == 4);
+
+/* Instructions property */
+struct ofp_table_feature_prop_instructions {
+    uint16_t         type;    /* One of OFPTFPT_*. */
+    uint16_t         len;     /* Length in bytes of this property. */
+    /* Followed by:
+     *   - Exactly len bytes containing the instruction ids, then
+     *   - Exactly (len + 7)/8*8 - (len) (between 0 and 7)
+     *     bytes of all-zero bytes */
+    uint16_t         instruction_ids[0];
+};
+OFP_ASSERT(sizeof(struct ofp_table_feature_prop_instructions) == 4);
+
+/* Next Tables property */
+struct ofp_table_feature_prop_next_tables {
+    uint16_t         type;    /* One of OFPTFPT_*. */
+    uint16_t         len;     /* Length in bytes of this property. */
+    /* Followed by:
+     *   - Exactly len bytes containing the table_ids, then
+     *   - Exactly (len + 7)/8*8 - (len) (between 0 and 7)
+     *     bytes of all-zero bytes */
+    uint8_t          next_table_ids[0];
+};
+OFP_ASSERT(sizeof(struct ofp_table_feature_prop_next_tables) == 4);
+
+/* Actions property */
+struct ofp_table_feature_prop_actions {
+    uint16_t         type;    /* One of OFPTFPT_*. */
+    uint16_t         len;     /* Length in bytes of this property. */
+    /* Followed by:
+     *   - Exactly len bytes containing the action_ids, then
+     *   - Exactly (len + 7)/8*8 - (len) (between 0 and 7)
+     *     bytes of all-zero bytes */
+    uint16_t         action_ids[0];
+};
+OFP_ASSERT(sizeof(struct ofp_table_feature_prop_actions) == 4);
+
+/* Match, Wildcard or Set-Field property */
+struct ofp_table_feature_prop_oxm {
+    uint16_t         type;    /* One of OFPTFPT_*. */
+    uint16_t         len;     /* Length in bytes of this property. */
+    /* Followed by:
+     *   - Exactly len bytes containing the oxm_ids, then
+     *   - Exactly (len + 7)/8*8 - (len) (between 0 and 7)
+     *     bytes of all-zero bytes */
+    uint32_t         oxm_ids[0];
+};
+OFP_ASSERT(sizeof(struct ofp_table_feature_prop_oxm) == 4);
+
+/* Body for ofp_multipart_request of type OFPMP_TABLE_FEATURES./
+ * Body of reply to OFPMP_TABLE_FEATURES request. */
 struct ofp_table_features {
+    uint16_t len;            /* Length is padded to 64 bits. */
     uint8_t table_id;        /* Identifier of table.  Lower numbered tables
                                 are consulted first. */
-    uint8_t pad[7];          /* Align to 64-bits. */
+    uint8_t pad[5];          /* Align to 64-bits. */
     char name[OFP_MAX_TABLE_NAME_LEN];
     uint64_t metadata_match; /* Bits of metadata table can match. */
     uint64_t metadata_write; /* Bits of metadata table can write. */
     uint32_t config;         /* Bitmap of OFPTC_* values */
     uint32_t max_entries;    /* Max number of entries supported. */
-    uint8_t  next_tables_length;     /* Length (bytes) of
-                                        next_tables. */
-    uint8_t pad2[1];
-    uint16_t match_length;           /* Length (bytes) of
-                                        supported_match_hdrs */
-    uint16_t write_setfields_length; /* Length (bytes) of
-                                        supported_write_setfield_hdrs */
-    uint16_t apply_setfields_length; /* Length (bytes) of
-                                        supported_apply_setfields_hdrs */ 
-    uint16_t instructions_length;    /* Length (bytes) of
-                                        supported_instruction_hdrs */
-    uint16_t write_actions_length;   /* Length (bytes) of
-                                        supported_write_action_hdrs */
-    uint16_t apply_actions_length;   /* Length (bytes) of
-                                        supported_apply_action_hdrs */
-    uint16_t write_setfields_miss_length; /* Length (bytes) of
-                                             supported_write_setfield_hdrs_miss
-                                             */
-    uint16_t apply_setfields_miss_length; /* Length (bytes) of
-                                             supported_apply_setfields_hdrs_miss
-                                             */ 
-    uint16_t instructions_miss_length;    /* Length (bytes) of
-                                             supported_instruction_hdrs_miss */
-    uint16_t write_actions_miss_length;   /* Length (bytes) of
-                                             supported_write_action_hdrs_miss */
-    uint16_t apply_actions_miss_length;   /* Length (bytes) of
-                                             supported_apply_action_hdrs_miss */
-
-    /***
-     *  ofp_table_features includes twelve variable length lists of headers.
-     *  The names and types here are provided for intuition and cannot
-     *  be referenced directly from the C structure. After each array there
-     *  is an implicit array containing padding if the array's length is not
-     *  a multiple of 8 bytes.  The actual offsets to each array
-     *  must be calculated from the XXX_length fields, e.g., the offset
-     *  for supported_apply_setfields[] is:
-     *    let:
-     *      next_tables = 3
-     *      match_length = 2
-     *      write_setfields_length = 1
-     *
-     *  sizeof(ofp_table_features) + next_tables_length + 5 + match_length +
-     *      0 + write_setfields_length + 4
-     *
-     *  OXM lists includes both 4 byte standard OXM headers and
-     *  8 byte OXM experimental headers
-     *      uint8_t                  next_tables[];
-     *      uint32_t                 supported_match_hdrs[];
-     *      uint32_t                 supported_write_setfields_hdrs[];
-     *      uint32_t                 supported_apply_setfields_hdrs[];
-     *
-     *  Action and instruction lists contain both both standard length
-     *  and experimental length headers of each type
-     *      struct ofp_instruction   supported_instruction_hdrs[];
-     *      struct ofp_action_header supported_write_action_hdrs[];
-     *      struct ofp_action_header supported_apply_action_hdrs[];
-     *
-     *  The table-miss flow entry may support different set fields,
-     *  instructions, and actions than the rest of the table. Those that
-     *  it supports are contained in the following arrays.
-     *
-     *      uint32_t                 supported_write_setfields_hdrs_miss[];
-     *      uint32_t                 supported_apply_setfields_hdrs_miss[];
-     *      struct ofp_instruction   supported_instruction_hdrs_miss[];
-     *      struct ofp_action_header supported_write_action_hdrs_miss[];
-     *      struct ofp_action_header supported_apply_action_hdrs_miss[];
-     */
+
+    /* Table Feature Properties */
+    struct ofp_table_feature_prop_header properties[0];
 };
-OFP_ASSERT(sizeof(struct ofp_table_features) == 88);
+OFP_ASSERT(sizeof(struct ofp_table_features) == 64);
 
 /* Body of reply to OFPMP_TABLE request. */
 struct ofp_table_stats {
