--- openflow-2014-03-17.h	2015-07-23 09:54:18.016479397 -0700
+++ openflow-2014-03-18.h	2015-07-23 09:54:18.024479398 -0700
@@ -740,12 +740,10 @@
     OFPXMT_OFB_PBB_UCA        = 41, /* PBB UCA header field. */
     OFPXMT_OFB_TCP_FLAGS      = 42, /* TCP flags. */
     OFPXMT_OFB_ACTSET_OUTPUT  = 43, /* Output port from action set metadata. */
-    OFPXMT_OFB_ETHERNET       = 44, /* Root type for Ethernet packets. */
-    OFPXMT_OFB_IP_VERSION     = 45, /* IP version, root type for IP packet. */
-    OFPXMT_OFB_NO_PACKET      = 46, /* Root type for circuit switches. */
+    OFPXMT_OFB_ROOT_TYPE      = 44, /* Root type value. */
 };
 
-#define OFPXMT_OFB_ALL    ((UINT64_C(1) << 47) - 1)
+#define OFPXMT_OFB_ALL    ((UINT64_C(1) << 45) - 1)
 
 /* OpenFlow port on which the packet was received.
  * May be a physical port, a logical port, or the reserved port OFPP_LOCAL
@@ -878,7 +876,7 @@
  *
  * Prereqs:
  *   either OXM_OF_ETH_TYPE must be either 0x0800 or 0x86dd,
- *   or OXM_OF_IP_VERSION must be either 4 or 6.
+ *   or ROOT_TYPE must be either (1,0x800) or (1,0x86dd).
  *
  * Format: 8-bit integer with 2 most-significant bits forced to 0.
  * Only the lower 6 bits have meaning.
@@ -891,7 +889,7 @@
  *
  * Prereqs:
  *   either OXM_OF_ETH_TYPE must be either 0x0800 or 0x86dd,
- *   or OXM_OF_IP_VERSION must be either 4 or 6.
+ *   or ROOT_TYPE must be either (1,0x800) or (1,0x86dd).
  *
  * Format: 8-bit integer with 6 most-significant bits forced to 0.
  * Only the lower 2 bits have meaning.
@@ -903,7 +901,7 @@
  *
  * Prereqs:
  *   either OXM_OF_ETH_TYPE must be either 0x0800 or 0x86dd,
- *   or OXM_OF_IP_VERSION must be either 4 or 6.
+ *   or ROOT_TYPE must be either (1,0x800) or (1,0x86dd).
  *
  * Format: 8-bit integer.
  *
@@ -914,7 +912,7 @@
  *
  * Prereqs:
  *   either OXM_OF_ETH_TYPE must match 0x0800 exactly,
- *   or OXM_OF_IP_VERSION must match 4 exactly.
+ *   or ROOT_TYPE must match (1,0x800) exactly.
  *
  * Format: 32-bit integer in network byte order.
  *
@@ -929,7 +927,7 @@
  *
  * Prereqs:
  *   either OXM_OF_ETH_TYPE must be either 0x0800 or 0x86dd,
- *   or OXM_OF_IP_VERSION must be either 4 or 6,
+ *   or ROOT_TYPE must be either (1,0x800) or (1,0x86dd),
  *   OXM_OF_IP_PROTO must match 6 exactly.
  *
  * Format: 16-bit integer in network byte order.
@@ -954,7 +952,7 @@
  *
  * Prereqs:
  *   either OXM_OF_ETH_TYPE must match either 0x0800 or 0x86dd,
- *   or OXM_OF_IP_VERSION must match either 4 or 6,
+ *   or ROOT_TYPE must be either (1,0x800) or (1,0x86dd),
  *   OXM_OF_IP_PROTO must match 17 exactly.
  *
  * Format: 16-bit integer in network byte order.
@@ -967,7 +965,7 @@
  *
  * Prereqs:
  *   either OXM_OF_ETH_TYPE must match either 0x0800 or 0x86dd,
- *   or OXM_OF_IP_VERSION must match either 4 or 6,
+ *   or ROOT_TYPE must be either (1,0x800) or (1,0x86dd),
  *   OXM_OF_IP_PROTO must match 132 exactly.
  *
  * Format: 16-bit integer in network byte order.
@@ -980,7 +978,7 @@
  *
  * Prereqs:
  *   either OXM_OF_ETH_TYPE must match 0x0800 exactly,
- *   or OXM_OF_IP_VERSION must match 4 exactly,
+ *   or ROOT_TYPE must match (1,0x800) exactly.
  *   OXM_OF_IP_PROTO must match 1 exactly.
  *
  * Format: 8-bit integer.
@@ -1030,7 +1028,7 @@
  *
  * Prereqs:
  *   either OXM_OF_ETH_TYPE must match 0x86dd exactly,
- *   or OXM_OF_IP_VERSION must match 6 exactly.
+ *   or ROOT_TYPE must match (1,0x86dd) exactly.
  *
  * Format: 128-bit IPv6 address.
  *
@@ -1045,7 +1043,7 @@
  *
  * Prereqs:
  *   either OXM_OF_ETH_TYPE must match 0x86dd exactly,
- *   or OXM_OF_IP_VERSION must match 6 exactly.
+ *   or ROOT_TYPE must match (1,0x86dd) exactly.
  *
  * Format: 32-bit integer with 12 most-significant bits forced to 0.
  * Only the lower 20 bits have meaning.
@@ -1059,7 +1057,7 @@
  *
  * Prereqs:
  *   either OXM_OF_ETH_TYPE must match 0x86dd exactly,
- *   or OXM_OF_IP_VERSION must match 6 exactly,
+ *   or ROOT_TYPE must match (1,0x86dd) exactly,
  *   OXM_OF_IP_PROTO must match 58 exactly.
  *
  * Format: 8-bit integer.
@@ -1072,7 +1070,7 @@
  *
  * Prereqs:
  *   either OXM_OF_ETH_TYPE must match 0x86dd exactly,
- *   or OXM_OF_IP_VERSION must match 6 exactly,
+ *   or ROOT_TYPE must match (1,0x86dd) exactly,
  *   OXM_OF_IP_PROTO must match 58 exactly.
  *   OXM_OF_ICMPV6_TYPE must be either 135 or 136.
  *
@@ -1086,7 +1084,7 @@
  *
  * Prereqs:
  *   either OXM_OF_ETH_TYPE must match 0x86dd exactly,
- *   or OXM_OF_IP_VERSION must match 6 exactly,
+ *   or ROOT_TYPE must match (1,0x86dd) exactly,
  *   OXM_OF_IP_PROTO must match 58 exactly.
  *   OXM_OF_ICMPV6_TYPE must be exactly 135.
  *
@@ -1100,7 +1098,7 @@
  *
  * Prereqs:
  *   either OXM_OF_ETH_TYPE must match 0x86dd exactly,
- *   or OXM_OF_IP_VERSION must match 6 exactly,
+ *   or ROOT_TYPE must match (1,0x86dd) exactly,
  *   OXM_OF_IP_PROTO must match 58 exactly.
  *   OXM_OF_ICMPV6_TYPE must be exactly 136.
  *
@@ -1179,7 +1177,7 @@
  *
  * Prereqs:
  *   either OXM_OF_ETH_TYPE must match 0x86dd exactly,
- *   or OXM_OF_IP_VERSION must match 6 exactly.
+ *   or ROOT_TYPE must match (1,0x86dd) exactly.
  *
  * Format: 16-bit integer with 7 most-significant bits forced to 0.
  * Only the lower 9 bits have meaning.
@@ -1230,49 +1228,18 @@
  * Masking: Not maskable. */
 #define OXM_OF_ACTSET_OUTPUT OXM_HEADER  (0x8000, OFPXMT_OFB_ACTSET_OUTPUT, 4)
 
