--- openflow-2012-03-19-2.h	2015-07-23 09:54:17.100479360 -0700
+++ openflow-2012-03-20.h	2015-07-23 09:54:17.104479360 -0700
@@ -1842,22 +1842,24 @@
     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. */
+    OFPTFPT_EXPERIMENTER           = 0xFFFE, /* Experimenter property. */
+    OFPTFPT_EXPERIMENTER_MISS      = 0xFFFF, /* Experimenter 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. */
+    uint16_t         length;  /* 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. */
+    uint16_t         length;  /* 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)
+     *   - Exactly (length - 4) bytes containing the instruction ids, then
+     *   - Exactly (length + 7)/8*8 - (length) (between 0 and 7)
      *     bytes of all-zero bytes */
     uint16_t         instruction_ids[0];
 };
@@ -1866,10 +1868,10 @@
 /* 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. */
+    uint16_t         length;  /* 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)
+     *   - Exactly (length - 4) bytes containing the table_ids, then
+     *   - Exactly (length + 7)/8*8 - (length) (between 0 and 7)
      *     bytes of all-zero bytes */
     uint8_t          next_table_ids[0];
 };
@@ -1878,10 +1880,10 @@
 /* Actions property */
 struct ofp_table_feature_prop_actions {
     uint16_t         type;    /* One of OFPTFPT_*. */
-    uint16_t         len;     /* Length in bytes of this property. */
+    uint16_t         length;  /* 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)
+     *   - Exactly (length - 4) bytes containing the action_ids, then
+     *   - Exactly (length + 7)/8*8 - (length) (between 0 and 7)
      *     bytes of all-zero bytes */
     uint16_t         action_ids[0];
 };
@@ -1890,19 +1892,35 @@
 /* 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. */
+    uint16_t         length;  /* 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)
+     *   - Exactly (length - 4) bytes containing the oxm_ids, then
+     *   - Exactly (length + 7)/8*8 - (length) (between 0 and 7)
      *     bytes of all-zero bytes */
     uint32_t         oxm_ids[0];
 };
 OFP_ASSERT(sizeof(struct ofp_table_feature_prop_oxm) == 4);
 
+/* Experimenter table feature property */
+struct ofp_table_feature_prop_experimenter {
+    uint16_t         type;    /* One of OFPTFPT_*. */
+    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_table_feature_prop_experimenter) == 12);
+
 /* 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. */
+    uint16_t length;         /* Length is padded to 64 bits. */
     uint8_t table_id;        /* Identifier of table.  Lower numbered tables
                                 are consulted first. */
     uint8_t pad[5];          /* Align to 64-bits. */
