--- openflow-2011-09-30-3.h	2015-07-23 09:54:16.656479342 -0700
+++ openflow-2011-10-03-3.h	2015-07-23 09:54:16.660479342 -0700
@@ -627,29 +627,30 @@
 OFP_ASSERT(sizeof(struct ofp_match) == 8);
 
 /* Components of a OXM TLV header. */
-#define OXM_HEADER__(EXPERIMENTER, FIELD, HASMASK, LENGTH) \
-    (((EXPERIMENTER) << 16) | ((FIELD) << 9) | ((HASMASK) << 8) | (LENGTH))
-#define OXM_HEADER(EXPERIMENTER, FIELD, LENGTH) \
-    OXM_HEADER__(EXPERIMENTER, FIELD, 0, LENGTH)
-#define OXM_HEADER_W(EXPERIMENTER, FIELD, LENGTH) \
-    OXM_HEADER__(EXPERIMENTER, FIELD, 1, (LENGTH) * 2)
-#define OXM_EXPERIMENTER(HEADER) ((HEADER) >> 16)
+#define OXM_HEADER__(CLASS, FIELD, HASMASK, LENGTH) \
+    (((CLASS) << 16) | ((FIELD) << 9) | ((HASMASK) << 8) | (LENGTH))
+#define OXM_HEADER(CLASS, FIELD, LENGTH) \
+    OXM_HEADER__(CLASS, FIELD, 0, LENGTH)
+#define OXM_HEADER_W(CLASS, FIELD, LENGTH) \
+    OXM_HEADER__(CLASS, FIELD, 1, (LENGTH) * 2)
+#define OXM_CLASS(HEADER) ((HEADER) >> 16)
 #define OXM_FIELD(HEADER) (((HEADER) >> 9) & 0x7f)
 #define OXM_TYPE(HEADER) (((HEADER) >> 9) & 0x7fffff)
 #define OXM_HASMASK(HEADER) (((HEADER) >> 8) & 1)
 #define OXM_LENGTH(HEADER) ((HEADER) & 0xff)
 
 #define OXM_MAKE_WILD_HEADER(HEADER) \
-        OXM_HEADER_W(OXM_EXPERIMENTER(HEADER), OXM_FIELD(HEADER), OXM_LENGTH(HEADER))
+        OXM_HEADER_W(OXM_CLASS(HEADER), OXM_FIELD(HEADER), OXM_LENGTH(HEADER))
 