-/* Ethernet root type.
+/* Root type.
  *
- * Root type for Ethernet packets, the most common packet type for OpenFlow.
- * Match may include Ethernet destination & source address, Ethertype...
- * Packet-in includes the Ethernet header and the Ethernet payload (optionally
- * padded) of an Ethernet frame.
- * Packet-in does not include the preamble, the start of frame, the Ethernet
- * CRC/FCS and the interframe gap.
- * This root type is optional as it is the default.
+ * Root type to identify packets. This is the canonical header type of
+ * the outermost header.
+ * If not specified, default to Ethernet header type.
  *
  * Prereqs: None.
  *
- * Format: No payload - 0 bits.
+ * Format: 16-bit integer for namespace followed by 16 bit interget for ns_type.
  *
  * Masking: Not maskable. */
-#define OXM_OF_ETHERNET   OXM_HEADER  (0x8000, OFPXMT_OFB_ETHERNET, 0)
-
-/* IP version.
- *
- * IP version header, 0x4 for IPv4 packets, 0x6 for IPv6 packets.
- * Root type for IP packets, only used for bare IP packets, with
- * no header in front of the IP header.
- * Packet-in includes the IP header and the IP payload of an IP datagram.
- *
- * Prereqs: None.
- *
- * Format: 8-bit integer with 4 most-significant bits forced to 0.
- * Only the lower 4 bits has meaning.
- *
- * Masking: Not maskable. */
-#define OXM_OF_IP_VERSION  OXM_HEADER  (0x8000, OFPXMT_OFB_IP_VERSION, 1)
-
-/* No packet.
- *
- * Root type for tables that don't match packets. Those tables would only
- * match pipeline fields. For example, may be used in circuit switches.
- *
- * Prereqs: None.
- *
- * Format: No payload - 0 bits.
- *
- * Masking: Not maskable. */
-#define OXM_OF_NO_PACKET  OXM_HEADER  (0x8000, OFPXMT_OFB_NO_PACKET, 0)
+#define OXM_OF_ROOT_TYPE  OXM_HEADER  (0x8000, OFPXMT_OFB_ROOT_TYPE, 4)
 
 /* Header for OXM experimenter match fields.
  * The experimenter class should not use OXM_HEADER() macros for defining
@@ -2747,8 +2714,7 @@
                                  OFPTFPT_WRITE_COPYFIELD,
                                  OFPTFPT_WRITE_COPYFIELD_MISS,
                                  OFPTFPT_APPLY_COPYFIELD,
-                                 OFPTFPT_APPLY_COPYFIELD_MISS,
-                                 OFPTFPT_ROOT_TYPES. */
+                                 OFPTFPT_APPLY_COPYFIELD_MISS. */
     uint16_t         length;  /* Length in bytes of this property. */
     /* Followed by:
      *   - Exactly (length - 4) bytes containing the oxm_ids, then
@@ -2758,6 +2724,18 @@
 };
 OFP_ASSERT(sizeof(struct ofp_table_feature_prop_oxm) == 4);
 
+/* Root types property */
+struct ofp_table_feature_prop_oxm_values {
+    uint16_t         type;    /* OFPTFPT_ROOT_TYPES. */
+    uint16_t         length;  /* Length in bytes of this property. */
+    /* Followed by:
+     *   - 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_values[0];   /* Array of OXM values */
+};
+OFP_ASSERT(sizeof(struct ofp_table_feature_prop_oxm_values) == 4);
+
 /* Experimenter table feature property */
 struct ofp_table_feature_prop_experimenter {
     uint16_t         type;    /* One of OFPTFPT_EXPERIMENTER,