-/* OXM Experimenter IDs. */
-enum ofp_oxm_experimenters {
-    OFPXME_OPENFLOW   = 0x0000,    /* OpenFlow consortium */
-    OFPXME_NICIRA     = 0x0001,    /* Nicira */
-    OFPXME_HP         = 0x0002,    /* HP */
+/* OXM Class IDs. All other classes reserved for future specifications. */
+enum ofp_oxm_class {
+    OFPXMC_NICIRA_0     = 0x0000,    /* Backward compatibility with NXM */
+    OFPXMC_NICIRA_1     = 0x0001,    /* Backward compatibility with NXM */
+    OFPXMC_OPENFLOW     = 0x0002,    /* Basic class for OpenFlow */
+    OFPXMC_EXPERIMENTER = 0xFFFF,    /* Experimenter class */
 };
 
-/* OXM Flow match field types for OpenFlow Experimenter. */
+/* OXM Flow match field types for OpenFlow basic class. */
 enum oxm_of_match_fields {
     OFPXMT_OF_IN_PORT        = 0,  /* Switch input port. */
     OFPXMT_OF_METADATA       = 1,  /* Metadata passed between tables. */
@@ -696,7 +697,7 @@
  * Format: 32-bit integer in network byte order.
  *
  * Masking: Not maskable. */
-#define OXM_OF_IN_PORT    OXM_HEADER  (0x0000, OFPXMT_OF_IN_PORT, 4)
+#define OXM_OF_IN_PORT    OXM_HEADER  (0x0002, OFPXMT_OF_IN_PORT, 4)
 
 /* Table metadata.
  *
@@ -706,8 +707,8 @@
  *
  * Masking: Arbitrary masks.
  */
-#define OXM_OF_METADATA   OXM_HEADER  (0x0000, OFPXMT_OF_METADATA, 8)
-#define OXM_OF_METADATA_W OXM_HEADER_W(0x0000, OFPXMT_OF_METADATA, 8)
+#define OXM_OF_METADATA   OXM_HEADER  (0x0002, OFPXMT_OF_METADATA, 8)
+#define OXM_OF_METADATA_W OXM_HEADER_W(0x0002, OFPXMT_OF_METADATA, 8)
 
 /* Source or destination address in Ethernet header.
  *
@@ -716,10 +717,10 @@
  * Format: 48-bit Ethernet MAC address.
  *
  * Masking: Arbitrary masks. */
-#define OXM_OF_ETH_DST    OXM_HEADER  (0x0000, OFPXMT_OF_ETH_DST, 6)
-#define OXM_OF_ETH_DST_W  OXM_HEADER_W(0x0000, OFPXMT_OF_ETH_DST, 6)
-#define OXM_OF_ETH_SRC    OXM_HEADER  (0x0000, OFPXMT_OF_ETH_SRC, 6)
-#define OXM_OF_ETH_SRC_W  OXM_HEADER_W(0x0000, OFPXMT_OF_ETH_SRC, 6)
+#define OXM_OF_ETH_DST    OXM_HEADER  (0x0002, OFPXMT_OF_ETH_DST, 6)
+#define OXM_OF_ETH_DST_W  OXM_HEADER_W(0x0002, OFPXMT_OF_ETH_DST, 6)
+#define OXM_OF_ETH_SRC    OXM_HEADER  (0x0002, OFPXMT_OF_ETH_SRC, 6)
+#define OXM_OF_ETH_SRC_W  OXM_HEADER_W(0x0002, OFPXMT_OF_ETH_SRC, 6)
 
 /* Packet's Ethernet type.
  *
@@ -728,7 +729,7 @@
  * Format: 16-bit integer in network byte order.
  *
  * Masking: Not maskable. */
-#define OXM_OF_ETH_TYPE   OXM_HEADER  (0x0000, OFPXMT_OF_ETH_TYPE, 2)
+#define OXM_OF_ETH_TYPE   OXM_HEADER  (0x0002, OFPXMT_OF_ETH_TYPE, 2)
 
 /* The VLAN id is 12-bits, so we can use the entire 16 bits to indicate
  * special conditions.
@@ -774,8 +775,8 @@
  *   - Testing with nxm_value=0x1000, nxm_mask=0x1000 matches packets with
  *     an 802.1Q header that has any VID value.
  */
-#define OXM_OF_VLAN_VID   OXM_HEADER  (0x0000, OFPXMT_OF_VLAN_VID, 2)
-#define OXM_OF_VLAN_VID_W OXM_HEADER_W(0x0000, OFPXMT_OF_VLAN_VID, 2)
+#define OXM_OF_VLAN_VID   OXM_HEADER  (0x0002, OFPXMT_OF_VLAN_VID, 2)
+#define OXM_OF_VLAN_VID_W OXM_HEADER_W(0x0002, OFPXMT_OF_VLAN_VID, 2)
 
 /* 802.1Q PCP.
  *
@@ -790,7 +791,7 @@
  *
  * Masking: Not maskable.
  */
-#define OXM_OF_VLAN_PCP   OXM_HEADER  (0x0000, OFPXMT_OF_VLAN_PCP, 1)
+#define OXM_OF_VLAN_PCP   OXM_HEADER  (0x0002, OFPXMT_OF_VLAN_PCP, 1)
 
 /* The "type of service" byte of the IP header, with the ECN bits forced to 0.
  *
@@ -800,7 +801,7 @@
  * Only the higher 6 bits have meaning.
  *
  * Masking: Not maskable. */
-#define OXM_OF_IP_TOS     OXM_HEADER  (0x0000, OFPXMT_OF_IP_TOS, 1)
+#define OXM_OF_IP_TOS     OXM_HEADER  (0x0002, OFPXMT_OF_IP_TOS, 1)
 
 /* The ECN bits of the IP header.
  *
@@ -810,7 +811,7 @@
  * Only the lower 2 bits have meaning.
  *
  * Masking: Not maskable. */
-#define OXM_OF_IP_ECN     OXM_HEADER  (0x0000, OFPXMT_OF_IP_ECN, 1)
+#define OXM_OF_IP_ECN     OXM_HEADER  (0x0002, OFPXMT_OF_IP_ECN, 1)
 
 /* The "protocol" byte in the IP header.
  *
@@ -819,7 +820,7 @@
  * Format: 8-bit integer.
  *
  * Masking: Not maskable. */
-#define OXM_OF_IP_PROTO   OXM_HEADER  (0x0000, OFPXMT_OF_IP_PROTO, 1)
+#define OXM_OF_IP_PROTO   OXM_HEADER  (0x0002, OFPXMT_OF_IP_PROTO, 1)
 
 /* The source or destination address in the IP header.
  *
@@ -829,10 +830,10 @@
  *
  * Masking: Arbitrary masks.
  */
-#define OXM_OF_IPV4_SRC     OXM_HEADER  (0x0000, OFPXMT_OF_IPV4_SRC, 4)
-#define OXM_OF_IPV4_SRC_W   OXM_HEADER_W(0x0000, OFPXMT_OF_IPV4_SRC, 4)
-#define OXM_OF_IPV4_DST     OXM_HEADER  (0x0000, OFPXMT_OF_IPV4_DST, 4)
-#define OXM_OF_IPV4_DST_W   OXM_HEADER_W(0x0000, OFPXMT_OF_IPV4_DST, 4)
+#define OXM_OF_IPV4_SRC     OXM_HEADER  (0x0002, OFPXMT_OF_IPV4_SRC, 4)
+#define OXM_OF_IPV4_SRC_W   OXM_HEADER_W(0x0002, OFPXMT_OF_IPV4_SRC, 4)
+#define OXM_OF_IPV4_DST     OXM_HEADER  (0x0002, OFPXMT_OF_IPV4_DST, 4)
+#define OXM_OF_IPV4_DST_W   OXM_HEADER_W(0x0002, OFPXMT_OF_IPV4_DST, 4)
 
 /* The source or destination port in the TCP header.
  *
@@ -843,8 +844,8 @@
  * Format: 16-bit integer in network byte order.
  *
  * Masking: Not maskable. */
-#define OXM_OF_TCP_SRC    OXM_HEADER  (0x0000, OFPXMT_OF_TCP_SRC, 2)
-#define OXM_OF_TCP_DST    OXM_HEADER  (0x0000, OFPXMT_OF_TCP_DST, 2)
+#define OXM_OF_TCP_SRC    OXM_HEADER  (0x0002, OFPXMT_OF_TCP_SRC, 2)
+#define OXM_OF_TCP_DST    OXM_HEADER  (0x0002, OFPXMT_OF_TCP_DST, 2)
 
 /* The source or destination port in the UDP header.
  *
@@ -855,8 +856,8 @@
  * Format: 16-bit integer in network byte order.
  *
  * Masking: Not maskable. */
-#define OXM_OF_UDP_SRC    OXM_HEADER  (0x0000, OFPXMT_OF_UDP_SRC, 2)
-#define OXM_OF_UDP_DST    OXM_HEADER  (0x0000, OFPXMT_OF_UDP_DST, 2)
+#define OXM_OF_UDP_SRC    OXM_HEADER  (0x0002, OFPXMT_OF_UDP_SRC, 2)
+#define OXM_OF_UDP_DST    OXM_HEADER  (0x0002, OFPXMT_OF_UDP_DST, 2)
 
 /* The source or destination port in the SCTP header.
  *
@@ -867,8 +868,8 @@
  * Format: 16-bit integer in network byte order.
  *
  * Masking: Not maskable. */
-#define OXM_OF_SCTP_SRC   OXM_HEADER  (0x0000, OFPXMT_OF_SCTP_SRC, 2)
-#define OXM_OF_SCTP_DST   OXM_HEADER  (0x0000, OFPXMT_OF_SCTP_DST, 2)
+#define OXM_OF_SCTP_SRC   OXM_HEADER  (0x0002, OFPXMT_OF_SCTP_SRC, 2)
+#define OXM_OF_SCTP_DST   OXM_HEADER  (0x0002, OFPXMT_OF_SCTP_DST, 2)
 
 /* The type or code in the ICMP header.
  *
@@ -879,8 +880,8 @@
  * Format: 8-bit integer.
  *
  * Masking: Not maskable. */
-#define OXM_OF_ICMPV4_TYPE  OXM_HEADER  (0x0000, OFPXMT_OF_ICMPV4_TYPE, 1)
-#define OXM_OF_ICMPV4_CODE  OXM_HEADER  (0x0000, OFPXMT_OF_ICMPV4_CODE, 1)
+#define OXM_OF_ICMPV4_TYPE  OXM_HEADER  (0x0002, OFPXMT_OF_ICMPV4_TYPE, 1)
+#define OXM_OF_ICMPV4_CODE  OXM_HEADER  (0x0002, OFPXMT_OF_ICMPV4_CODE, 1)
 
 /* ARP opcode.
  *
@@ -892,7 +893,7 @@
  * Format: 16-bit integer in network byte order.
  *
  * Masking: Not maskable. */
-#define OXM_OF_ARP_OP     OXM_HEADER  (0x0000, OFPXMT_OF_ARP_OP, 2)
+#define OXM_OF_ARP_OP     OXM_HEADER  (0x0002, OFPXMT_OF_ARP_OP, 2)
 
 /* For an Ethernet+IP ARP packet, the source or target protocol address
  * in the ARP header.  Always 0 otherwise.
@@ -903,10 +904,10 @@
  *
  * Masking: Only CIDR masks are allowed, that is, masks that consist of N
  *   high-order bits set to 1 and the other 32-N bits set to 0. */
-#define OXM_OF_ARP_SPA    OXM_HEADER  (0x0000, OFPXMT_OF_ARP_SPA, 4)
-#define OXM_OF_ARP_SPA_W  OXM_HEADER_W(0x0000, OFPXMT_OF_ARP_SPA, 4)
-#define OXM_OF_ARP_TPA    OXM_HEADER  (0x0000, OFPXMT_OF_ARP_TPA, 4)
-#define OXM_OF_ARP_TPA_W  OXM_HEADER_W(0x0000, OFPXMT_OF_ARP_TPA, 4)
+#define OXM_OF_ARP_SPA    OXM_HEADER  (0x0002, OFPXMT_OF_ARP_SPA, 4)
+#define OXM_OF_ARP_SPA_W  OXM_HEADER_W(0x0002, OFPXMT_OF_ARP_SPA, 4)
+#define OXM_OF_ARP_TPA    OXM_HEADER  (0x0002, OFPXMT_OF_ARP_TPA, 4)
+#define OXM_OF_ARP_TPA_W  OXM_HEADER_W(0x0002, OFPXMT_OF_ARP_TPA, 4)
 
 /* For an Ethernet+IP ARP packet, the source or target hardware address
  * in the ARP header.  Always 0 otherwise.
@@ -916,8 +917,8 @@
  * Format: 48-bit Ethernet MAC address.
  *
  * Masking: Not maskable. */
-#define OXM_OF_ARP_SHA    OXM_HEADER  (0x0000, OFPXMT_OF_ARP_SHA, 6)
-#define OXM_OF_ARP_THA    OXM_HEADER  (0x0000, OFPXMT_OF_ARP_THA, 6)
+#define OXM_OF_ARP_SHA    OXM_HEADER  (0x0002, OFPXMT_OF_ARP_SHA, 6)
+#define OXM_OF_ARP_THA    OXM_HEADER  (0x0002, OFPXMT_OF_ARP_THA, 6)
 
 /* The source or destination address in the IPv6 header.
  *
@@ -927,10 +928,10 @@
  *
  * Masking: Only CIDR masks are allowed, that is, masks that consist of N
  *   high-order bits set to 1 and the other 128-N bits set to 0. */
-#define OXM_OF_IPV6_SRC    OXM_HEADER  (0x0000, OFPXMT_OF_IPV6_SRC, 16)
-#define OXM_OF_IPV6_SRC_W  OXM_HEADER_W(0x0000, OFPXMT_OF_IPV6_SRC, 16)
-#define OXM_OF_IPV6_DST    OXM_HEADER  (0x0000, OFPXMT_OF_IPV6_DST, 16)
-#define OXM_OF_IPV6_DST_W  OXM_HEADER_W(0x0000, OFPXMT_OF_IPV6_DST, 16)
+#define OXM_OF_IPV6_SRC    OXM_HEADER  (0x0002, OFPXMT_OF_IPV6_SRC, 16)
+#define OXM_OF_IPV6_SRC_W  OXM_HEADER_W(0x0002, OFPXMT_OF_IPV6_SRC, 16)
+#define OXM_OF_IPV6_DST    OXM_HEADER  (0x0002, OFPXMT_OF_IPV6_DST, 16)
+#define OXM_OF_IPV6_DST_W  OXM_HEADER_W(0x0002, OFPXMT_OF_IPV6_DST, 16)
 
 /* The type or code in the ICMPv6 header.
  *
@@ -941,8 +942,8 @@
  * Format: 8-bit integer.
  *
  * Masking: Not maskable. */
-#define OXM_OF_ICMPV6_TYPE OXM_HEADER  (0x0000, OFPXMT_OF_ICMPV6_TYPE, 1)
-#define OXM_OF_ICMPV6_CODE OXM_HEADER  (0x0000, OFPXMT_OF_ICMPV6_CODE, 1)
+#define OXM_OF_ICMPV6_TYPE OXM_HEADER  (0x0002, OFPXMT_OF_ICMPV6_TYPE, 1)
+#define OXM_OF_ICMPV6_CODE OXM_HEADER  (0x0002, OFPXMT_OF_ICMPV6_CODE, 1)
 
 /* The target address in an IPv6 Neighbor Discovery message.
  *
@@ -954,7 +955,7 @@
  * Format: 128-bit IPv6 address.
  *
  * Masking: Not maskable. */
-#define OXM_OF_IPV6_ND_TARGET OXM_HEADER (0x0000, OFPXMT_OF_IPV6_ND_TARGET, 16)
+#define OXM_OF_IPV6_ND_TARGET OXM_HEADER (0x0002, OFPXMT_OF_IPV6_ND_TARGET, 16)
 
 /* The source link-layer address option in an IPv6 Neighbor Discovery
  * message.
@@ -967,7 +968,7 @@
  * Format: 48-bit Ethernet MAC address.
  *
  * Masking: Not maskable. */
-#define OXM_OF_IPV6_ND_SLL  OXM_HEADER  (0x0000, OFPXMT_OF_IPV6_ND_SLL, 6)
+#define OXM_OF_IPV6_ND_SLL  OXM_HEADER  (0x0002, OFPXMT_OF_IPV6_ND_SLL, 6)
 
 /* The target link-layer address option in an IPv6 Neighbor Discovery
  * message.
@@ -980,7 +981,7 @@
  * Format: 48-bit Ethernet MAC address.
  *
  * Masking: Not maskable. */
-#define OXM_OF_IPV6_ND_TLL  OXM_HEADER  (0x0000, OFPXMT_OF_IPV6_ND_TLL, 6)
+#define OXM_OF_IPV6_ND_TLL  OXM_HEADER  (0x0002, OFPXMT_OF_IPV6_ND_TLL, 6)
 
 /* The LABEL in the first MPLS shim header.
  *
@@ -991,7 +992,7 @@
  * bits forced to 0. Only the lower 20 bits have meaning.
  *
  * Masking: Not maskable. */
-#define OXM_OF_MPLS_LABEL  OXM_HEADER  (0x0000, OFPXMT_OF_MPLS_LABEL, 4)
+#define OXM_OF_MPLS_LABEL  OXM_HEADER  (0x0002, OFPXMT_OF_MPLS_LABEL, 4)
 
 /* The TC in the first MPLS shim header.
  *
@@ -1002,7 +1003,16 @@
  * Only the lower 3 bits have meaning.
  *
  * Masking: Not maskable. */
-#define OXM_OF_MPLS_TC     OXM_HEADER  (0x0000, OFPXMT_OF_MPLS_TC, 1)
+#define OXM_OF_MPLS_TC     OXM_HEADER  (0x0002, OFPXMT_OF_MPLS_TC, 1)
+
+/* Header for OXM experimenter match fields. */
+struct ofp_oxm_experimenter_header {
+    uint32_t oxm_header;        /* oxm_class = OFPXMC_EXPERIMENTER */
+    uint32_t experimenter;      /* Experimenter ID which takes the same
+                                   form as in struct ofp_experimenter_header. */
+};
+OFP_ASSERT(sizeof(struct ofp_match) == 8);
+
 
 /* ## ------------- ## */
 /* ## Instructions. ## */
