diff --git a/Makefile b/Makefile
index 2fff433..6b63fa6 100644
--- a/Makefile
+++ b/Makefile
@@ -40,7 +40,7 @@
                            \) -a -name '*.py')
 LOXI_TEMPLATE_FILES=$(shell find */templates -type f -a \
                                  \! \( -name '*.cache' -o -name '.*' \))
-INPUT_FILES = $(wildcard openflow_input/*) $(wildcard canonical/*)
+INPUT_FILES = $(wildcard openflow_input/*)
 
 all: c python
 
@@ -70,11 +70,6 @@
 	@echo "INPUT_FILES=\"${INPUT_FILES}\""
 
 check:
-	@echo Sending output to loxigen-test.log
-	cd utest && \
-		./identifiers_test.py > ../loxigen-test.log && \
-		./c_utils_test.py >> ../loxigen-test.log && \
-		./of_h_utils_test.py >> ../loxigen-test.log
 	PYTHONPATH=. ./utest/test_parser.py
 
 pylint:
diff --git a/canonical/openflow.h-1.0 b/canonical/openflow.h-1.0
deleted file mode 100644
index c0b5090..0000000
--- a/canonical/openflow.h-1.0
+++ /dev/null
@@ -1,970 +0,0 @@
-/* Copyright (c) 2008 The Board of Trustees of The Leland Stanford
- * Junior University
- *
- * We are making the OpenFlow specification and associated documentation
- * (Software) available for public use and benefit with the expectation
- * that others will use, modify and enhance the Software and contribute
- * those enhancements back to the community. However, since we would
- * like to make the Software available for broadest use, with as few
- * restrictions as possible permission is hereby granted, free of
- * charge, to any person obtaining a copy of this Software to deal in
- * the Software under the copyrights without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sublicense, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
- * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
- * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- *
- * The name and trademarks of copyright holder(s) may NOT be used in
- * advertising or publicity pertaining to the Software or any
- * derivatives without specific, written prior permission.
- */
-
-/* OpenFlow: protocol between controller and datapath. */
-
-#ifndef OPENFLOW_OPENFLOW_H
-#define OPENFLOW_OPENFLOW_H 1
-
-#ifdef __KERNEL__
-#include <linux/types.h>
-#else
-#include <stdint.h>
-#endif
-
-#ifdef SWIG
-#define OFP_ASSERT(EXPR)        /* SWIG can't handle OFP_ASSERT. */
-#elif !defined(__cplusplus)
-/* Build-time assertion for use in a declaration context. */
-#define OFP_ASSERT(EXPR)                                                \
-        extern int (*build_assert(void))[ sizeof(struct {               \
-                    unsigned int build_assert_failed : (EXPR) ? 1 : -1; })]
-#else /* __cplusplus */
-#define OFP_ASSERT(_EXPR) typedef int build_assert_failed[(_EXPR) ? 1 : -1]
-#endif /* __cplusplus */
-
-#ifndef SWIG
-#define OFP_PACKED __attribute__((packed))
-#else
-#define OFP_PACKED              /* SWIG doesn't understand __attribute. */
-#endif
-
-/* Version number:
- * Non-experimental versions released: 0x01
- * Experimental versions released: 0x81 -- 0x99
- */
-/* The most significant bit being set in the version field indicates an
- * experimental OpenFlow version.
- */
-#define OFP_VERSION   0x01
-
-#define OFP_MAX_TABLE_NAME_LEN 32
-#define OFP_MAX_PORT_NAME_LEN  16
-
-#define OFP_TCP_PORT  6633
-#define OFP_SSL_PORT  6633
-
-#define OFP_ETH_ALEN 6          /* Bytes in an Ethernet address. */
-
-/* Port numbering.  Physical ports are numbered starting from 1. */
-enum ofp_port {
-    /* Maximum number of physical switch ports. */
-    OFPP_MAX = 0xff00,
-
-    /* Fake output "ports". */
-    OFPP_IN_PORT    = 0xfff8,  /* Send the packet out the input port.  This
-                                  virtual port must be explicitly used
-                                  in order to send back out of the input
-                                  port. */
-    OFPP_TABLE      = 0xfff9,  /* Perform actions in flow table.
-                                  NB: This can only be the destination
-                                  port for packet-out messages. */
-    OFPP_NORMAL     = 0xfffa,  /* Process with normal L2/L3 switching. */
-    OFPP_FLOOD      = 0xfffb,  /* All physical ports except input port and
-                                  those disabled by STP. */
-    OFPP_ALL        = 0xfffc,  /* All physical ports except input port. */
-    OFPP_CONTROLLER = 0xfffd,  /* Send to controller. */
-    OFPP_LOCAL      = 0xfffe,  /* Local openflow "port". */
-    OFPP_NONE       = 0xffff   /* Not associated with a physical port. */
-};
-
-enum ofp_type {
-    /* Immutable messages. */
-    OFPT_HELLO,               /* Symmetric message */
-    OFPT_ERROR,               /* Symmetric message */
-    OFPT_ECHO_REQUEST,        /* Symmetric message */
-    OFPT_ECHO_REPLY,          /* Symmetric message */
-    OFPT_VENDOR,              /* Symmetric message */
-
-    /* Switch configuration messages. */
-    OFPT_FEATURES_REQUEST,    /* Controller/switch message */
-    OFPT_FEATURES_REPLY,      /* Controller/switch message */
-    OFPT_GET_CONFIG_REQUEST,  /* Controller/switch message */
-    OFPT_GET_CONFIG_REPLY,    /* Controller/switch message */
-    OFPT_SET_CONFIG,          /* Controller/switch message */
-
-    /* Asynchronous messages. */
-    OFPT_PACKET_IN,           /* Async message */
-    OFPT_FLOW_REMOVED,        /* Async message */
-    OFPT_PORT_STATUS,         /* Async message */
-
-    /* Controller command messages. */
-    OFPT_PACKET_OUT,          /* Controller/switch message */
-    OFPT_FLOW_MOD,            /* Controller/switch message */
-    OFPT_PORT_MOD,            /* Controller/switch message */
-
-    /* Statistics messages. */
-    OFPT_STATS_REQUEST,       /* Controller/switch message */
-    OFPT_STATS_REPLY,         /* Controller/switch message */
-
-    /* Barrier messages. */
-    OFPT_BARRIER_REQUEST,     /* Controller/switch message */
-    OFPT_BARRIER_REPLY,       /* Controller/switch message */
-
-    /* Queue Configuration messages. */
-    OFPT_QUEUE_GET_CONFIG_REQUEST,  /* Controller/switch message */
-    OFPT_QUEUE_GET_CONFIG_REPLY     /* Controller/switch message */
-
-};
-
-/* Header on all OpenFlow packets. */
-struct ofp_header {
-    uint8_t version;    /* OFP_VERSION. */
-    uint8_t type;       /* One of the OFPT_ constants. */
-    uint16_t length;    /* Length including this ofp_header. */
-    uint32_t xid;       /* Transaction id associated with this packet.
-                           Replies use the same id as was in the request
-                           to facilitate pairing. */
-};
-OFP_ASSERT(sizeof(struct ofp_header) == 8);
-
-/* OFPT_HELLO.  This message has an empty body, but implementations must
- * ignore any data included in the body, to allow for future extensions. */
-struct ofp_hello {
-    struct ofp_header header;
-};
-
-#define OFP_DEFAULT_MISS_SEND_LEN   128
-
-enum ofp_config_flags {
-    /* Handling of IP fragments. */
-    OFPC_FRAG_NORMAL   = 0,  /* No special handling for fragments. */
-    OFPC_FRAG_DROP     = 1,  /* Drop fragments. */
-    OFPC_FRAG_REASM    = 2,  /* Reassemble (only if OFPC_IP_REASM set). */
-    OFPC_FRAG_MASK     = 3
-};
-
-/* Switch configuration. */
-struct ofp_switch_config {
-    struct ofp_header header;
-    uint16_t flags;             /* OFPC_* flags. */
-    uint16_t miss_send_len;     /* Max bytes of new flow that datapath should
-                                   send to the controller. */
-};
-OFP_ASSERT(sizeof(struct ofp_switch_config) == 12);
-
-/* Capabilities supported by the datapath. */
-enum ofp_capabilities {
-    OFPC_FLOW_STATS     = 1 << 0,  /* Flow statistics. */
-    OFPC_TABLE_STATS    = 1 << 1,  /* Table statistics. */
-    OFPC_PORT_STATS     = 1 << 2,  /* Port statistics. */
-    OFPC_STP            = 1 << 3,  /* 802.1d spanning tree. */
-    OFPC_RESERVED       = 1 << 4,  /* Reserved, must be zero. */
-    OFPC_IP_REASM       = 1 << 5,  /* Can reassemble IP fragments. */
-    OFPC_QUEUE_STATS    = 1 << 6,  /* Queue statistics. */
-    OFPC_ARP_MATCH_IP   = 1 << 7   /* Match IP addresses in ARP pkts. */
-};
-
-/* Flags to indicate behavior of the physical port.  These flags are
- * used in ofp_phy_port to describe the current configuration.  They are
- * used in the ofp_port_mod message to configure the port's behavior.
- */
-enum ofp_port_config {
-    OFPPC_PORT_DOWN    = 1 << 0,  /* Port is administratively down. */
-
-    OFPPC_NO_STP       = 1 << 1,  /* Disable 802.1D spanning tree on port. */
-    OFPPC_NO_RECV      = 1 << 2,  /* Drop all packets except 802.1D spanning
-                                     tree packets. */
-    OFPPC_NO_RECV_STP  = 1 << 3,  /* Drop received 802.1D STP packets. */
-    OFPPC_NO_FLOOD     = 1 << 4,  /* Do not include this port when flooding. */
-    OFPPC_NO_FWD       = 1 << 5,  /* Drop packets forwarded to port. */
-    OFPPC_NO_PACKET_IN = 1 << 6   /* Do not send packet-in msgs for port. */
-};
-
-/* Current state of the physical port.  These are not configurable from
- * the controller.
- */
-enum ofp_port_state {
-    OFPPS_LINK_DOWN   = 1 << 0, /* No physical link present. */
-
-    /* The OFPPS_STP_* bits have no effect on switch operation.  The
-     * controller must adjust OFPPC_NO_RECV, OFPPC_NO_FWD, and
-     * OFPPC_NO_PACKET_IN appropriately to fully implement an 802.1D spanning
-     * tree. */
-    OFPPS_STP_LISTEN  = 0 << 8, /* Not learning or relaying frames. */
-    OFPPS_STP_LEARN   = 1 << 8, /* Learning but not relaying frames. */
-    OFPPS_STP_FORWARD = 2 << 8, /* Learning and relaying frames. */
-    OFPPS_STP_BLOCK   = 3 << 8, /* Not part of spanning tree. */
-    OFPPS_STP_MASK    = 3 << 8  /* Bit mask for OFPPS_STP_* values. */
-};
-
-/* Features of physical ports available in a datapath. */
-enum ofp_port_features {
-    OFPPF_10MB_HD    = 1 << 0,  /* 10 Mb half-duplex rate support. */
-    OFPPF_10MB_FD    = 1 << 1,  /* 10 Mb full-duplex rate support. */
-    OFPPF_100MB_HD   = 1 << 2,  /* 100 Mb half-duplex rate support. */
-    OFPPF_100MB_FD   = 1 << 3,  /* 100 Mb full-duplex rate support. */
-    OFPPF_1GB_HD     = 1 << 4,  /* 1 Gb half-duplex rate support. */
-    OFPPF_1GB_FD     = 1 << 5,  /* 1 Gb full-duplex rate support. */
-    OFPPF_10GB_FD    = 1 << 6,  /* 10 Gb full-duplex rate support. */
-    OFPPF_COPPER     = 1 << 7,  /* Copper medium. */
-    OFPPF_FIBER      = 1 << 8,  /* Fiber medium. */
-    OFPPF_AUTONEG    = 1 << 9,  /* Auto-negotiation. */
-    OFPPF_PAUSE      = 1 << 10, /* Pause. */
-    OFPPF_PAUSE_ASYM = 1 << 11  /* Asymmetric pause. */
-};
-
-/* Description of a physical port */
-struct ofp_phy_port {
-    uint16_t port_no;
-    uint8_t hw_addr[OFP_ETH_ALEN];
-    char name[OFP_MAX_PORT_NAME_LEN]; /* Null-terminated */
-
-    uint32_t config;        /* Bitmap of OFPPC_* flags. */
-    uint32_t state;         /* Bitmap of OFPPS_* flags. */
-
-    /* Bitmaps of OFPPF_* that describe features.  All bits zeroed if
-     * unsupported or unavailable. */
-    uint32_t curr;          /* Current features. */
-    uint32_t advertised;    /* Features being advertised by the port. */
-    uint32_t supported;     /* Features supported by the port. */
-    uint32_t peer;          /* Features advertised by peer. */
-};
-OFP_ASSERT(sizeof(struct ofp_phy_port) == 48);
-
-/* Switch features. */
-struct ofp_switch_features {
-    struct ofp_header header;
-    uint64_t datapath_id;   /* Datapath unique ID.  The lower 48-bits are for
-                               a MAC address, while the upper 16-bits are
-                               implementer-defined. */
-
-    uint32_t n_buffers;     /* Max packets buffered at once. */
-
-    uint8_t n_tables;       /* Number of tables supported by datapath. */
-    uint8_t pad[3];         /* Align to 64-bits. */
-
-    /* Features. */
-    uint32_t capabilities;  /* Bitmap of support "ofp_capabilities". */
-    uint32_t actions;       /* Bitmap of supported "ofp_action_type"s. */
-
-    /* Port info.*/
-    struct ofp_phy_port ports[0];  /* Port definitions.  The number of ports
-                                      is inferred from the length field in
-                                      the header. */
-};
-OFP_ASSERT(sizeof(struct ofp_switch_features) == 32);
-
-/* What changed about the physical port */
-enum ofp_port_reason {
-    OFPPR_ADD,              /* The port was added. */
-    OFPPR_DELETE,           /* The port was removed. */
-    OFPPR_MODIFY            /* Some attribute of the port has changed. */
-};
-
-/* A physical port has changed in the datapath */
-struct ofp_port_status {
-    struct ofp_header header;
-    uint8_t reason;          /* One of OFPPR_*. */
-    uint8_t pad[7];          /* Align to 64-bits. */
-    struct ofp_phy_port desc;
-};
-OFP_ASSERT(sizeof(struct ofp_port_status) == 64);
-
-/* Modify behavior of the physical port */
-struct ofp_port_mod {
-    struct ofp_header header;
-    uint16_t port_no;
-    uint8_t hw_addr[OFP_ETH_ALEN]; /* The hardware address is not
-                                      configurable.  This is used to
-                                      sanity-check the request, so it must
-                                      be the same as returned in an
-                                      ofp_phy_port struct. */
-
-    uint32_t config;        /* Bitmap of OFPPC_* flags. */
-    uint32_t mask;          /* Bitmap of OFPPC_* flags to be changed. */
-
-    uint32_t advertise;     /* Bitmap of "ofp_port_features"s.  Zero all
-                               bits to prevent any action taking place. */
-    uint8_t pad[4];         /* Pad to 64-bits. */
-};
-OFP_ASSERT(sizeof(struct ofp_port_mod) == 32);
-
-/* Why is this packet being sent to the controller? */
-enum ofp_packet_in_reason {
-    OFPR_NO_MATCH,          /* No matching flow. */
-    OFPR_ACTION             /* Action explicitly output to controller. */
-};
-
-/* Packet received on port (datapath -> controller). */
-struct ofp_packet_in {
-    struct ofp_header header;
-    uint32_t buffer_id;     /* ID assigned by datapath. */
-    uint16_t total_len;     /* Full length of frame. */
-    uint16_t in_port;       /* Port on which frame was received. */
-    uint8_t reason;         /* Reason packet is being sent (one of OFPR_*) */
-    uint8_t pad;
-    uint8_t data[0];        /* Ethernet frame, halfway through 32-bit word,
-                               so the IP header is 32-bit aligned.  The
-                               amount of data is inferred from the length
-                               field in the header.  Because of padding,
-                               offsetof(struct ofp_packet_in, data) ==
-                               sizeof(struct ofp_packet_in) - 2. */
-};
-OFP_ASSERT(sizeof(struct ofp_packet_in) == 20);
-
-enum ofp_action_type {
-    OFPAT_OUTPUT,           /* Output to switch port. */
-    OFPAT_SET_VLAN_VID,     /* Set the 802.1q VLAN id. */
-    OFPAT_SET_VLAN_PCP,     /* Set the 802.1q priority. */
-    OFPAT_STRIP_VLAN,       /* Strip the 802.1q header. */
-    OFPAT_SET_DL_SRC,       /* Ethernet source address. */
-    OFPAT_SET_DL_DST,       /* Ethernet destination address. */
-    OFPAT_SET_NW_SRC,       /* IP source address. */
-    OFPAT_SET_NW_DST,       /* IP destination address. */
-    OFPAT_SET_NW_TOS,       /* IP ToS (DSCP field, 6 bits). */
-    OFPAT_SET_TP_SRC,       /* TCP/UDP source port. */
-    OFPAT_SET_TP_DST,       /* TCP/UDP destination port. */
-    OFPAT_ENQUEUE,          /* Output to queue.  */
-    OFPAT_VENDOR = 0xffff
-};
-
-/* Action structure for OFPAT_OUTPUT, which sends packets out 'port'.
- * When the 'port' is the OFPP_CONTROLLER, 'max_len' indicates the max
- * number of bytes to send.  A 'max_len' of zero means no bytes of the
- * packet should be sent.*/
-struct ofp_action_output {
-    uint16_t type;                  /* OFPAT_OUTPUT. */
-    uint16_t len;                   /* Length is 8. */
-    uint16_t port;                  /* Output port. */
-    uint16_t max_len;               /* Max length to send to controller. */
-};
-OFP_ASSERT(sizeof(struct ofp_action_output) == 8);
-
-/* The VLAN id is 12 bits, so we can use the entire 16 bits to indicate
- * special conditions.  All ones is used to match that no VLAN id was
- * set. */
-#define OFP_VLAN_NONE      0xffff
-
-/* Action structure for OFPAT_SET_VLAN_VID. */
-struct ofp_action_vlan_vid {
-    uint16_t type;                  /* OFPAT_SET_VLAN_VID. */
-    uint16_t len;                   /* Length is 8. */
-    uint16_t vlan_vid;              /* VLAN id. */
-    uint8_t pad[2];
-};
-OFP_ASSERT(sizeof(struct ofp_action_vlan_vid) == 8);
-
-/* Action structure for OFPAT_SET_VLAN_PCP. */
-struct ofp_action_vlan_pcp {
-    uint16_t type;                  /* OFPAT_SET_VLAN_PCP. */
-    uint16_t len;                   /* Length is 8. */
-    uint8_t vlan_pcp;               /* VLAN priority. */
-    uint8_t pad[3];
-};
-OFP_ASSERT(sizeof(struct ofp_action_vlan_pcp) == 8);
-
-/* Action structure for OFPAT_SET_DL_SRC/DST. */
-struct ofp_action_dl_addr {
-    uint16_t type;                  /* OFPAT_SET_DL_SRC/DST. */
-    uint16_t len;                   /* Length is 16. */
-    uint8_t dl_addr[OFP_ETH_ALEN];  /* Ethernet address. */
-    uint8_t pad[6];
-};
-OFP_ASSERT(sizeof(struct ofp_action_dl_addr) == 16);
-
-/* Action structure for OFPAT_SET_NW_SRC/DST. */
-struct ofp_action_nw_addr {
-    uint16_t type;                  /* OFPAT_SET_TW_SRC/DST. */
-    uint16_t len;                   /* Length is 8. */
-    uint32_t nw_addr;               /* IP address. */
-};
-OFP_ASSERT(sizeof(struct ofp_action_nw_addr) == 8);
-
-/* Action structure for OFPAT_SET_TP_SRC/DST. */
-struct ofp_action_tp_port {
-    uint16_t type;                  /* OFPAT_SET_TP_SRC/DST. */
-    uint16_t len;                   /* Length is 8. */
-    uint16_t tp_port;               /* TCP/UDP port. */
-    uint8_t pad[2];
-};
-OFP_ASSERT(sizeof(struct ofp_action_tp_port) == 8);
-
-/* Action structure for OFPAT_SET_NW_TOS. */
-struct ofp_action_nw_tos {
-    uint16_t type;                  /* OFPAT_SET_TW_SRC/DST. */
-    uint16_t len;                   /* Length is 8. */
-    uint8_t nw_tos;                 /* IP ToS (DSCP field, 6 bits). */
-    uint8_t pad[3];
-};
-OFP_ASSERT(sizeof(struct ofp_action_nw_tos) == 8);
-
-/* Action header for OFPAT_VENDOR. The rest of the body is vendor-defined. */
-struct ofp_action_vendor_header {
-    uint16_t type;                  /* OFPAT_VENDOR. */
-    uint16_t len;                   /* Length is a multiple of 8. */
-    uint32_t vendor;                /* Vendor ID, which takes the same form
-                                       as in "struct ofp_vendor_header". */
-};
-OFP_ASSERT(sizeof(struct ofp_action_vendor_header) == 8);
-
-/* Action header that is common to all actions.  The length includes the
- * header and any padding used to make the action 64-bit aligned.
- * NB: The length of an action *must* always be a multiple of eight. */
-struct ofp_action_header {
-    uint16_t type;                  /* One of OFPAT_*. */
-    uint16_t len;                   /* Length of action, including this
-                                       header.  This is the length of action,
-                                       including any padding to make it
-                                       64-bit aligned. */
-    uint8_t pad[4];
-};
-OFP_ASSERT(sizeof(struct ofp_action_header) == 8);
-
-/* Send packet (controller -> datapath). */
-struct ofp_packet_out {
-    struct ofp_header header;
-    uint32_t buffer_id;           /* ID assigned by datapath (-1 if none). */
-    uint16_t in_port;             /* Packet's input port (OFPP_NONE if none). */
-    uint16_t actions_len;         /* Size of action array in bytes. */
-    struct ofp_action_header actions[0]; /* Actions. */
-    /* uint8_t data[0]; */        /* Packet data.  The length is inferred
-                                     from the length field in the header.
-                                     (Only meaningful if buffer_id == -1.) */
-};
-OFP_ASSERT(sizeof(struct ofp_packet_out) == 16);
-
-enum ofp_flow_mod_command {
-    OFPFC_ADD,              /* New flow. */
-    OFPFC_MODIFY,           /* Modify all matching flows. */
-    OFPFC_MODIFY_STRICT,    /* Modify entry strictly matching wildcards */
-    OFPFC_DELETE,           /* Delete all matching flows. */
-    OFPFC_DELETE_STRICT    /* Strictly match wildcards and priority. */
-};
-
-/* Flow wildcards. */
-enum ofp_flow_wildcards {
-    OFPFW_IN_PORT  = 1 << 0,  /* Switch input port. */
-    OFPFW_DL_VLAN  = 1 << 1,  /* VLAN id. */
-    OFPFW_DL_SRC   = 1 << 2,  /* Ethernet source address. */
-    OFPFW_DL_DST   = 1 << 3,  /* Ethernet destination address. */
-    OFPFW_DL_TYPE  = 1 << 4,  /* Ethernet frame type. */
-    OFPFW_NW_PROTO = 1 << 5,  /* IP protocol. */
-    OFPFW_TP_SRC   = 1 << 6,  /* TCP/UDP source port. */
-    OFPFW_TP_DST   = 1 << 7,  /* TCP/UDP destination port. */
-
-    /* IP source address wildcard bit count.  0 is exact match, 1 ignores the
-     * LSB, 2 ignores the 2 least-significant bits, ..., 32 and higher wildcard
-     * the entire field.  This is the *opposite* of the usual convention where
-     * e.g. /24 indicates that 8 bits (not 24 bits) are wildcarded. */
-    OFPFW_NW_SRC_SHIFT = 8,
-    OFPFW_NW_SRC_BITS = 6,
-    OFPFW_NW_SRC_MASK = ((1 << OFPFW_NW_SRC_BITS) - 1) << OFPFW_NW_SRC_SHIFT,
-    OFPFW_NW_SRC_ALL = 32 << OFPFW_NW_SRC_SHIFT,
-
-    /* IP destination address wildcard bit count.  Same format as source. */
-    OFPFW_NW_DST_SHIFT = 14,
-    OFPFW_NW_DST_BITS = 6,
-    OFPFW_NW_DST_MASK = ((1 << OFPFW_NW_DST_BITS) - 1) << OFPFW_NW_DST_SHIFT,
-    OFPFW_NW_DST_ALL = 32 << OFPFW_NW_DST_SHIFT,
-
-    OFPFW_DL_VLAN_PCP = 1 << 20,  /* VLAN priority. */
-    OFPFW_NW_TOS = 1 << 21,  /* IP ToS (DSCP field, 6 bits). */
-
-    /* Wildcard all fields. */
-    OFPFW_ALL = ((1 << 22) - 1)
-};
-
-/* The wildcards for ICMP type and code fields use the transport source
- * and destination port fields, respectively. */
-#define OFPFW_ICMP_TYPE OFPFW_TP_SRC
-#define OFPFW_ICMP_CODE OFPFW_TP_DST
-
-/* Values below this cutoff are 802.3 packets and the two bytes
- * following MAC addresses are used as a frame length.  Otherwise, the
- * two bytes are used as the Ethernet type.
- */
-#define OFP_DL_TYPE_ETH2_CUTOFF   0x0600
-
-/* Value of dl_type to indicate that the frame does not include an
- * Ethernet type.
- */
-#define OFP_DL_TYPE_NOT_ETH_TYPE  0x05ff
-
-/* The VLAN id is 12-bits, so we can use the entire 16 bits to indicate
- * special conditions.  All ones indicates that no VLAN id was set.
- */
-#define OFP_VLAN_NONE      0xffff
-
-/* Fields to match against flows */
-struct ofp_match {
-    uint32_t wildcards;        /* Wildcard fields. */
-    uint16_t in_port;          /* Input switch port. */
-    uint8_t dl_src[OFP_ETH_ALEN]; /* Ethernet source address. */
-    uint8_t dl_dst[OFP_ETH_ALEN]; /* Ethernet destination address. */
-    uint16_t dl_vlan;          /* Input VLAN id. */
-    uint8_t dl_vlan_pcp;       /* Input VLAN priority. */
-    uint8_t pad1[1];           /* Align to 64-bits */
-    uint16_t dl_type;          /* Ethernet frame type. */
-    uint8_t nw_tos;            /* IP ToS (actually DSCP field, 6 bits). */
-    uint8_t nw_proto;          /* IP protocol or lower 8 bits of
-                                * ARP opcode. */
-    uint8_t pad2[2];           /* Align to 64-bits */
-    uint32_t nw_src;           /* IP source address. */
-    uint32_t nw_dst;           /* IP destination address. */
-    uint16_t tp_src;           /* TCP/UDP source port. */
-    uint16_t tp_dst;           /* TCP/UDP destination port. */
-};
-OFP_ASSERT(sizeof(struct ofp_match) == 40);
-
-/* The match fields for ICMP type and code use the transport source and
- * destination port fields, respectively. */
-#define icmp_type tp_src
-#define icmp_code tp_dst
-
-/* Value used in "idle_timeout" and "hard_timeout" to indicate that the entry
- * is permanent. */
-#define OFP_FLOW_PERMANENT 0
-
-/* By default, choose a priority in the middle. */
-#define OFP_DEFAULT_PRIORITY 0x8000
-
-enum ofp_flow_mod_flags {
-    OFPFF_SEND_FLOW_REM = 1 << 0,  /* Send flow removed message when flow
-                                    * expires or is deleted. */
-    OFPFF_CHECK_OVERLAP = 1 << 1,  /* Check for overlapping entries first. */
-    OFPFF_EMERG         = 1 << 2   /* Remark this is for emergency. */
-};
-
-/* Flow setup and teardown (controller -> datapath). */
-struct ofp_flow_mod {
-    struct ofp_header header;
-    struct ofp_match match;      /* Fields to match */
-    uint64_t cookie;             /* Opaque controller-issued identifier. */
-
-    /* Flow actions. */
-    uint16_t command;             /* One of OFPFC_*. */
-    uint16_t idle_timeout;        /* Idle time before discarding (seconds). */
-    uint16_t hard_timeout;        /* Max time before discarding (seconds). */
-    uint16_t priority;            /* Priority level of flow entry. */
-    uint32_t buffer_id;           /* Buffered packet to apply to (or -1).
-                                     Not meaningful for OFPFC_DELETE*. */
-    uint16_t out_port;            /* For OFPFC_DELETE* commands, require
-                                     matching entries to include this as an
-                                     output port.  A value of OFPP_NONE
-                                     indicates no restriction. */
-    uint16_t flags;               /* One of OFPFF_*. */
-    struct ofp_action_header actions[0]; /* The action length is inferred
-                                            from the length field in the
-                                            header. */
-};
-OFP_ASSERT(sizeof(struct ofp_flow_mod) == 72);
-
-/* Why was this flow removed? */
-enum ofp_flow_removed_reason {
-    OFPRR_IDLE_TIMEOUT,         /* Flow idle time exceeded idle_timeout. */
-    OFPRR_HARD_TIMEOUT,         /* Time exceeded hard_timeout. */
-    OFPRR_DELETE                /* Evicted by a DELETE flow mod. */
-};
-
-/* Flow removed (datapath -> controller). */
-struct ofp_flow_removed {
-    struct ofp_header header;
-    struct ofp_match match;   /* Description of fields. */
-    uint64_t cookie;          /* Opaque controller-issued identifier. */
-
-    uint16_t priority;        /* Priority level of flow entry. */
-    uint8_t reason;           /* One of OFPRR_*. */
-    uint8_t pad[1];           /* Align to 32-bits. */
-
-    uint32_t duration_sec;    /* Time flow was alive in seconds. */
-    uint32_t duration_nsec;   /* Time flow was alive in nanoseconds beyond
-                                 duration_sec. */
-    uint16_t idle_timeout;    /* Idle timeout from original flow mod. */
-    uint8_t pad2[2];          /* Align to 64-bits. */
-    uint64_t packet_count;
-    uint64_t byte_count;
-};
-OFP_ASSERT(sizeof(struct ofp_flow_removed) == 88);
-
-/* Values for 'type' in ofp_error_message.  These values are immutable: they
- * will not change in future versions of the protocol (although new values may
- * be added). */
-enum ofp_error_type {
-    OFPET_HELLO_FAILED,         /* Hello protocol failed. */
-    OFPET_BAD_REQUEST,          /* Request was not understood. */
-    OFPET_BAD_ACTION,           /* Error in action description. */
-    OFPET_FLOW_MOD_FAILED,      /* Problem modifying flow entry. */
-    OFPET_PORT_MOD_FAILED,      /* Port mod request failed. */
-    OFPET_QUEUE_OP_FAILED       /* Queue operation failed. */
-};
-
-/* ofp_error_msg 'code' values for OFPET_HELLO_FAILED.  'data' contains an
- * ASCII text string that may give failure details. */
-enum ofp_hello_failed_code {
-    OFPHFC_INCOMPATIBLE,        /* No compatible version. */
-    OFPHFC_EPERM                /* Permissions error. */
-};
-
-/* ofp_error_msg 'code' values for OFPET_BAD_REQUEST.  'data' contains at least
- * the first 64 bytes of the failed request. */
-enum ofp_bad_request_code {
-    OFPBRC_BAD_VERSION,         /* ofp_header.version not supported. */
-    OFPBRC_BAD_TYPE,            /* ofp_header.type not supported. */
-    OFPBRC_BAD_STAT,            /* ofp_stats_request.type not supported. */
-    OFPBRC_BAD_VENDOR,          /* Vendor not supported (in ofp_vendor_header
-                                 * or ofp_stats_request or ofp_stats_reply). */
-    OFPBRC_BAD_SUBTYPE,         /* Vendor subtype not supported. */
-    OFPBRC_EPERM,               /* Permissions error. */
-    OFPBRC_BAD_LEN,             /* Wrong request length for type. */
-    OFPBRC_BUFFER_EMPTY,        /* Specified buffer has already been used. */
-    OFPBRC_BUFFER_UNKNOWN       /* Specified buffer does not exist. */
-};
-
-/* ofp_error_msg 'code' values for OFPET_BAD_ACTION.  'data' contains at least
- * the first 64 bytes of the failed request. */
-enum ofp_bad_action_code {
-    OFPBAC_BAD_TYPE,           /* Unknown action type. */
-    OFPBAC_BAD_LEN,            /* Length problem in actions. */
-    OFPBAC_BAD_VENDOR,         /* Unknown vendor id specified. */
-    OFPBAC_BAD_VENDOR_TYPE,    /* Unknown action type for vendor id. */
-    OFPBAC_BAD_OUT_PORT,       /* Problem validating output action. */
-    OFPBAC_BAD_ARGUMENT,       /* Bad action argument. */
-    OFPBAC_EPERM,              /* Permissions error. */
-    OFPBAC_TOO_MANY,           /* Can't handle this many actions. */
-    OFPBAC_BAD_QUEUE           /* Problem validating output queue. */
-};
-
-/* ofp_error_msg 'code' values for OFPET_FLOW_MOD_FAILED.  'data' contains
- * at least the first 64 bytes of the failed request. */
-enum ofp_flow_mod_failed_code {
-    OFPFMFC_ALL_TABLES_FULL,    /* Flow not added because of full tables. */
-    OFPFMFC_OVERLAP,            /* Attempted to add overlapping flow with
-                                 * CHECK_OVERLAP flag set. */
-    OFPFMFC_EPERM,              /* Permissions error. */
-    OFPFMFC_BAD_EMERG_TIMEOUT,  /* Flow not added because of non-zero idle/hard
-                                 * timeout. */
-    OFPFMFC_BAD_COMMAND,        /* Unknown command. */
-    OFPFMFC_UNSUPPORTED         /* Unsupported action list - cannot process in
-                                 * the order specified. */
-};
-
-/* ofp_error_msg 'code' values for OFPET_PORT_MOD_FAILED.  'data' contains
- * at least the first 64 bytes of the failed request. */
-enum ofp_port_mod_failed_code {
-    OFPPMFC_BAD_PORT,            /* Specified port does not exist. */
-    OFPPMFC_BAD_HW_ADDR,         /* Specified hardware address is wrong. */
-};
-
-/* ofp_error msg 'code' values for OFPET_QUEUE_OP_FAILED. 'data' contains
- * at least the first 64 bytes of the failed request */
-enum ofp_queue_op_failed_code {
-    OFPQOFC_BAD_PORT,           /* Invalid port (or port does not exist). */
-    OFPQOFC_BAD_QUEUE,          /* Queue does not exist. */
-    OFPQOFC_EPERM               /* Permissions error. */
-};
-
-/* OFPT_ERROR: Error message (datapath -> controller). */
-struct ofp_error_msg {
-    struct ofp_header header;
-
-    uint16_t type;
-    uint16_t code;
-    uint8_t data[0];          /* Variable-length data.  Interpreted based
-                                 on the type and code. */
-};
-OFP_ASSERT(sizeof(struct ofp_error_msg) == 12);
-
-enum ofp_stats_types {
-    /* Description of this OpenFlow switch.
-     * The request body is empty.
-     * The reply body is struct ofp_desc_stats. */
-    OFPST_DESC,
-
-    /* Individual flow statistics.
-     * The request body is struct ofp_flow_stats_request.
-     * The reply body is an array of struct ofp_flow_stats. */
-    OFPST_FLOW,
-
-    /* Aggregate flow statistics.
-     * The request body is struct ofp_aggregate_stats_request.
-     * The reply body is struct ofp_aggregate_stats_reply. */
-    OFPST_AGGREGATE,
-
-    /* Flow table statistics.
-     * The request body is empty.
-     * The reply body is an array of struct ofp_table_stats. */
-    OFPST_TABLE,
-
-    /* Physical port statistics.
-     * The request body is struct ofp_port_stats_request.
-     * The reply body is an array of struct ofp_port_stats. */
-    OFPST_PORT,
-
-    /* Queue statistics for a port
-     * The request body defines the port
-     * The reply body is an array of struct ofp_queue_stats */
-    OFPST_QUEUE,
-
-    /* Vendor extension.
-     * The request and reply bodies begin with a 32-bit vendor ID, which takes
-     * the same form as in "struct ofp_vendor_header".  The request and reply
-     * bodies are otherwise vendor-defined. */
-    OFPST_VENDOR = 0xffff
-};
-
-struct ofp_stats_request {
-    struct ofp_header header;
-    uint16_t type;              /* One of the OFPST_* constants. */
-    uint16_t flags;             /* OFPSF_REQ_* flags (none yet defined). */
-    uint8_t body[0];            /* Body of the request. */
-};
-OFP_ASSERT(sizeof(struct ofp_stats_request) == 12);
-
-enum ofp_stats_reply_flags {
-    OFPSF_REPLY_MORE  = 1 << 0  /* More replies to follow. */
-};
-
-struct ofp_stats_reply {
-    struct ofp_header header;
-    uint16_t type;              /* One of the OFPST_* constants. */
-    uint16_t flags;             /* OFPSF_REPLY_* flags. */
-    uint8_t body[0];            /* Body of the reply. */
-};
-OFP_ASSERT(sizeof(struct ofp_stats_reply) == 12);
-
-#define DESC_STR_LEN   256
-#define SERIAL_NUM_LEN 32
-/* Body of reply to OFPST_DESC request.  Each entry is a NULL-terminated
- * ASCII string. */
-struct ofp_desc_stats {
-    char mfr_desc[DESC_STR_LEN];       /* Manufacturer description. */
-    char hw_desc[DESC_STR_LEN];        /* Hardware description. */
-    char sw_desc[DESC_STR_LEN];        /* Software description. */
-    char serial_num[SERIAL_NUM_LEN];   /* Serial number. */
-    char dp_desc[DESC_STR_LEN];        /* Human readable description of datapath. */
-};
-OFP_ASSERT(sizeof(struct ofp_desc_stats) == 1056);
-
-/* Body for ofp_stats_request of type OFPST_FLOW. */
-struct ofp_flow_stats_request {
-    struct ofp_match match;   /* Fields to match. */
-    uint8_t table_id;         /* ID of table to read (from ofp_table_stats),
-                                 0xff for all tables or 0xfe for emergency. */
-    uint8_t pad;              /* Align to 32 bits. */
-    uint16_t out_port;        /* Require matching entries to include this
-                                 as an output port.  A value of OFPP_NONE
-                                 indicates no restriction. */
-};
-OFP_ASSERT(sizeof(struct ofp_flow_stats_request) == 44);
-
-/* Body of reply to OFPST_FLOW request. */
-struct ofp_flow_stats {
-    uint16_t length;          /* Length of this entry. */
-    uint8_t table_id;         /* ID of table flow came from. */
-    uint8_t pad;
-    struct ofp_match match;   /* Description of fields. */
-    uint32_t duration_sec;    /* Time flow has been alive in seconds. */
-    uint32_t duration_nsec;   /* Time flow has been alive in nanoseconds beyond
-                                 duration_sec. */
-    uint16_t priority;        /* Priority of the entry. Only meaningful
-                                 when this is not an exact-match entry. */
-    uint16_t idle_timeout;    /* Number of seconds idle before expiration. */
-    uint16_t hard_timeout;    /* Number of seconds before expiration. */
-    uint8_t pad2[6];          /* Align to 64-bits. */
-    uint64_t cookie;          /* Opaque controller-issued identifier. */
-    uint64_t packet_count;    /* Number of packets in flow. */
-    uint64_t byte_count;      /* Number of bytes in flow. */
-    struct ofp_action_header actions[0]; /* Actions. */
-};
-OFP_ASSERT(sizeof(struct ofp_flow_stats) == 88);
-
-/* Body for ofp_stats_request of type OFPST_AGGREGATE. */
-struct ofp_aggregate_stats_request {
-    struct ofp_match match;   /* Fields to match. */
-    uint8_t table_id;         /* ID of table to read (from ofp_table_stats)
-                                 0xff for all tables or 0xfe for emergency. */
-    uint8_t pad;              /* Align to 32 bits. */
-    uint16_t out_port;        /* Require matching entries to include this
-                                 as an output port.  A value of OFPP_NONE
-                                 indicates no restriction. */
-};
-OFP_ASSERT(sizeof(struct ofp_aggregate_stats_request) == 44);
-
-/* Body of reply to OFPST_AGGREGATE request. */
-struct ofp_aggregate_stats_reply {
-    uint64_t packet_count;    /* Number of packets in flows. */
-    uint64_t byte_count;      /* Number of bytes in flows. */
-    uint32_t flow_count;      /* Number of flows. */
-    uint8_t pad[4];           /* Align to 64 bits. */
-};
-OFP_ASSERT(sizeof(struct ofp_aggregate_stats_reply) == 24);
-
-/* Body of reply to OFPST_TABLE request. */
-struct ofp_table_stats {
-    uint8_t table_id;        /* Identifier of table.  Lower numbered tables
-                                are consulted first. */
-    uint8_t pad[3];          /* Align to 32-bits. */
-    char name[OFP_MAX_TABLE_NAME_LEN];
-    uint32_t wildcards;      /* Bitmap of OFPFW_* wildcards that are
-                                supported by the table. */
-    uint32_t max_entries;    /* Max number of entries supported. */
-    uint32_t active_count;   /* Number of active entries. */
-    uint64_t lookup_count;   /* Number of packets looked up in table. */
-    uint64_t matched_count;  /* Number of packets that hit table. */
-};
-OFP_ASSERT(sizeof(struct ofp_table_stats) == 64);
-
-/* Body for ofp_stats_request of type OFPST_PORT. */
-struct ofp_port_stats_request {
-    uint16_t port_no;        /* OFPST_PORT message must request statistics
-                              * either for a single port (specified in
-                              * port_no) or for all ports (if port_no ==
-                              * OFPP_NONE). */
-    uint8_t pad[6];
-};
-OFP_ASSERT(sizeof(struct ofp_port_stats_request) == 8);
-
-/* Body of reply to OFPST_PORT request. If a counter is unsupported, set
- * the field to all ones. */
-struct ofp_port_stats {
-    uint16_t port_no;
-    uint8_t pad[6];          /* Align to 64-bits. */
-    uint64_t rx_packets;     /* Number of received packets. */
-    uint64_t tx_packets;     /* Number of transmitted packets. */
-    uint64_t rx_bytes;       /* Number of received bytes. */
-    uint64_t tx_bytes;       /* Number of transmitted bytes. */
-    uint64_t rx_dropped;     /* Number of packets dropped by RX. */
-    uint64_t tx_dropped;     /* Number of packets dropped by TX. */
-    uint64_t rx_errors;      /* Number of receive errors.  This is a super-set
-                                of more specific receive errors and should be
-                                greater than or equal to the sum of all
-                                rx_*_err values. */
-    uint64_t tx_errors;      /* Number of transmit errors.  This is a super-set
-                                of more specific transmit errors and should be
-                                greater than or equal to the sum of all
-                                tx_*_err values (none currently defined.) */
-    uint64_t rx_frame_err;   /* Number of frame alignment errors. */
-    uint64_t rx_over_err;    /* Number of packets with RX overrun. */
-    uint64_t rx_crc_err;     /* Number of CRC errors. */
-    uint64_t collisions;     /* Number of collisions. */
-};
-OFP_ASSERT(sizeof(struct ofp_port_stats) == 104);
-
-/* Vendor extension. */
-struct ofp_vendor_header {
-    struct ofp_header header;   /* Type OFPT_VENDOR. */
-    uint32_t vendor;            /* Vendor ID:
-                                 * - MSB 0: low-order bytes are IEEE OUI.
-                                 * - MSB != 0: defined by OpenFlow
-                                 *   consortium. */
-    /* Vendor-defined arbitrary additional data. */
-};
-OFP_ASSERT(sizeof(struct ofp_vendor_header) == 12);
-
-/* All ones is used to indicate all queues in a port (for stats retrieval). */
-#define OFPQ_ALL      0xffffffff
-
-/* Min rate > 1000 means not configured. */
-#define OFPQ_MIN_RATE_UNCFG      0xffff
-
-enum ofp_queue_properties {
-    OFPQT_NONE = 0,       /* No property defined for queue (default). */
-    OFPQT_MIN_RATE,       /* Minimum datarate guaranteed. */
-                          /* Other types should be added here
-                           * (i.e. max rate, precedence, etc). */
-};
-
-/* Common description for a queue. */
-struct ofp_queue_prop_header {
-    uint16_t property;    /* One of OFPQT_. */
-    uint16_t len;         /* Length of property, including this header. */
-    uint8_t pad[4];       /* 64-bit alignemnt. */
-};
-OFP_ASSERT(sizeof(struct ofp_queue_prop_header) == 8);
-
-/* Min-Rate queue property description. */
-struct ofp_queue_prop_min_rate {
-    struct ofp_queue_prop_header prop_header; /* prop: OFPQT_MIN, len: 16. */
-    uint16_t rate;        /* In 1/10 of a percent; >1000 -> disabled. */
-    uint8_t pad[6];       /* 64-bit alignment */
-};
-OFP_ASSERT(sizeof(struct ofp_queue_prop_min_rate) == 16);
-
-/* Full description for a queue. */
-struct ofp_packet_queue {
-    uint32_t queue_id;     /* id for the specific queue. */
-    uint16_t len;          /* Length in bytes of this queue desc. */
-    uint8_t pad[2];        /* 64-bit alignment. */
-    struct ofp_queue_prop_header properties[0]; /* List of properties. */
-};
-OFP_ASSERT(sizeof(struct ofp_packet_queue) == 8);
-
-/* Query for port queue configuration. */
-struct ofp_queue_get_config_request {
-    struct ofp_header header;
-    uint16_t port;         /* Port to be queried. Should refer
-                              to a valid physical port (i.e. < OFPP_MAX) */
-    uint8_t pad[2];        /* 32-bit alignment. */
-};
-OFP_ASSERT(sizeof(struct ofp_queue_get_config_request) == 12);
-
-/* Queue configuration for a given port. */
-struct ofp_queue_get_config_reply {
-    struct ofp_header header;
-    uint16_t port;
-    uint8_t pad[6];
-    struct ofp_packet_queue queues[0]; /* List of configured queues. */
-};
-OFP_ASSERT(sizeof(struct ofp_queue_get_config_reply) == 16);
-
-/* OFPAT_ENQUEUE action struct: send packets to given queue on port. */
-struct ofp_action_enqueue {
-    uint16_t type;            /* OFPAT_ENQUEUE. */
-    uint16_t len;             /* Len is 16. */
-    uint16_t port;            /* Port that queue belongs. Should
-                                 refer to a valid physical port
-                                 (i.e. < OFPP_MAX) or OFPP_IN_PORT. */
-    uint8_t pad[6];           /* Pad for 64-bit alignment. */
-    uint32_t queue_id;        /* Where to enqueue the packets. */
-};
-OFP_ASSERT(sizeof(struct ofp_action_enqueue) == 16);
-
-struct ofp_queue_stats_request {
-    uint16_t port_no;        /* All ports if OFPT_ALL. */
-    uint8_t pad[2];          /* Align to 32-bits. */
-    uint32_t queue_id;       /* All queues if OFPQ_ALL. */
-};
-OFP_ASSERT(sizeof(struct ofp_queue_stats_request) == 8);
-
-struct ofp_queue_stats {
-    uint16_t port_no;
-    uint8_t pad[2];          /* Align to 32-bits. */
-    uint32_t queue_id;       /* Queue i.d */
-    uint64_t tx_bytes;       /* Number of transmitted bytes. */
-    uint64_t tx_packets;     /* Number of transmitted packets. */
-    uint64_t tx_errors;      /* Number of packets dropped due to overrun. */
-};
-OFP_ASSERT(sizeof(struct ofp_queue_stats) == 32);
-
-#endif /* openflow/openflow.h */
diff --git a/canonical/openflow.h-1.1 b/canonical/openflow.h-1.1
deleted file mode 100644
index 022c320..0000000
--- a/canonical/openflow.h-1.1
+++ /dev/null
@@ -1,1413 +0,0 @@
-/* Copyright (c) 2008 The Board of Trustees of The Leland Stanford
- * Junior University
- *
- * We are making the OpenFlow specification and associated documentation
- * (Software) available for public use and benefit with the expectation
- * that others will use, modify and enhance the Software and contribute
- * those enhancements back to the community. However, since we would
- * like to make the Software available for broadest use, with as few
- * restrictions as possible permission is hereby granted, free of
- * charge, to any person obtaining a copy of this Software to deal in
- * the Software under the copyrights without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sublicense, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
- * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
- * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- *
- * The name and trademarks of copyright holder(s) may NOT be used in
- * advertising or publicity pertaining to the Software or any
- * derivatives without specific, written prior permission.
- */
-
-/* OpenFlow: protocol between controller and datapath. */
-
-#ifndef OPENFLOW_OPENFLOW_H
-#define OPENFLOW_OPENFLOW_H 1
-
-#ifdef __KERNEL__
-#include <linux/types.h>
-#else
-#include <stdint.h>
-#endif
-
-#ifdef SWIG
-#define OFP_ASSERT(EXPR)        /* SWIG can't handle OFP_ASSERT. */
-#elif !defined(__cplusplus)
-/* Build-time assertion for use in a declaration context. */
-#define OFP_ASSERT(EXPR)                                                \
-        extern int (*build_assert(void))[ sizeof(struct {               \
-                    unsigned int build_assert_failed : (EXPR) ? 1 : -1; })]
-#else /* __cplusplus */
-#define OFP_ASSERT(_EXPR) typedef int build_assert_failed[(_EXPR) ? 1 : -1]
-#endif /* __cplusplus */
-
-#ifndef SWIG
-#define OFP_PACKED __attribute__((packed))
-#else
-#define OFP_PACKED              /* SWIG doesn't understand __attribute. */
-#endif
-
-/* Version number:
- * Non-experimental versions released: 0x01
- * Experimental versions released: 0x81 -- 0x99
- */
-/* The most significant bit being set in the version field indicates an
- * experimental OpenFlow version.
- */
-#define OFP_VERSION   0x02
-
-#define OFP_MAX_TABLE_NAME_LEN 32
-#define OFP_MAX_PORT_NAME_LEN  16
-
-#define OFP_TCP_PORT  6633
-#define OFP_SSL_PORT  6633
-
-#define OFP_ETH_ALEN 6          /* Bytes in an Ethernet address. */
-
-/* Port numbering. Ports are numbered starting from 1. */
-enum ofp_port_no {
-    /* Maximum number of physical switch ports. */
-    OFPP_MAX        = 0xffffff00,
-
-    /* Fake output "ports". */
-    OFPP_IN_PORT    = 0xfffffff8,  /* Send the packet out the input port.  This
-                                      virtual port must be explicitly used
-                                      in order to send back out of the input
-                                      port. */
-    OFPP_TABLE      = 0xfffffff9,  /* Submit the packet to the first flow table
-                                      NB: This destination port can only be
-                                      used in packet-out messages. */
-    OFPP_NORMAL     = 0xfffffffa,  /* Process with normal L2/L3 switching. */
-    OFPP_FLOOD      = 0xfffffffb,  /* All physical ports in VLAN, except input
-                                      port and those blocked or link down. */
-    OFPP_ALL        = 0xfffffffc,  /* All physical ports except input port. */
-    OFPP_CONTROLLER = 0xfffffffd,  /* Send to controller. */
-    OFPP_LOCAL      = 0xfffffffe,  /* Local openflow "port". */
-    OFPP_ANY        = 0xffffffff   /* Wildcard port used only for flow mod
-                                      (delete) and flow stats requests. Selects
-                                      all flows regardless of output port
-                                      (including flows with no output port). */
-};
-
-enum ofp_type {
-    /* Immutable messages. */
-    OFPT_HELLO,               /* Symmetric message */
-    OFPT_ERROR,               /* Symmetric message */
-    OFPT_ECHO_REQUEST,        /* Symmetric message */
-    OFPT_ECHO_REPLY,          /* Symmetric message */
-    OFPT_EXPERIMENTER,        /* Symmetric message */
-
-    /* Switch configuration messages. */
-    OFPT_FEATURES_REQUEST,    /* Controller/switch message */
-    OFPT_FEATURES_REPLY,      /* Controller/switch message */
-    OFPT_GET_CONFIG_REQUEST,  /* Controller/switch message */
-    OFPT_GET_CONFIG_REPLY,    /* Controller/switch message */
-    OFPT_SET_CONFIG,          /* Controller/switch message */
-
-    /* Asynchronous messages. */
-    OFPT_PACKET_IN,           /* Async message */
-    OFPT_FLOW_REMOVED,        /* Async message */
-    OFPT_PORT_STATUS,         /* Async message */
-
-    /* Controller command messages. */
-    OFPT_PACKET_OUT,          /* Controller/switch message */
-    OFPT_FLOW_MOD,            /* Controller/switch message */
-    OFPT_GROUP_MOD,           /* Controller/switch message */
-    OFPT_PORT_MOD,            /* Controller/switch message */
-    OFPT_TABLE_MOD,           /* Controller/switch message */
-
-    /* Statistics messages. */
-    OFPT_STATS_REQUEST,       /* Controller/switch message */
-    OFPT_STATS_REPLY,         /* Controller/switch message */
-
-    /* Barrier messages. */
-    OFPT_BARRIER_REQUEST,     /* Controller/switch message */
-    OFPT_BARRIER_REPLY,       /* Controller/switch message */
-
-    /* Queue Configuration messages. */
-    OFPT_QUEUE_GET_CONFIG_REQUEST,  /* Controller/switch message */
-    OFPT_QUEUE_GET_CONFIG_REPLY,     /* Controller/switch message */
-};
-
-/* Header on all OpenFlow packets. */
-struct ofp_header {
-    uint8_t version;    /* OFP_VERSION. */
-    uint8_t type;       /* One of the OFPT_ constants. */
-    uint16_t length;    /* Length including this ofp_header. */
-    uint32_t xid;       /* Transaction id associated with this packet.
-                           Replies use the same id as was in the request
-                           to facilitate pairing. */
-};
-OFP_ASSERT(sizeof(struct ofp_header) == 8);
-
-/* OFPT_HELLO.  This message has an empty body, but implementations must
- * ignore any data included in the body, to allow for future extensions. */
-struct ofp_hello {
-    struct ofp_header header;
-};
-
-#define OFP_DEFAULT_MISS_SEND_LEN   128
-
-enum ofp_config_flags {
-    /* Handling of IP fragments. */
-    OFPC_FRAG_NORMAL   = 0,       /* No special handling for fragments. */
-    OFPC_FRAG_DROP     = 1 << 0,  /* Drop fragments. */
-    OFPC_FRAG_REASM    = 1 << 1,  /* Reassemble (only if OFPC_IP_REASM set). */
-    OFPC_FRAG_MASK     = 3,
-
-    /* TTL processing - applicable for IP and MPLS packets */
-    OFPC_INVALID_TTL_TO_CONTROLLER = 1 << 2, /* Send packets with invalid TTL
-                                                ie. 0 or 1 to controller */
-};
-
-/* Switch configuration. */
-struct ofp_switch_config {
-    struct ofp_header header;
-    uint16_t flags;             /* OFPC_* flags. */
-    uint16_t miss_send_len;     /* Max bytes of new flow that datapath should
-                                   send to the controller. */
-};
-OFP_ASSERT(sizeof(struct ofp_switch_config) == 12);
-
-/* Flags to indicate behavior of the flow table for unmatched packets.
-   These flags are used in ofp_table_stats messages to describe the current
-   configuration and in ofp_table_mod messages to configure table behavior. */
-enum ofp_table_config {
-    OFPTC_TABLE_MISS_CONTROLLER = 0,      /* Send to controller. */
-    OFPTC_TABLE_MISS_CONTINUE   = 1 << 0, /* Continue to the next table in the
-                                             pipeline (OpenFlow 1.0
-                                             behavior). */
-    OFPTC_TABLE_MISS_DROP       = 1 << 1, /* Drop the packet. */
-    OFPTC_TABLE_MISS_MASK       = 3
-};
-
-/* Configure/Modify behavior of a flow table */
-struct ofp_table_mod {
-    struct ofp_header header;
-    uint8_t table_id;       /* ID of the table, 0xFF indicates all tables */
-    uint8_t pad[3];         /* Pad to 32 bits */
-    uint32_t config;        /* Bitmap of OFPTC_* flags */
-};
-OFP_ASSERT(sizeof(struct ofp_table_mod) == 16);
-
-/* Capabilities supported by the datapath. */
-enum ofp_capabilities {
-    OFPC_FLOW_STATS     = 1 << 0,  /* Flow statistics. */
-    OFPC_TABLE_STATS    = 1 << 1,  /* Table statistics. */
-    OFPC_PORT_STATS     = 1 << 2,  /* Port statistics. */
-    OFPC_GROUP_STATS    = 1 << 3,  /* Group statistics. */
-    OFPC_IP_REASM       = 1 << 5,  /* Can reassemble IP fragments. */
-    OFPC_QUEUE_STATS    = 1 << 6,  /* Queue statistics. */
-    OFPC_ARP_MATCH_IP   = 1 << 7   /* Match IP addresses in ARP pkts. */
-};
-
-/* Flags to indicate behavior of the physical port.  These flags are
- * used in ofp_port to describe the current configuration.  They are
- * used in the ofp_port_mod message to configure the port's behavior.
- */
-enum ofp_port_config {
-    OFPPC_PORT_DOWN    = 1 << 0,  /* Port is administratively down. */
-
-    OFPPC_NO_RECV      = 1 << 2,  /* Drop all packets received by port. */
-    OFPPC_NO_FWD       = 1 << 5,  /* Drop packets forwarded to port. */
-    OFPPC_NO_PACKET_IN = 1 << 6   /* Do not send packet-in msgs for port. */
-};
-
-/* Current state of the physical port.  These are not configurable from
- * the controller.
- */
-enum ofp_port_state {
-    OFPPS_LINK_DOWN    = 1 << 0,  /* No physical link present. */
-    OFPPS_BLOCKED      = 1 << 1,  /* Port is blocked */
-    OFPPS_LIVE         = 1 << 2,  /* Live for Fast Failover Group. */
-};
-
-/* Features of ports available in a datapath. */
-enum ofp_port_features {
-    OFPPF_10MB_HD    = 1 << 0,  /* 10 Mb half-duplex rate support. */
-    OFPPF_10MB_FD    = 1 << 1,  /* 10 Mb full-duplex rate support. */
-    OFPPF_100MB_HD   = 1 << 2,  /* 100 Mb half-duplex rate support. */
-    OFPPF_100MB_FD   = 1 << 3,  /* 100 Mb full-duplex rate support. */
-    OFPPF_1GB_HD     = 1 << 4,  /* 1 Gb half-duplex rate support. */
-    OFPPF_1GB_FD     = 1 << 5,  /* 1 Gb full-duplex rate support. */
-    OFPPF_10GB_FD    = 1 << 6,  /* 10 Gb full-duplex rate support. */
-    OFPPF_40GB_FD    = 1 << 7,  /* 40 Gb full-duplex rate support. */
-    OFPPF_100GB_FD   = 1 << 8,  /* 100 Gb full-duplex rate support. */
-    OFPPF_1TB_FD     = 1 << 9,  /* 1 Tb full-duplex rate support. */
-    OFPPF_OTHER      = 1 << 10, /* Other rate, not in the list. */
-
-    OFPPF_COPPER     = 1 << 11, /* Copper medium. */
-    OFPPF_FIBER      = 1 << 12, /* Fiber medium. */
-    OFPPF_AUTONEG    = 1 << 13, /* Auto-negotiation. */
-    OFPPF_PAUSE      = 1 << 14, /* Pause. */
-    OFPPF_PAUSE_ASYM = 1 << 15  /* Asymmetric pause. */
-};
-
-/* Description of a port */
-struct ofp_port {
-    uint32_t port_no;
-    uint8_t pad[4];
-    uint8_t hw_addr[OFP_ETH_ALEN];
-    uint8_t pad2[2];                  /* Align to 64 bits. */
-    char name[OFP_MAX_PORT_NAME_LEN]; /* Null-terminated */
-
-    uint32_t config;        /* Bitmap of OFPPC_* flags. */
-    uint32_t state;         /* Bitmap of OFPPS_* flags. */
-
-    /* Bitmaps of OFPPF_* that describe features.  All bits zeroed if
-     * unsupported or unavailable. */
-    uint32_t curr;          /* Current features. */
-    uint32_t advertised;    /* Features being advertised by the port. */
-    uint32_t supported;     /* Features supported by the port. */
-    uint32_t peer;          /* Features advertised by peer. */
-
-    uint32_t curr_speed;    /* Current port bitrate in kbps. */
-    uint32_t max_speed;     /* Max port bitrate in kbps */
-};
-OFP_ASSERT(sizeof(struct ofp_port) == 64);
-
-/* Switch features. */
-struct ofp_switch_features {
-    struct ofp_header header;
-    uint64_t datapath_id;   /* Datapath unique ID.  The lower 48-bits are for
-                               a MAC address, while the upper 16-bits are
-                               implementer-defined. */
-
-    uint32_t n_buffers;     /* Max packets buffered at once. */
-
-    uint8_t n_tables;       /* Number of tables supported by datapath. */
-    uint8_t pad[3];         /* Align to 64-bits. */
-
-    /* Features. */
-    uint32_t capabilities;  /* Bitmap of support "ofp_capabilities". */
-    uint32_t reserved;
-
-    /* Port info.*/
-    struct ofp_port ports[0];  /* Port definitions.  The number of ports
-                                  is inferred from the length field in
-                                  the header. */
-};
-OFP_ASSERT(sizeof(struct ofp_switch_features) == 32);
-
-/* What changed about the physical port */
-enum ofp_port_reason {
-    OFPPR_ADD,              /* The port was added. */
-    OFPPR_DELETE,           /* The port was removed. */
-    OFPPR_MODIFY            /* Some attribute of the port has changed. */
-};
-
-/* A physical port has changed in the datapath */
-struct ofp_port_status {
-    struct ofp_header header;
-    uint8_t reason;          /* One of OFPPR_*. */
-    uint8_t pad[7];          /* Align to 64-bits. */
-    struct ofp_port desc;
-};
-OFP_ASSERT(sizeof(struct ofp_port_status) == 80);
-
-/* Modify behavior of the physical port */
-struct ofp_port_mod {
-    struct ofp_header header;
-    uint32_t port_no;
-    uint8_t pad[4];
-    uint8_t hw_addr[OFP_ETH_ALEN]; /* The hardware address is not
-                                      configurable.  This is used to
-                                      sanity-check the request, so it must
-                                      be the same as returned in an
-                                      ofp_port struct. */
-    uint8_t pad2[2];        /* Pad to 64 bits. */
-    uint32_t config;        /* Bitmap of OFPPC_* flags. */
-    uint32_t mask;          /* Bitmap of OFPPC_* flags to be changed. */
-
-    uint32_t advertise;     /* Bitmap of OFPPF_*.  Zero all bits to prevent
-                               any action taking place. */
-    uint8_t pad3[4];        /* Pad to 64 bits. */
-};
-OFP_ASSERT(sizeof(struct ofp_port_mod) == 40);
-
-/* Why is this packet being sent to the controller? */
-enum ofp_packet_in_reason {
-    OFPR_NO_MATCH,          /* No matching flow. */
-    OFPR_ACTION             /* Action explicitly output to controller. */
-};
-
-/* Packet received on port (datapath -> controller). */
-struct ofp_packet_in {
-    struct ofp_header header;
-    uint32_t buffer_id;     /* ID assigned by datapath. */
-    uint32_t in_port;       /* Port on which frame was received. */
-    uint32_t in_phy_port;   /* Physical Port on which frame was received. */
-    uint16_t total_len;     /* Full length of frame. */
-    uint8_t reason;         /* Reason packet is being sent (one of OFPR_*) */
-    uint8_t table_id;       /* ID of the table that was looked up */
-    uint8_t data[0];        /* Ethernet frame, halfway through 32-bit word,
-                               so the IP header is 32-bit aligned.  The
-                               amount of data is inferred from the length
-                               field in the header.  Because of padding,
-                               offsetof(struct ofp_packet_in, data) ==
-                               sizeof(struct ofp_packet_in) - 2. */
-};
-OFP_ASSERT(sizeof(struct ofp_packet_in) == 24);
-
-enum ofp_action_type {
-    OFPAT_OUTPUT,           /* Output to switch port. */
-    OFPAT_SET_VLAN_VID,     /* Set the 802.1q VLAN id. */
-    OFPAT_SET_VLAN_PCP,     /* Set the 802.1q priority. */
-    OFPAT_SET_DL_SRC,       /* Ethernet source address. */
-    OFPAT_SET_DL_DST,       /* Ethernet destination address. */
-    OFPAT_SET_NW_SRC,       /* IP source address. */
-    OFPAT_SET_NW_DST,       /* IP destination address. */
-    OFPAT_SET_NW_TOS,       /* IP ToS (DSCP field, 6 bits). */
-    OFPAT_SET_NW_ECN,       /* IP ECN (2 bits). */
-    OFPAT_SET_TP_SRC,       /* TCP/UDP/SCTP source port. */
-    OFPAT_SET_TP_DST,       /* TCP/UDP/SCTP destination port. */
-    OFPAT_COPY_TTL_OUT,     /* Copy TTL "outwards" -- from next-to-outermost to
-                               outermost */
-    OFPAT_COPY_TTL_IN,      /* Copy TTL "inwards" -- from outermost to
-                               next-to-outermost */
-    OFPAT_SET_MPLS_LABEL,   /* MPLS label */
-    OFPAT_SET_MPLS_TC,      /* MPLS TC */
-    OFPAT_SET_MPLS_TTL,     /* MPLS TTL */
-    OFPAT_DEC_MPLS_TTL,     /* Decrement MPLS TTL */
-
-    OFPAT_PUSH_VLAN,        /* Push a new VLAN tag */
-    OFPAT_POP_VLAN,         /* Pop the outer VLAN tag */
-    OFPAT_PUSH_MPLS,        /* Push a new MPLS tag */
-    OFPAT_POP_MPLS,         /* Pop the outer MPLS tag */
-    OFPAT_SET_QUEUE,        /* Set queue id when outputting to a port */
-    OFPAT_GROUP,            /* Apply group. */
-    OFPAT_SET_NW_TTL,       /* IP TTL. */
-    OFPAT_DEC_NW_TTL,       /* Decrement IP TTL. */
-    OFPAT_EXPERIMENTER = 0xffff
-};
-
-/* Action structure for OFPAT_OUTPUT, which sends packets out 'port'.
- * When the 'port' is the OFPP_CONTROLLER, 'max_len' indicates the max
- * number of bytes to send.  A 'max_len' of zero means no bytes of the
- * packet should be sent.*/
-struct ofp_action_output {
-    uint16_t type;                  /* OFPAT_OUTPUT. */
-    uint16_t len;                   /* Length is 16. */
-    uint32_t port;                  /* Output port. */
-    uint16_t max_len;               /* Max length to send to controller. */
-    uint8_t pad[6];                 /* Pad to 64 bits. */
-};
-OFP_ASSERT(sizeof(struct ofp_action_output) == 16);
-
-/* Action structure for OFPAT_SET_VLAN_VID. */
-struct ofp_action_vlan_vid {
-    uint16_t type;                  /* OFPAT_SET_VLAN_VID. */
-    uint16_t len;                   /* Length is 8. */
-    uint16_t vlan_vid;              /* VLAN id. */
-    uint8_t pad[2];
-};
-OFP_ASSERT(sizeof(struct ofp_action_vlan_vid) == 8);
-
-/* Action structure for OFPAT_SET_VLAN_PCP. */
-struct ofp_action_vlan_pcp {
-    uint16_t type;                  /* OFPAT_SET_VLAN_PCP. */
-    uint16_t len;                   /* Length is 8. */
-    uint8_t vlan_pcp;               /* VLAN priority. */
-    uint8_t pad[3];
-};
-OFP_ASSERT(sizeof(struct ofp_action_vlan_pcp) == 8);
-
-/* Action structure for OFPAT_SET_DL_SRC/DST. */
-struct ofp_action_dl_addr {
-    uint16_t type;                  /* OFPAT_SET_DL_SRC/DST. */
-    uint16_t len;                   /* Length is 16. */
-    uint8_t dl_addr[OFP_ETH_ALEN];  /* Ethernet address. */
-    uint8_t pad[6];
-};
-OFP_ASSERT(sizeof(struct ofp_action_dl_addr) == 16);
-
-/* Action structure for OFPAT_SET_NW_SRC/DST. */
-struct ofp_action_nw_addr {
-    uint16_t type;                  /* OFPAT_SET_TW_SRC/DST. */
-    uint16_t len;                   /* Length is 8. */
-    uint32_t nw_addr;               /* IP address. */
-};
-OFP_ASSERT(sizeof(struct ofp_action_nw_addr) == 8);
-
-/* Action structure for OFPAT_SET_TP_SRC/DST. */
-struct ofp_action_tp_port {
-    uint16_t type;                  /* OFPAT_SET_TP_SRC/DST. */
-    uint16_t len;                   /* Length is 8. */
-    uint16_t tp_port;               /* TCP/UDP/SCTP port. */
-    uint8_t pad[2];
-};
-OFP_ASSERT(sizeof(struct ofp_action_tp_port) == 8);
-
-/* Action structure for OFPAT_SET_NW_TOS. */
-struct ofp_action_nw_tos {
-    uint16_t type;                  /* OFPAT_SET_TW_SRC/DST. */
-    uint16_t len;                   /* Length is 8. */
-    uint8_t nw_tos;                 /* IP ToS (DSCP field, 6 bits). */
-    uint8_t pad[3];
-};
-OFP_ASSERT(sizeof(struct ofp_action_nw_tos) == 8);
-
-/* Action structure for OFPAT_SET_NW_ECN. */
-struct ofp_action_nw_ecn {
-    uint16_t type;                  /* OFPAT_SET_TW_SRC/DST. */
-    uint16_t len;                   /* Length is 8. */
-    uint8_t nw_ecn;                 /* IP ECN (2 bits). */
-    uint8_t pad[3];
-};
-OFP_ASSERT(sizeof(struct ofp_action_nw_ecn) == 8);
-
-/* Action structure for OFPAT_SET_MPLS_LABEL. */
-struct ofp_action_mpls_label {
-    uint16_t type;                  /* OFPAT_SET_MPLS_LABEL. */
-    uint16_t len;                   /* Length is 8. */
-    uint32_t mpls_label;            /* MPLS label */
-};
-OFP_ASSERT(sizeof(struct ofp_action_mpls_label) == 8);
-
-/* Action structure for OFPAT_SET_MPLS_TC. */
-struct ofp_action_mpls_tc {
-    uint16_t type;                  /* OFPAT_SET_MPLS_TC. */
-    uint16_t len;                   /* Length is 8. */
-    uint8_t mpls_tc;                /* MPLS TC */
-    uint8_t pad[3];
-};
-OFP_ASSERT(sizeof(struct ofp_action_mpls_tc) == 8);
-
-/* Action structure for OFPAT_SET_MPLS_TTL. */
-struct ofp_action_mpls_ttl {
-    uint16_t type;                  /* OFPAT_SET_MPLS_TTL. */
-    uint16_t len;                   /* Length is 8. */
-    uint8_t mpls_ttl;               /* MPLS TTL */
-    uint8_t pad[3];
-};
-OFP_ASSERT(sizeof(struct ofp_action_mpls_ttl) == 8);
-
-/* Action structure for OFPAT_PUSH_VLAN/MPLS. */
-struct ofp_action_push {
-    uint16_t type;                  /* OFPAT_PUSH_VLAN/MPLS. */
-    uint16_t len;                   /* Length is 8. */
-    uint16_t ethertype;             /* Ethertype */
-    uint8_t pad[2];
-};
-OFP_ASSERT(sizeof(struct ofp_action_push) == 8);
-
-/* Action structure for OFPAT_POP_MPLS. */
-struct ofp_action_pop_mpls {
-    uint16_t type;                  /* OFPAT_POP_MPLS. */
-    uint16_t len;                   /* Length is 8. */
-    uint16_t ethertype;             /* Ethertype */
-    uint8_t pad[2];
-};
-OFP_ASSERT(sizeof(struct ofp_action_pop_mpls) == 8);
-
-/* Action structure for OFPAT_GROUP. */
-struct ofp_action_group {
-    uint16_t type;                  /* OFPAT_GROUP. */
-    uint16_t len;                   /* Length is 8. */
-    uint32_t group_id;              /* Group identifier. */
-};
-OFP_ASSERT(sizeof(struct ofp_action_group) == 8);
-
-/* Action structure for OFPAT_SET_NW_TTL. */
-struct ofp_action_nw_ttl {
-    uint16_t type;                  /* OFPAT_SET_NW_TTL. */
-    uint16_t len;                   /* Length is 8. */
-    uint8_t nw_ttl;                 /* IP TTL */
-    uint8_t pad[3];
-};
-OFP_ASSERT(sizeof(struct ofp_action_nw_ttl) == 8);
-
-/* Action header for OFPAT_EXPERIMENTER.
- * The rest of the body is experimenter-defined. */
-struct ofp_action_experimenter_header {
-    uint16_t type;                  /* OFPAT_EXPERIMENTER. */
-    uint16_t len;                   /* Length is a multiple of 8. */
-    uint32_t experimenter;          /* Experimenter ID which takes the same
-                                       form as in struct
-                                       ofp_experimenter_header. */
-};
-OFP_ASSERT(sizeof(struct ofp_action_experimenter_header) == 8);
-
-/* Action header that is common to all actions.  The length includes the
- * header and any padding used to make the action 64-bit aligned.
- * NB: The length of an action *must* always be a multiple of eight. */
-struct ofp_action_header {
-    uint16_t type;                  /* One of OFPAT_*. */
-    uint16_t len;                   /* Length of action, including this
-                                       header.  This is the length of action,
-                                       including any padding to make it
-                                       64-bit aligned. */
-    uint8_t pad[4];
-};
-OFP_ASSERT(sizeof(struct ofp_action_header) == 8);
-
-/* Send packet (controller -> datapath). */
-struct ofp_packet_out {
-    struct ofp_header header;
-    uint32_t buffer_id;           /* ID assigned by datapath (-1 if none). */
-    uint32_t in_port;             /* Packet's input port or OFPP_CONTROLLER. */
-    uint16_t actions_len;         /* Size of action array in bytes. */
-    uint8_t pad[6];
-    struct ofp_action_header actions[0]; /* Action list. */
-    /* uint8_t data[0]; */        /* Packet data.  The length is inferred
-                                     from the length field in the header.
-                                     (Only meaningful if buffer_id == -1.) */
-};
-OFP_ASSERT(sizeof(struct ofp_packet_out) == 24);
-
-enum ofp_flow_mod_command {
-    OFPFC_ADD,              /* New flow. */
-    OFPFC_MODIFY,           /* Modify all matching flows. */
-    OFPFC_MODIFY_STRICT,    /* Modify entry strictly matching wildcards and
-                               priority. */
-    OFPFC_DELETE,           /* Delete all matching flows. */
-    OFPFC_DELETE_STRICT     /* Delete entry strictly matching wildcards and
-                               priority. */
-};
-
-/* Group commands */
-enum ofp_group_mod_command {
-    OFPGC_ADD,              /* New group. */
-    OFPGC_MODIFY,           /* Modify all matching groups. */
-    OFPGC_DELETE,           /* Delete all matching groups. */
-};
-
-/* Flow wildcards. */
-enum ofp_flow_wildcards {
-    OFPFW_IN_PORT     = 1 << 0,  /* Switch input port. */
-    OFPFW_DL_VLAN     = 1 << 1,  /* VLAN id. */
-    OFPFW_DL_VLAN_PCP = 1 << 2,  /* VLAN priority. */
-    OFPFW_DL_TYPE     = 1 << 3,  /* Ethernet frame type. */
-    OFPFW_NW_TOS      = 1 << 4,  /* IP ToS (DSCP field, 6 bits). */
-    OFPFW_NW_PROTO    = 1 << 5,  /* IP protocol. */
-    OFPFW_TP_SRC      = 1 << 6,  /* TCP/UDP/SCTP source port. */
-    OFPFW_TP_DST      = 1 << 7,  /* TCP/UDP/SCTP destination port. */
-    OFPFW_MPLS_LABEL  = 1 << 8,  /* MPLS label. */
-    OFPFW_MPLS_TC     = 1 << 9,  /* MPLS TC. */
-
-    /* Wildcard all fields. */
-    OFPFW_ALL           = ((1 << 10) - 1)
-};
-
-/* The wildcards for ICMP type and code fields use the transport source
- * and destination port fields, respectively. */
-#define OFPFW_ICMP_TYPE OFPFW_TP_SRC
-#define OFPFW_ICMP_CODE OFPFW_TP_DST
-
-/* Values below this cutoff are 802.3 packets and the two bytes
- * following MAC addresses are used as a frame length.  Otherwise, the
- * two bytes are used as the Ethernet type.
- */
-#define OFP_DL_TYPE_ETH2_CUTOFF   0x0600
-
-/* Value of dl_type to indicate that the frame does not include an
- * Ethernet type.
- */
-#define OFP_DL_TYPE_NOT_ETH_TYPE  0x05ff
-
-/* The VLAN id is 12-bits, so we can use the entire 16 bits to indicate
- * special conditions.
- */
-enum ofp_vlan_id {
-    OFPVID_ANY  = 0xfffe, /* Indicate that a VLAN id is set but don't care
-                             about it's value. Note: only valid when specifying
-                             the VLAN id in a match */
-    OFPVID_NONE = 0xffff, /* No VLAN id was set. */
-};
-/* Define for compatibility */
-#define OFP_VLAN_NONE      OFPVID_NONE
-
-/* The match type indicates the match structure (set of fields that compose the
- * match) in use. The match type is placed in the type field at the beginning
- * of all match structures. The "standard" type corresponds to ofp_match and
- * must be supported by all OpenFlow switches. Extensions that define other
- * match types may be published on the OpenFlow wiki. Support for extensions is
- * optional.
- */
-enum ofp_match_type {
-    OFPMT_STANDARD,           /* The match fields defined in the ofp_match
-                                 structure apply */
-};
-
-/* Size/length of STANDARD match */
-#define OFPMT_STANDARD_LENGTH   88
-
-/* Fields to match against flows */
-struct ofp_match {
-    uint16_t type;             /* One of OFPMT_* */
-    uint16_t length;           /* Length of ofp_match */
-    uint32_t in_port;          /* Input switch port. */
-    uint32_t wildcards;        /* Wildcard fields. */
-    uint8_t dl_src[OFP_ETH_ALEN]; /* Ethernet source address. */
-    uint8_t dl_src_mask[OFP_ETH_ALEN]; /* Ethernet source address mask. */
-    uint8_t dl_dst[OFP_ETH_ALEN]; /* Ethernet destination address. */
-    uint8_t dl_dst_mask[OFP_ETH_ALEN]; /* Ethernet destination address mask. */
-    uint16_t dl_vlan;          /* Input VLAN id. */
-    uint8_t dl_vlan_pcp;       /* Input VLAN priority. */
-    uint8_t pad1[1];           /* Align to 32-bits */
-    uint16_t dl_type;          /* Ethernet frame type. */
-    uint8_t nw_tos;            /* IP ToS (actually DSCP field, 6 bits). */
-    uint8_t nw_proto;          /* IP protocol or lower 8 bits of
-                                * ARP opcode. */
-    uint32_t nw_src;           /* IP source address. */
-    uint32_t nw_src_mask;      /* IP source address mask. */
-    uint32_t nw_dst;           /* IP destination address. */
-    uint32_t nw_dst_mask;      /* IP destination address mask. */
-    uint16_t tp_src;           /* TCP/UDP/SCTP source port. */
-    uint16_t tp_dst;           /* TCP/UDP/SCTP destination port. */
-    uint32_t mpls_label;       /* MPLS label. */
-    uint8_t mpls_tc;           /* MPLS TC. */
-    uint8_t pad2[3];           /* Align to 64-bits */
-    uint64_t metadata;         /* Metadata passed between tables. */
-    uint64_t metadata_mask;    /* Mask for metadata. */
-};
-OFP_ASSERT(sizeof(struct ofp_match) == OFPMT_STANDARD_LENGTH);
-
-/* The match fields for ICMP type and code use the transport source and
- * destination port fields, respectively. */
-#define icmp_type tp_src
-#define icmp_code tp_dst
-
-/* Value used in "idle_timeout" and "hard_timeout" to indicate that the entry
- * is permanent. */
-#define OFP_FLOW_PERMANENT 0
-
-/* By default, choose a priority in the middle. */
-#define OFP_DEFAULT_PRIORITY 0x8000
-
-enum ofp_instruction_type {
-    OFPIT_GOTO_TABLE = 1,       /* Setup the next table in the lookup
-                                   pipeline */
-    OFPIT_WRITE_METADATA = 2,   /* Setup the metadata field for use later in
-                                   pipeline */
-    OFPIT_WRITE_ACTIONS = 3,    /* Write the action(s) onto the datapath action
-                                   set */
-    OFPIT_APPLY_ACTIONS = 4,    /* Applies the action(s) immediately */
-    OFPIT_CLEAR_ACTIONS = 5,    /* Clears all actions from the datapath
-                                   action set */
-
-    OFPIT_EXPERIMENTER = 0xFFFF  /* Experimenter instruction */
-};
-
-/* Generic ofp_instruction structure */
-struct ofp_instruction {
-    uint16_t type;                /* Instruction type */
-    uint16_t len;                 /* Length of this struct in bytes. */
-    uint8_t pad[4];               /* Align to 64-bits */
-};
-OFP_ASSERT(sizeof(struct ofp_instruction) == 8);
-
-/* Instruction structure for OFPIT_GOTO_TABLE */
-struct ofp_instruction_goto_table {
-    uint16_t type;                /* OFPIT_GOTO_TABLE */
-    uint16_t len;                 /* Length of this struct in bytes. */
-    uint8_t table_id;             /* Set next table in the lookup pipeline */
-    uint8_t pad[3];               /* Pad to 64 bits. */
-};
-OFP_ASSERT(sizeof(struct ofp_instruction_goto_table) == 8);
-
-/* Instruction structure for OFPIT_WRITE_METADATA */
-struct ofp_instruction_write_metadata {
-    uint16_t type;                /* OFPIT_WRITE_METADATA */
-    uint16_t len;                 /* Length of this struct in bytes. */
-    uint8_t pad[4];               /* Align to 64-bits */
-    uint64_t metadata;            /* Metadata value to write */
-    uint64_t metadata_mask;       /* Metadata write bitmask */
-};
-OFP_ASSERT(sizeof(struct ofp_instruction_write_metadata) == 24);
-
-/* Instruction structure for OFPIT_WRITE/APPLY/CLEAR_ACTIONS */
-struct ofp_instruction_actions {
-    uint16_t type;              /* One of OFPIT_*_ACTIONS */
-    uint16_t len;               /* Length of this struct in bytes. */
-    uint8_t pad[4];             /* Align to 64-bits */
-    struct ofp_action_header actions[0];  /* Actions associated with
-                                             OFPIT_WRITE_ACTIONS and
-                                             OFPIT_APPLY_ACTIONS */
-};
-OFP_ASSERT(sizeof(struct ofp_instruction_actions) == 8);
-
-/* Instruction structure for experimental instructions */
-struct ofp_instruction_experimenter {
-    uint16_t type;		/* OFPIT_EXPERIMENTER */
-    uint16_t len;               /* Length of this struct in bytes */
-    uint32_t experimenter;      /* Experimenter ID:
-                                 * - MSB 0: low-order bytes are IEEE OUI.
-                                 * - MSB != 0: defined by OpenFlow
-                                 *   consortium. */
-    /* Experimenter-defined arbitrary additional data. */
-};
-OFP_ASSERT(sizeof(struct ofp_instruction_experimenter) == 8);
-
-enum ofp_flow_mod_flags {
-    OFPFF_SEND_FLOW_REM = 1 << 0,  /* Send flow removed message when flow
-                                    * expires or is deleted. */
-    OFPFF_CHECK_OVERLAP = 1 << 1   /* Check for overlapping entries first. */
-};
-
-/* Flow setup and teardown (controller -> datapath). */
-struct ofp_flow_mod {
-    struct ofp_header header;
-    uint64_t cookie;             /* Opaque controller-issued identifier. */
-    uint64_t cookie_mask;        /* Mask used to restrict the cookie bits
-                                    that must match when the command is
-                                    OFPFC_MODIFY* or OFPFC_DELETE*. A value
-                                    of 0 indicates no restriction. */
-
-    /* Flow actions. */
-    uint8_t table_id;             /* ID of the table to put the flow in */
-    uint8_t command;              /* One of OFPFC_*. */
-    uint16_t idle_timeout;        /* Idle time before discarding (seconds). */
-    uint16_t hard_timeout;        /* Max time before discarding (seconds). */
-    uint16_t priority;            /* Priority level of flow entry. */
-    uint32_t buffer_id;           /* Buffered packet to apply to (or -1).
-                                     Not meaningful for OFPFC_DELETE*. */
-    uint32_t out_port;            /* For OFPFC_DELETE* commands, require
-                                     matching entries to include this as an
-                                     output port.  A value of OFPP_ANY
-                                     indicates no restriction. */
-    uint32_t out_group;           /* For OFPFC_DELETE* commands, require
-                                     matching entries to include this as an
-                                     output group.  A value of OFPG_ANY
-                                     indicates no restriction. */
-    uint16_t flags;               /* One of OFPFF_*. */
-    uint8_t pad[2];
-    struct ofp_match match;       /* Fields to match */
-    struct ofp_instruction instructions[0]; /* Instruction set */
-};
-OFP_ASSERT(sizeof(struct ofp_flow_mod) == 136);
-
-/* Group numbering. Groups can use any number up to OFPG_MAX. */
-enum ofp_group {
-    /* Last usable group number. */
-    OFPG_MAX        = 0xffffff00,
-
-    /* Fake groups. */
-    OFPG_ALL        = 0xfffffffc,  /* Represents all groups for group delete
-                                      commands. */
-    OFPG_ANY        = 0xffffffff   /* Wildcard group used only for flow stats
-                                      requests. Selects all flows regardless of
-                                      group (including flows with no group).
-                                      */
-};
-
-/* Bucket for use in groups. */
-struct ofp_bucket {
-    uint16_t len;                   /* Length the bucket in bytes, including
-                                       this header and any padding to make it
-                                       64-bit aligned. */
-    uint16_t weight;                /* Relative weight of bucket.  Only
-                                       defined for select groups. */
-    uint32_t watch_port;            /* Port whose state affects whether this
-                                       bucket is live.  Only required for fast
-                                       failover groups. */
-    uint32_t watch_group;           /* Group whose state affects whether this
-                                       bucket is live.  Only required for fast
-                                       failover groups. */
-    uint8_t pad[4];
-    struct ofp_action_header actions[0]; /* The action length is inferred
-                                           from the length field in the
-                                           header. */
-};
-OFP_ASSERT(sizeof(struct ofp_bucket) == 16);
-
-/* Group setup and teardown (controller -> datapath). */
-struct ofp_group_mod {
-    struct ofp_header header;
-    uint16_t command;             /* One of OFPGC_*. */
-    uint8_t type;                 /* One of OFPGT_*. */
-    uint8_t pad;                  /* Pad to 64 bits. */
-    uint32_t group_id;            /* Group identifier. */
-    struct ofp_bucket buckets[0]; /* The bucket length is inferred from the
-                                     length field in the header. */
-};
-OFP_ASSERT(sizeof(struct ofp_group_mod) == 16);
-
-/* Group types.  Values in the range [128, 255] are reserved for experimental
- * use. */
-enum ofp_group_type {
-    OFPGT_ALL,      /* All (multicast/broadcast) group.  */
-    OFPGT_SELECT,   /* Select group. */
-    OFPGT_INDIRECT, /* Indirect group. */
-    OFPGT_FF        /* Fast failover group. */
-};
-
-/* Why was this flow removed? */
-enum ofp_flow_removed_reason {
-    OFPRR_IDLE_TIMEOUT,         /* Flow idle time exceeded idle_timeout. */
-    OFPRR_HARD_TIMEOUT,         /* Time exceeded hard_timeout. */
-    OFPRR_DELETE,               /* Evicted by a DELETE flow mod. */
-    OFPRR_GROUP_DELETE          /* Group was removed. */
-};
-
-/* Flow removed (datapath -> controller). */
-struct ofp_flow_removed {
-    struct ofp_header header;
-    uint64_t cookie;          /* Opaque controller-issued identifier. */
-
-    uint16_t priority;        /* Priority level of flow entry. */
-    uint8_t reason;           /* One of OFPRR_*. */
-    uint8_t table_id;         /* ID of the table */
-
-    uint32_t duration_sec;    /* Time flow was alive in seconds. */
-    uint32_t duration_nsec;   /* Time flow was alive in nanoseconds beyond
-                                 duration_sec. */
-    uint16_t idle_timeout;    /* Idle timeout from original flow mod. */
-    uint8_t pad2[2];          /* Align to 64-bits. */
-    uint64_t packet_count;
-    uint64_t byte_count;
-    struct ofp_match match;   /* Description of fields. */
-};
-OFP_ASSERT(sizeof(struct ofp_flow_removed) == 136);
-
-/* Values for 'type' in ofp_error_message.  These values are immutable: they
- * will not change in future versions of the protocol (although new values may
- * be added). */
-enum ofp_error_type {
-    OFPET_HELLO_FAILED,         /* Hello protocol failed. */
-    OFPET_BAD_REQUEST,          /* Request was not understood. */
-    OFPET_BAD_ACTION,           /* Error in action description. */
-    OFPET_BAD_INSTRUCTION,      /* Error in instruction list. */
-    OFPET_BAD_MATCH,            /* Error in match. */
-    OFPET_FLOW_MOD_FAILED,      /* Problem modifying flow entry. */
-    OFPET_GROUP_MOD_FAILED,     /* Problem modifying group entry. */
-    OFPET_PORT_MOD_FAILED,      /* Port mod request failed. */
-    OFPET_TABLE_MOD_FAILED,     /* Table mod request failed. */
-    OFPET_QUEUE_OP_FAILED,      /* Queue operation failed. */
-    OFPET_SWITCH_CONFIG_FAILED, /* Switch config request failed. */
-};
-
-/* ofp_error_msg 'code' values for OFPET_HELLO_FAILED.  'data' contains an
- * ASCII text string that may give failure details. */
-enum ofp_hello_failed_code {
-    OFPHFC_INCOMPATIBLE,        /* No compatible version. */
-    OFPHFC_EPERM                /* Permissions error. */
-};
-
-/* ofp_error_msg 'code' values for OFPET_BAD_REQUEST.  'data' contains at least
- * the first 64 bytes of the failed request. */
-enum ofp_bad_request_code {
-    OFPBRC_BAD_VERSION,         /* ofp_header.version not supported. */
-    OFPBRC_BAD_TYPE,            /* ofp_header.type not supported. */
-    OFPBRC_BAD_STAT,            /* ofp_stats_request.type not supported. */
-    OFPBRC_BAD_EXPERIMENTER,    /* Experimenter id not supported
-                                 * (in ofp_experimenter_header
-                                 * or ofp_stats_request or ofp_stats_reply). */
-    OFPBRC_BAD_SUBTYPE,         /* Experimenter subtype not supported. */
-    OFPBRC_EPERM,               /* Permissions error. */
-    OFPBRC_BAD_LEN,             /* Wrong request length for type. */
-    OFPBRC_BUFFER_EMPTY,        /* Specified buffer has already been used. */
-    OFPBRC_BUFFER_UNKNOWN,      /* Specified buffer does not exist. */
-    OFPBRC_BAD_TABLE_ID         /* Specified table-id invalid or does not
-                                 * exist. */
-};
-
-/* ofp_error_msg 'code' values for OFPET_BAD_ACTION.  'data' contains at least
- * the first 64 bytes of the failed request. */
-enum ofp_bad_action_code {
-    OFPBAC_BAD_TYPE,           /* Unknown action type. */
-    OFPBAC_BAD_LEN,            /* Length problem in actions. */
-    OFPBAC_BAD_EXPERIMENTER,   /* Unknown experimenter id specified. */
-    OFPBAC_BAD_EXPERIMENTER_TYPE, /* Unknown action type for experimenter id. */
-    OFPBAC_BAD_OUT_PORT,       /* Problem validating output port. */
-    OFPBAC_BAD_ARGUMENT,       /* Bad action argument. */
-    OFPBAC_EPERM,              /* Permissions error. */
-    OFPBAC_TOO_MANY,           /* Can't handle this many actions. */
-    OFPBAC_BAD_QUEUE,          /* Problem validating output queue. */
-    OFPBAC_BAD_OUT_GROUP,      /* Invalid group id in forward action. */
-    OFPBAC_MATCH_INCONSISTENT, /* Action can't apply for this match. */
-    OFPBAC_UNSUPPORTED_ORDER,  /* Action order is unsupported for the action
-				  list in an Apply-Actions instruction */
-    OFPBAC_BAD_TAG,            /* Actions uses an unsupported
-                                  tag/encap. */
-};
-
-/* ofp_error_msg 'code' values for OFPET_BAD_INSTRUCTION.  'data' contains at least
- * the first 64 bytes of the failed request. */
-enum ofp_bad_instruction_code {
-    OFPBIC_UNKNOWN_INST,       /* Unknown instruction. */
-    OFPBIC_UNSUP_INST,         /* Switch or table does not support the
-                                  instruction. */
-    OFPBIC_BAD_TABLE_ID,       /* Invalid Table-ID specified. */
-    OFPBIC_UNSUP_METADATA,     /* Metadata value unsupported by datapath. */
-    OFPBIC_UNSUP_METADATA_MASK,/* Metadata mask value unsupported by
-                                  datapath. */
-    OFPBIC_UNSUP_EXP_INST,     /* Specific experimenter instruction
-                                  unsupported. */
-};
-
-/* ofp_error_msg 'code' values for OFPET_BAD_MATCH.  'data' contains at least
- * the first 64 bytes of the failed request. */
-enum ofp_bad_match_code {
-    OFPBMC_BAD_TYPE,            /* Unsupported match type specified by the
-                                   match */
-    OFPBMC_BAD_LEN,             /* Length problem in match. */
-    OFPBMC_BAD_TAG,             /* Match uses an unsupported tag/encap. */
-    OFPBMC_BAD_DL_ADDR_MASK,    /* Unsupported datalink addr mask - switch does
-                                   not support arbitrary datalink address
-                                   mask. */
-    OFPBMC_BAD_NW_ADDR_MASK,    /* Unsupported network addr mask - switch does
-                                   not support arbitrary network address
-                                   mask. */
-    OFPBMC_BAD_WILDCARDS,       /* Unsupported wildcard specified in the
-                                   match. */
-    OFPBMC_BAD_FIELD,		/* Unsupported field in the match. */
-    OFPBMC_BAD_VALUE,		/* Unsupported value in a match field. */
-};
-
-/* ofp_error_msg 'code' values for OFPET_FLOW_MOD_FAILED.  'data' contains
- * at least the first 64 bytes of the failed request. */
-enum ofp_flow_mod_failed_code {
-    OFPFMFC_UNKNOWN,            /* Unspecified error. */
-    OFPFMFC_TABLE_FULL,         /* Flow not added because table was full. */
-    OFPFMFC_BAD_TABLE_ID,       /* Table does not exist */
-    OFPFMFC_OVERLAP,            /* Attempted to add overlapping flow with
-                                   CHECK_OVERLAP flag set. */
-    OFPFMFC_EPERM,              /* Permissions error. */
-    OFPFMFC_BAD_TIMEOUT,        /* Flow not added because of unsupported
-                                   idle/hard timeout. */
-    OFPFMFC_BAD_COMMAND,        /* Unsupported or unknown command. */
-};
-
-/* ofp_error_msg 'code' values for OFPET_GROUP_MOD_FAILED.  'data' contains
- * at least the first 64 bytes of the failed request. */
-enum ofp_group_mod_failed_code {
-    OFPGMFC_GROUP_EXISTS,             /* Group not added because a group ADD
-                                       * attempted to replace an
-                                       * already-present group. */
-    OFPGMFC_INVALID_GROUP,            /* Group not added because Group specified
-                                       * is invalid. */
-    OFPGMFC_WEIGHT_UNSUPPORTED,       /* Switch does not support unequal load
-                                       * sharing with select groups. */
-    OFPGMFC_OUT_OF_GROUPS,            /* The group table is full. */
-    OFPGMFC_OUT_OF_BUCKETS,           /* The maximum number of action buckets
-                                       * for a group has been exceeded. */
-    OFPGMFC_CHAINING_UNSUPPORTED,     /* Switch does not support groups that
-                                       * forward to groups. */
-    OFPGMFC_WATCH_UNSUPPORTED,        /* This group cannot watch the
-                                         watch_port or watch_group specified. */
-    OFPGMFC_LOOP,                     /* Group entry would cause a loop. */
-    OFPGMFC_UNKNOWN_GROUP,            /* Group not modified because a group
-                                         MODIFY attempted to modify a
-                                         non-existent group. */
-};
-
-/* ofp_error_msg 'code' values for OFPET_PORT_MOD_FAILED.  'data' contains
- * at least the first 64 bytes of the failed request. */
-enum ofp_port_mod_failed_code {
-    OFPPMFC_BAD_PORT,            /* Specified port number does not exist. */
-    OFPPMFC_BAD_HW_ADDR,         /* Specified hardware address does not
-                                  * match the port number. */
-    OFPPMFC_BAD_CONFIG,          /* Specified config is invalid. */
-    OFPPMFC_BAD_ADVERTISE        /* Specified advertise is invalid. */
-};
-
-/* ofp_error_msg 'code' values for OFPET_TABLE_MOD_FAILED.  'data' contains
- * at least the first 64 bytes of the failed request. */
-enum ofp_table_mod_failed_code {
-    OFPTMFC_BAD_TABLE,           /* Specified table does not exist. */
-    OFPTMFC_BAD_CONFIG           /* Specified config is invalid. */
-};
-
-/* ofp_error msg 'code' values for OFPET_QUEUE_OP_FAILED. 'data' contains
- * at least the first 64 bytes of the failed request */
-enum ofp_queue_op_failed_code {
-    OFPQOFC_BAD_PORT,           /* Invalid port (or port does not exist). */
-    OFPQOFC_BAD_QUEUE,          /* Queue does not exist. */
-    OFPQOFC_EPERM               /* Permissions error. */
-};
-
-/* ofp_error_msg 'code' values for OFPET_SWITCH_CONFIG_FAILED. 'data' contains
- * at least the first 64 bytes of the failed request. */
-enum ofp_switch_config_failed_code {
-    OFPSCFC_BAD_FLAGS,           /* Specified flags is invalid. */
-    OFPSCFC_BAD_LEN              /* Specified len is invalid. */
-};
-
-/* OFPT_ERROR: Error message (datapath -> controller). */
-struct ofp_error_msg {
-    struct ofp_header header;
-
-    uint16_t type;
-    uint16_t code;
-    uint8_t data[0];          /* Variable-length data.  Interpreted based
-                                 on the type and code.  No padding. */
-};
-OFP_ASSERT(sizeof(struct ofp_error_msg) == 12);
-
-enum ofp_stats_types {
-    /* Description of this OpenFlow switch.
-     * The request body is empty.
-     * The reply body is struct ofp_desc_stats. */
-    OFPST_DESC,
-
-    /* Individual flow statistics.
-     * The request body is struct ofp_flow_stats_request.
-     * The reply body is an array of struct ofp_flow_stats. */
-    OFPST_FLOW,
-
-    /* Aggregate flow statistics.
-     * The request body is struct ofp_aggregate_stats_request.
-     * The reply body is struct ofp_aggregate_stats_reply. */
-    OFPST_AGGREGATE,
-
-    /* Flow table statistics.
-     * The request body is empty.
-     * The reply body is an array of struct ofp_table_stats. */
-    OFPST_TABLE,
-
-    /* Port statistics.
-     * The request body is struct ofp_port_stats_request.
-     * The reply body is an array of struct ofp_port_stats. */
-    OFPST_PORT,
-
-    /* Queue statistics for a port
-     * The request body defines the port
-     * The reply body is an array of struct ofp_queue_stats */
-    OFPST_QUEUE,
-
-    /* Group counter statistics.
-     * The request body is empty.
-     * The reply is struct ofp_group_stats. */
-    OFPST_GROUP,
-
-    /* Group description statistics.
-     * The request body is empty.
-     * The reply body is struct ofp_group_desc_stats. */
-    OFPST_GROUP_DESC,
-
-    /* Experimenter extension.
-     * The request and reply bodies begin with a 32-bit experimenter ID,
-     * which takes the same form as in "struct ofp_experimenter_header".
-     * The request and reply bodies are otherwise experimenter-defined. */
-    OFPST_EXPERIMENTER = 0xffff
-};
-
-struct ofp_stats_request {
-    struct ofp_header header;
-    uint16_t type;              /* One of the OFPST_* constants. */
-    uint16_t flags;             /* OFPSF_REQ_* flags (none yet defined). */
-    uint8_t pad[4];
-    uint8_t body[0];            /* Body of the request. */
-};
-OFP_ASSERT(sizeof(struct ofp_stats_request) == 16);
-
-enum ofp_stats_reply_flags {
-    OFPSF_REPLY_MORE  = 1 << 0  /* More replies to follow. */
-};
-
-struct ofp_stats_reply {
-    struct ofp_header header;
-    uint16_t type;              /* One of the OFPST_* constants. */
-    uint16_t flags;             /* OFPSF_REPLY_* flags. */
-    uint8_t pad[4];
-    uint8_t body[0];            /* Body of the reply. */
-};
-OFP_ASSERT(sizeof(struct ofp_stats_reply) == 16);
-
-#define DESC_STR_LEN   256
-#define SERIAL_NUM_LEN 32
-/* Body of reply to OFPST_DESC request.  Each entry is a NULL-terminated
- * ASCII string. */
-struct ofp_desc_stats {
-    char mfr_desc[DESC_STR_LEN];       /* Manufacturer description. */
-    char hw_desc[DESC_STR_LEN];        /* Hardware description. */
-    char sw_desc[DESC_STR_LEN];        /* Software description. */
-    char serial_num[SERIAL_NUM_LEN];   /* Serial number. */
-    char dp_desc[DESC_STR_LEN];        /* Human readable description of datapath. */
-};
-OFP_ASSERT(sizeof(struct ofp_desc_stats) == 1056);
-
-/* Body for ofp_stats_request of type OFPST_FLOW. */
-struct ofp_flow_stats_request {
-    uint8_t table_id;         /* ID of table to read (from ofp_table_stats),
-                                 0xff for all tables. */
-    uint8_t pad[3];           /* Align to 64 bits. */
-    uint32_t out_port;        /* Require matching entries to include this
-                                 as an output port.  A value of OFPP_ANY
-                                 indicates no restriction. */
-    uint32_t out_group;       /* Require matching entries to include this
-                                 as an output group.  A value of OFPG_ANY
-                                 indicates no restriction. */
-    uint8_t pad2[4];          /* Align to 64 bits. */
-    uint64_t cookie;          /* Require matching entries to contain this
-                                 cookie value */
-    uint64_t cookie_mask;     /* Mask used to restrict the cookie bits that
-                                 must match. A value of 0 indicates
-                                 no restriction. */
-    struct ofp_match match;   /* Fields to match. */
-};
-OFP_ASSERT(sizeof(struct ofp_flow_stats_request) == 120);
-
-/* Body of reply to OFPST_FLOW request. */
-struct ofp_flow_stats {
-    uint16_t length;          /* Length of this entry. */
-    uint8_t table_id;         /* ID of table flow came from. */
-    uint8_t pad;
-    uint32_t duration_sec;    /* Time flow has been alive in seconds. */
-    uint32_t duration_nsec;   /* Time flow has been alive in nanoseconds beyond
-                                 duration_sec. */
-    uint16_t priority;        /* Priority of the entry. Only meaningful
-                                 when this is not an exact-match entry. */
-    uint16_t idle_timeout;    /* Number of seconds idle before expiration. */
-    uint16_t hard_timeout;    /* Number of seconds before expiration. */
-    uint8_t pad2[6];          /* Align to 64-bits. */
-    uint64_t cookie;          /* Opaque controller-issued identifier. */
-    uint64_t packet_count;    /* Number of packets in flow. */
-    uint64_t byte_count;      /* Number of bytes in flow. */
-    struct ofp_match match;   /* Description of fields. */
-    struct ofp_instruction instructions[0]; /* Instruction set. */
-};
-OFP_ASSERT(sizeof(struct ofp_flow_stats) == 136);
-
-/* Body for ofp_stats_request of type OFPST_AGGREGATE. */
-struct ofp_aggregate_stats_request {
-    uint8_t table_id;         /* ID of table to read (from ofp_table_stats)
-                                 0xff for all tables. */
-    uint8_t pad[3];           /* Align to 64 bits. */
-    uint32_t out_port;        /* Require matching entries to include this
-                                 as an output port.  A value of OFPP_ANY
-                                 indicates no restriction. */
-    uint32_t out_group;       /* Require matching entries to include this
-                                 as an output group.  A value of OFPG_ANY
-                                 indicates no restriction. */
-    uint8_t pad2[4];          /* Align to 64 bits. */
-    uint64_t cookie;          /* Require matching entries to contain this
-                                 cookie value */
-    uint64_t cookie_mask;     /* Mask used to restrict the cookie bits that
-                                 must match. A value of 0 indicates
-                                 no restriction. */
-    struct ofp_match match;   /* Fields to match. */
-};
-OFP_ASSERT(sizeof(struct ofp_aggregate_stats_request) == 120);
-
-/* Body of reply to OFPST_AGGREGATE request. */
-struct ofp_aggregate_stats_reply {
-    uint64_t packet_count;    /* Number of packets in flows. */
-    uint64_t byte_count;      /* Number of bytes in flows. */
-    uint32_t flow_count;      /* Number of flows. */
-    uint8_t pad[4];           /* Align to 64 bits. */
-};
-OFP_ASSERT(sizeof(struct ofp_aggregate_stats_reply) == 24);
-
-/* Flow match fields. */
-enum ofp_flow_match_fields {
-    OFPFMF_IN_PORT     = 1 << 0,  /* Switch input port. */
-    OFPFMF_DL_VLAN     = 1 << 1,  /* VLAN id. */
-    OFPFMF_DL_VLAN_PCP = 1 << 2,  /* VLAN priority. */
-    OFPFMF_DL_TYPE     = 1 << 3,  /* Ethernet frame type. */
-    OFPFMF_NW_TOS      = 1 << 4,  /* IP ToS (DSCP field, 6 bits). */
-    OFPFMF_NW_PROTO    = 1 << 5,  /* IP protocol. */
-    OFPFMF_TP_SRC      = 1 << 6,  /* TCP/UDP/SCTP source port. */
-    OFPFMF_TP_DST      = 1 << 7,  /* TCP/UDP/SCTP destination port. */
-    OFPFMF_MPLS_LABEL  = 1 << 8,  /* MPLS label. */
-    OFPFMF_MPLS_TC     = 1 << 9,  /* MPLS TC. */
-    OFPFMF_TYPE        = 1 << 10, /* Match type. */
-    OFPFMF_DL_SRC      = 1 << 11, /* Ethernet source address. */
-    OFPFMF_DL_DST      = 1 << 12, /* Ethernet destination address. */
-    OFPFMF_NW_SRC      = 1 << 13, /* IP source address. */
-    OFPFMF_NW_DST      = 1 << 14, /* IP destination address. */
-    OFPFMF_METADATA    = 1 << 15, /* Metadata passed between tables. */
-};
-
-/* Body of reply to OFPST_TABLE request. */
-struct ofp_table_stats {
-    uint8_t table_id;        /* Identifier of table.  Lower numbered tables
-                                are consulted first. */
-    uint8_t pad[7];          /* Align to 64-bits. */
-    char name[OFP_MAX_TABLE_NAME_LEN];
-    uint32_t wildcards;      /* Bitmap of OFPFMF_* wildcards that are
-                                supported by the table. */
-    uint32_t match;          /* Bitmap of OFPFMF_* that indicate the fields
-                                the table can match on. */
-    uint32_t instructions;   /* Bitmap of OFPIT_* values supported. */
-    uint32_t write_actions;  /* Bitmap of OFPAT_* that are supported
-                                by the table with OFPIT_WRITE_ACTIONS. */
-    uint32_t apply_actions;  /* Bitmap of OFPAT_* that are supported
-                                by the table with OFPIT_APPLY_ACTIONS. */
-    uint32_t config;         /* Bitmap of OFPTC_* values */
-    uint32_t max_entries;    /* Max number of entries supported. */
-    uint32_t active_count;   /* Number of active entries. */
-    uint64_t lookup_count;   /* Number of packets looked up in table. */
-    uint64_t matched_count;  /* Number of packets that hit table. */
-};
-OFP_ASSERT(sizeof(struct ofp_table_stats) == 88);
-
-/* Body for ofp_stats_request of type OFPST_PORT. */
-struct ofp_port_stats_request {
-    uint32_t port_no;        /* OFPST_PORT message must request statistics
-                              * either for a single port (specified in
-                              * port_no) or for all ports (if port_no ==
-                              * OFPP_ANY). */
-    uint8_t pad[4];
-};
-OFP_ASSERT(sizeof(struct ofp_port_stats_request) == 8);
-
-/* Body of reply to OFPST_PORT request. If a counter is unsupported, set
- * the field to all ones. */
-struct ofp_port_stats {
-    uint32_t port_no;
-    uint8_t pad[4];          /* Align to 64-bits. */
-    uint64_t rx_packets;     /* Number of received packets. */
-    uint64_t tx_packets;     /* Number of transmitted packets. */
-    uint64_t rx_bytes;       /* Number of received bytes. */
-    uint64_t tx_bytes;       /* Number of transmitted bytes. */
-    uint64_t rx_dropped;     /* Number of packets dropped by RX. */
-    uint64_t tx_dropped;     /* Number of packets dropped by TX. */
-    uint64_t rx_errors;      /* Number of receive errors.  This is a super-set
-                                of more specific receive errors and should be
-                                greater than or equal to the sum of all
-                                rx_*_err values. */
-    uint64_t tx_errors;      /* Number of transmit errors.  This is a super-set
-                                of more specific transmit errors and should be
-                                greater than or equal to the sum of all
-                                tx_*_err values (none currently defined.) */
-    uint64_t rx_frame_err;   /* Number of frame alignment errors. */
-    uint64_t rx_over_err;    /* Number of packets with RX overrun. */
-    uint64_t rx_crc_err;     /* Number of CRC errors. */
-    uint64_t collisions;     /* Number of collisions. */
-};
-OFP_ASSERT(sizeof(struct ofp_port_stats) == 104);
-
-/* Body of OFPST_GROUP request. */
-struct ofp_group_stats_request {
-    uint32_t group_id;       /* All groups if OFPG_ALL. */
-    uint8_t pad[4];          /* Align to 64 bits. */
-};
-OFP_ASSERT(sizeof(struct ofp_group_stats_request) == 8);
-
-/* Used in group stats replies. */
-struct ofp_bucket_counter {
-    uint64_t packet_count;   /* Number of packets processed by bucket. */
-    uint64_t byte_count;     /* Number of bytes processed by bucket. */
-};
-OFP_ASSERT(sizeof(struct ofp_bucket_counter) == 16);
-
-/* Body of reply to OFPST_GROUP request. */
-struct ofp_group_stats {
-    uint16_t length;         /* Length of this entry. */
-    uint8_t pad[2];          /* Align to 64 bits. */
-    uint32_t group_id;       /* Group identifier. */
-    uint32_t ref_count;      /* Number of flows or groups that directly forward
-                                to this group. */
-    uint8_t pad2[4];         /* Align to 64 bits. */
-    uint64_t packet_count;   /* Number of packets processed by group. */
-    uint64_t byte_count;     /* Number of bytes processed by group. */
-    struct ofp_bucket_counter bucket_stats[0];
-};
-OFP_ASSERT(sizeof(struct ofp_group_stats) == 32);
-
-/* Body of reply to OFPST_GROUP_DESC request. */
-struct ofp_group_desc_stats {
-    uint16_t length;              /* Length of this entry. */
-    uint8_t type;                 /* One of OFPGT_*. */
-    uint8_t pad;                  /* Pad to 64 bits. */
-    uint32_t group_id;            /* Group identifier. */
-    struct ofp_bucket buckets[0];
-};
-OFP_ASSERT(sizeof(struct ofp_group_desc_stats) == 8);
-
-/* Experimenter extension. */
-struct ofp_experimenter_header {
-    struct ofp_header header;   /* Type OFPT_EXPERIMENTER. */
-    uint32_t experimenter;      /* Experimenter ID:
-                                 * - MSB 0: low-order bytes are IEEE OUI.
-                                 * - MSB != 0: defined by OpenFlow
-                                 *   consortium. */
-    uint8_t pad[4];
-    /* Experimenter-defined arbitrary additional data. */
-};
-OFP_ASSERT(sizeof(struct ofp_experimenter_header) == 16);
-
-/* All ones is used to indicate all queues in a port (for stats retrieval). */
-#define OFPQ_ALL      0xffffffff
-
-/* Min rate > 1000 means not configured. */
-#define OFPQ_MIN_RATE_UNCFG      0xffff
-
-enum ofp_queue_properties {
-    OFPQT_NONE = 0,       /* No property defined for queue (default). */
-    OFPQT_MIN_RATE,       /* Minimum datarate guaranteed. */
-                          /* Other types should be added here
-                           * (i.e. max rate, precedence, etc). */
-};
-
-/* Common description for a queue. */
-struct ofp_queue_prop_header {
-    uint16_t property;    /* One of OFPQT_. */
-    uint16_t len;         /* Length of property, including this header. */
-    uint8_t pad[4];       /* 64-bit alignemnt. */
-};
-OFP_ASSERT(sizeof(struct ofp_queue_prop_header) == 8);
-
-/* Min-Rate queue property description. */
-struct ofp_queue_prop_min_rate {
-    struct ofp_queue_prop_header prop_header; /* prop: OFPQT_MIN, len: 16. */
-    uint16_t rate;        /* In 1/10 of a percent; >1000 -> disabled. */
-    uint8_t pad[6];       /* 64-bit alignment */
-};
-OFP_ASSERT(sizeof(struct ofp_queue_prop_min_rate) == 16);
-
-/* Full description for a queue. */
-struct ofp_packet_queue {
-    uint32_t queue_id;     /* id for the specific queue. */
-    uint16_t len;          /* Length in bytes of this queue desc. */
-    uint8_t pad[2];        /* 64-bit alignment. */
-    struct ofp_queue_prop_header properties[0]; /* List of properties. */
-};
-OFP_ASSERT(sizeof(struct ofp_packet_queue) == 8);
-
-/* Query for port queue configuration. */
-struct ofp_queue_get_config_request {
-    struct ofp_header header;
-    uint32_t port;         /* Port to be queried. Should refer
-                              to a valid physical port (i.e. < OFPP_MAX) */
-    uint8_t pad[4];
-};
-OFP_ASSERT(sizeof(struct ofp_queue_get_config_request) == 16);
-
-/* Queue configuration for a given port. */
-struct ofp_queue_get_config_reply {
-    struct ofp_header header;
-    uint32_t port;
-    uint8_t pad[4];
-    struct ofp_packet_queue queues[0]; /* List of configured queues. */
-};
-OFP_ASSERT(sizeof(struct ofp_queue_get_config_reply) == 16);
-
-/* OFPAT_SET_QUEUE action struct: send packets to given queue on port. */
-struct ofp_action_set_queue {
-    uint16_t type;            /* OFPAT_SET_QUEUE. */
-    uint16_t len;             /* Len is 8. */
-    uint32_t queue_id;        /* Queue id for the packets. */
-};
-OFP_ASSERT(sizeof(struct ofp_action_set_queue) == 8);
-
-struct ofp_queue_stats_request {
-    uint32_t port_no;        /* All ports if OFPP_ANY. */
-    uint32_t queue_id;       /* All queues if OFPQ_ALL. */
-};
-OFP_ASSERT(sizeof(struct ofp_queue_stats_request) == 8);
-
-struct ofp_queue_stats {
-    uint32_t port_no;
-    uint32_t queue_id;       /* Queue i.d */
-    uint64_t tx_bytes;       /* Number of transmitted bytes. */
-    uint64_t tx_packets;     /* Number of transmitted packets. */
-    uint64_t tx_errors;      /* Number of packets dropped due to overrun. */
-};
-OFP_ASSERT(sizeof(struct ofp_queue_stats) == 32);
-
-#endif /* openflow/openflow.h */
diff --git a/canonical/openflow.h-1.2 b/canonical/openflow.h-1.2
deleted file mode 100644
index 3e26ea5..0000000
--- a/canonical/openflow.h-1.2
+++ /dev/null
@@ -1,1873 +0,0 @@
-/* Copyright (c) 2008 The Board of Trustees of The Leland Stanford
- * Junior University
- * Copyright (c) 2011 Open Networking Foundation
- *
- * We are making the OpenFlow specification and associated documentation
- * (Software) available for public use and benefit with the expectation
- * that others will use, modify and enhance the Software and contribute
- * those enhancements back to the community. However, since we would
- * like to make the Software available for broadest use, with as few
- * restrictions as possible permission is hereby granted, free of
- * charge, to any person obtaining a copy of this Software to deal in
- * the Software under the copyrights without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sublicense, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
- * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
- * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- *
- * The name and trademarks of copyright holder(s) may NOT be used in
- * advertising or publicity pertaining to the Software or any
- * derivatives without specific, written prior permission.
- */
-
-/* OpenFlow: protocol between controller and datapath. */
-
-#ifndef OPENFLOW_OPENFLOW_H
-#define OPENFLOW_OPENFLOW_H 1
-
-#ifdef __KERNEL__
-#include <linux/types.h>
-#else
-#include <stdint.h>
-#endif
-
-#ifdef SWIG
-#define OFP_ASSERT(EXPR)        /* SWIG can't handle OFP_ASSERT. */
-#elif !defined(__cplusplus)
-/* Build-time assertion for use in a declaration context. */
-#define OFP_ASSERT(EXPR)                                                \
-        extern int (*build_assert(void))[ sizeof(struct {               \
-                    unsigned int build_assert_failed : (EXPR) ? 1 : -1; })]
-#else /* __cplusplus */
-#define OFP_ASSERT(_EXPR) typedef int build_assert_failed[(_EXPR) ? 1 : -1]
-#endif /* __cplusplus */
-
-#ifndef SWIG
-#define OFP_PACKED __attribute__((packed))
-#else
-#define OFP_PACKED              /* SWIG doesn't understand __attribute. */
-#endif
-
-/* Version number:
- * Non-experimental versions released: 0x01 = 1.0 ; 0x02 = 1.1 ; 0x03 = 1.2
- * Experimental versions released: 0x81 -- 0x99
- */
-/* The most significant bit being set in the version field indicates an
- * experimental OpenFlow version.
- */
-#define OFP_VERSION   0x03
-
-#define OFP_MAX_TABLE_NAME_LEN 32
-#define OFP_MAX_PORT_NAME_LEN  16
-
-#define OFP_TCP_PORT  6633
-#define OFP_SSL_PORT  6633
-
-#define OFP_ETH_ALEN 6          /* Bytes in an Ethernet address. */
-
-/* Port numbering. Ports are numbered starting from 1. */
-enum ofp_port_no {
-    /* Maximum number of physical and logical switch ports. */
-    OFPP_MAX        = 0xffffff00,
-
-    /* Reserved OpenFlow Port (fake output "ports"). */
-    OFPP_IN_PORT    = 0xfffffff8,  /* Send the packet out the input port.  This
-                                      reserved port must be explicitly used
-                                      in order to send back out of the input
-                                      port. */
-    OFPP_TABLE      = 0xfffffff9,  /* Submit the packet to the first flow table
-                                      NB: This destination port can only be
-                                      used in packet-out messages. */
-    OFPP_NORMAL     = 0xfffffffa,  /* Process with normal L2/L3 switching. */
-    OFPP_FLOOD      = 0xfffffffb,  /* All physical ports in VLAN, except input
-                                      port and those blocked or link down. */
-    OFPP_ALL        = 0xfffffffc,  /* All physical ports except input port. */
-    OFPP_CONTROLLER = 0xfffffffd,  /* Send to controller. */
-    OFPP_LOCAL      = 0xfffffffe,  /* Local openflow "port". */
-    OFPP_ANY        = 0xffffffff   /* Wildcard port used only for flow mod
-                                      (delete) and flow stats requests. Selects
-                                      all flows regardless of output port
-                                      (including flows with no output port). */
-};
-
-enum ofp_type {
-    /* Immutable messages. */
-    OFPT_HELLO              = 0,  /* Symmetric message */
-    OFPT_ERROR              = 1,  /* Symmetric message */
-    OFPT_ECHO_REQUEST       = 2,  /* Symmetric message */
-    OFPT_ECHO_REPLY         = 3,  /* Symmetric message */
-    OFPT_EXPERIMENTER       = 4,  /* Symmetric message */
-
-    /* Switch configuration messages. */
-    OFPT_FEATURES_REQUEST   = 5,  /* Controller/switch message */
-    OFPT_FEATURES_REPLY     = 6,  /* Controller/switch message */
-    OFPT_GET_CONFIG_REQUEST = 7,  /* Controller/switch message */
-    OFPT_GET_CONFIG_REPLY   = 8,  /* Controller/switch message */
-    OFPT_SET_CONFIG         = 9,  /* Controller/switch message */
-
-    /* Asynchronous messages. */
-    OFPT_PACKET_IN          = 10, /* Async message */
-    OFPT_FLOW_REMOVED       = 11, /* Async message */
-    OFPT_PORT_STATUS        = 12, /* Async message */
-
-    /* Controller command messages. */
-    OFPT_PACKET_OUT         = 13, /* Controller/switch message */
-    OFPT_FLOW_MOD           = 14, /* Controller/switch message */
-    OFPT_GROUP_MOD          = 15, /* Controller/switch message */
-    OFPT_PORT_MOD           = 16, /* Controller/switch message */
-    OFPT_TABLE_MOD          = 17, /* Controller/switch message */
-
-    /* Statistics messages. */
-    OFPT_STATS_REQUEST      = 18, /* Controller/switch message */
-    OFPT_STATS_REPLY        = 19, /* Controller/switch message */
-
-    /* Barrier messages. */
-    OFPT_BARRIER_REQUEST    = 20, /* Controller/switch message */
-    OFPT_BARRIER_REPLY      = 21, /* Controller/switch message */
-
-    /* Queue Configuration messages. */
-    OFPT_QUEUE_GET_CONFIG_REQUEST = 22,  /* Controller/switch message */
-    OFPT_QUEUE_GET_CONFIG_REPLY   = 23,  /* Controller/switch message */
-
-    /* Controller role change request messages. */
-    OFPT_ROLE_REQUEST       = 24, /* Controller/switch message */
-    OFPT_ROLE_REPLY         = 25, /* Controller/switch message */
-};
-
-/* Header on all OpenFlow packets. */
-struct ofp_header {
-    uint8_t version;    /* OFP_VERSION. */
-    uint8_t type;       /* One of the OFPT_ constants. */
-    uint16_t length;    /* Length including this ofp_header. */
-    uint32_t xid;       /* Transaction id associated with this packet.
-                           Replies use the same id as was in the request
-                           to facilitate pairing. */
-};
-OFP_ASSERT(sizeof(struct ofp_header) == 8);
-
-/* OFPT_HELLO.  This message has an empty body, but implementations must
- * ignore any data included in the body, to allow for future extensions. */
-struct ofp_hello {
-    struct ofp_header header;
-};
-
-#define OFP_DEFAULT_MISS_SEND_LEN   128
-
-enum ofp_config_flags {
-    /* Handling of IP fragments. */
-    OFPC_FRAG_NORMAL   = 0,       /* No special handling for fragments. */
-    OFPC_FRAG_DROP     = 1 << 0,  /* Drop fragments. */
-    OFPC_FRAG_REASM    = 1 << 1,  /* Reassemble (only if OFPC_IP_REASM set). */
-    OFPC_FRAG_MASK     = 3,
-
-    /* TTL processing - applicable for IP and MPLS packets */
-    OFPC_INVALID_TTL_TO_CONTROLLER = 1 << 2, /* Send packets with invalid TTL
-                                                to the controller */
-};
-
-/* Switch configuration. */
-struct ofp_switch_config {
-    struct ofp_header header;
-    uint16_t flags;             /* OFPC_* flags. */
-    uint16_t miss_send_len;     /* Max bytes of new flow that datapath
-                                   should send to the controller. See
-                                   ofp_controller_max_len for valid values.
-                                   */
-};
-OFP_ASSERT(sizeof(struct ofp_switch_config) == 12);
-
-/* Flags to indicate behavior of the flow table for unmatched packets.
-   These flags are used in ofp_table_stats messages to describe the current
-   configuration and in ofp_table_mod messages to configure table behavior. */
-enum ofp_table_config {
-    OFPTC_TABLE_MISS_CONTROLLER = 0,      /* Send to controller. */
-    OFPTC_TABLE_MISS_CONTINUE   = 1 << 0, /* Continue to the next table in the
-                                             pipeline (OpenFlow 1.0
-                                             behavior). */
-    OFPTC_TABLE_MISS_DROP       = 1 << 1, /* Drop the packet. */
-    OFPTC_TABLE_MISS_MASK       = 3
-};
-
-/* Table numbering. Tables can use any number up to OFPT_MAX. */
-enum ofp_table {
-    /* Last usable table number. */
-    OFPTT_MAX        = 0xfe,
-
-    /* Fake tables. */
-    OFPTT_ALL        = 0xff   /* Wildcard table used for table config,
-                                 flow stats and flow deletes. */
-};
-
-
-/* Configure/Modify behavior of a flow table */
-struct ofp_table_mod {
-    struct ofp_header header;
-    uint8_t table_id;       /* ID of the table, OFPTT_ALL indicates all tables */
-    uint8_t pad[3];         /* Pad to 32 bits */
-    uint32_t config;        /* Bitmap of OFPTC_* flags */
-};
-OFP_ASSERT(sizeof(struct ofp_table_mod) == 16);
-
-/* Capabilities supported by the datapath. */
-enum ofp_capabilities {
-    OFPC_FLOW_STATS     = 1 << 0,  /* Flow statistics. */
-    OFPC_TABLE_STATS    = 1 << 1,  /* Table statistics. */
-    OFPC_PORT_STATS     = 1 << 2,  /* Port statistics. */
-    OFPC_GROUP_STATS    = 1 << 3,  /* Group statistics. */
-    OFPC_IP_REASM       = 1 << 5,  /* Can reassemble IP fragments. */
-    OFPC_QUEUE_STATS    = 1 << 6,  /* Queue statistics. */
-    OFPC_PORT_BLOCKED   = 1 << 8   /* Switch will block looping ports. */
-};
-
-/* Flags to indicate behavior of the physical port.  These flags are
- * used in ofp_port to describe the current configuration.  They are
- * used in the ofp_port_mod message to configure the port's behavior.
- */
-enum ofp_port_config {
-    OFPPC_PORT_DOWN    = 1 << 0,  /* Port is administratively down. */
-
-    OFPPC_NO_RECV      = 1 << 2,  /* Drop all packets received by port. */
-    OFPPC_NO_FWD       = 1 << 5,  /* Drop packets forwarded to port. */
-    OFPPC_NO_PACKET_IN = 1 << 6   /* Do not send packet-in msgs for port. */
-};
-
-/* Current state of the physical port.  These are not configurable from
- * the controller.
- */
-enum ofp_port_state {
-    OFPPS_LINK_DOWN    = 1 << 0,  /* No physical link present. */
-    OFPPS_BLOCKED      = 1 << 1,  /* Port is blocked */
-    OFPPS_LIVE         = 1 << 2,  /* Live for Fast Failover Group. */
-};
-
-/* Features of ports available in a datapath. */
-enum ofp_port_features {
-    OFPPF_10MB_HD    = 1 << 0,  /* 10 Mb half-duplex rate support. */
-    OFPPF_10MB_FD    = 1 << 1,  /* 10 Mb full-duplex rate support. */
-    OFPPF_100MB_HD   = 1 << 2,  /* 100 Mb half-duplex rate support. */
-    OFPPF_100MB_FD   = 1 << 3,  /* 100 Mb full-duplex rate support. */
-    OFPPF_1GB_HD     = 1 << 4,  /* 1 Gb half-duplex rate support. */
-    OFPPF_1GB_FD     = 1 << 5,  /* 1 Gb full-duplex rate support. */
-    OFPPF_10GB_FD    = 1 << 6,  /* 10 Gb full-duplex rate support. */
-    OFPPF_40GB_FD    = 1 << 7,  /* 40 Gb full-duplex rate support. */
-    OFPPF_100GB_FD   = 1 << 8,  /* 100 Gb full-duplex rate support. */
-    OFPPF_1TB_FD     = 1 << 9,  /* 1 Tb full-duplex rate support. */
-    OFPPF_OTHER      = 1 << 10, /* Other rate, not in the list. */
-
-    OFPPF_COPPER     = 1 << 11, /* Copper medium. */
-    OFPPF_FIBER      = 1 << 12, /* Fiber medium. */
-    OFPPF_AUTONEG    = 1 << 13, /* Auto-negotiation. */
-    OFPPF_PAUSE      = 1 << 14, /* Pause. */
-    OFPPF_PAUSE_ASYM = 1 << 15  /* Asymmetric pause. */
-};
-
-/* Description of a port */
-struct ofp_port {
-    uint32_t port_no;
-    uint8_t pad[4];
-    uint8_t hw_addr[OFP_ETH_ALEN];
-    uint8_t pad2[2];                  /* Align to 64 bits. */
-    char name[OFP_MAX_PORT_NAME_LEN]; /* Null-terminated */
-
-    uint32_t config;        /* Bitmap of OFPPC_* flags. */
-    uint32_t state;         /* Bitmap of OFPPS_* flags. */
-
-    /* Bitmaps of OFPPF_* that describe features.  All bits zeroed if
-     * unsupported or unavailable. */
-    uint32_t curr;          /* Current features. */
-    uint32_t advertised;    /* Features being advertised by the port. */
-    uint32_t supported;     /* Features supported by the port. */
-    uint32_t peer;          /* Features advertised by peer. */
-
-    uint32_t curr_speed;    /* Current port bitrate in kbps. */
-    uint32_t max_speed;     /* Max port bitrate in kbps */
-};
-OFP_ASSERT(sizeof(struct ofp_port) == 64);
-
-/* Switch features. */
-struct ofp_switch_features {
-    struct ofp_header header;
-    uint64_t datapath_id;   /* Datapath unique ID.  The lower 48-bits are for
-                               a MAC address, while the upper 16-bits are
-                               implementer-defined. */
-
-    uint32_t n_buffers;     /* Max packets buffered at once. */
-
-    uint8_t n_tables;       /* Number of tables supported by datapath. */
-    uint8_t pad[3];         /* Align to 64-bits. */
-
-    /* Features. */
-    uint32_t capabilities;  /* Bitmap of support "ofp_capabilities". */
-    uint32_t reserved;
-
-    /* Port info.*/
-    struct ofp_port ports[0];  /* Port definitions.  The number of ports
-                                  is inferred from the length field in
-                                  the header. */
-};
-OFP_ASSERT(sizeof(struct ofp_switch_features) == 32);
-
-/* What changed about the physical port */
-enum ofp_port_reason {
-    OFPPR_ADD     = 0,         /* The port was added. */
-    OFPPR_DELETE  = 1,         /* The port was removed. */
-    OFPPR_MODIFY  = 2,         /* Some attribute of the port has changed. */
-};
-
-/* A physical port has changed in the datapath */
-struct ofp_port_status {
-    struct ofp_header header;
-    uint8_t reason;          /* One of OFPPR_*. */
-    uint8_t pad[7];          /* Align to 64-bits. */
-    struct ofp_port desc;
-};
-OFP_ASSERT(sizeof(struct ofp_port_status) == 80);
-
-/* Modify behavior of the physical port */
-struct ofp_port_mod {
-    struct ofp_header header;
-    uint32_t port_no;
-    uint8_t pad[4];
-    uint8_t hw_addr[OFP_ETH_ALEN]; /* The hardware address is not
-                                      configurable.  This is used to
-                                      sanity-check the request, so it must
-                                      be the same as returned in an
-                                      ofp_port struct. */
-    uint8_t pad2[2];        /* Pad to 64 bits. */
-    uint32_t config;        /* Bitmap of OFPPC_* flags. */
-    uint32_t mask;          /* Bitmap of OFPPC_* flags to be changed. */
-
-    uint32_t advertise;     /* Bitmap of OFPPF_*.  Zero all bits to prevent
-                               any action taking place. */
-    uint8_t pad3[4];        /* Pad to 64 bits. */
-};
-OFP_ASSERT(sizeof(struct ofp_port_mod) == 40);
-
-/* ## -------------------------- ## */
-/* ## OpenFlow Extensible Match. ## */
-/* ## -------------------------- ## */
-
-/* The match type indicates the match structure (set of fields that compose the
- * match) in use. The match type is placed in the type field at the beginning
- * of all match structures. The "OpenFlow Extensible Match" type corresponds
- * to OXM TLV format described below and must be supported by all OpenFlow
- * switches. Extensions that define other match types may be published on the
- * ONF wiki. Support for extensions is optional.
- */
-enum ofp_match_type {
-    OFPMT_STANDARD = 0,       /* Deprecated. */
-    OFPMT_OXM      = 1,       /* OpenFlow Extensible Match */
-};
-
-/* Fields to match against flows */
-struct ofp_match {
-    uint16_t type;             /* One of OFPMT_* */
-    uint16_t length;           /* Length of ofp_match (excluding padding) */
-    /* Followed by:
-     *   - Exactly (length - 4) (possibly 0) bytes containing OXM TLVs, then
-     *   - Exactly ((length + 7)/8*8 - length) (between 0 and 7) bytes of
-     *     all-zero bytes
-     * In summary, ofp_match is padded as needed, to make its overall size
-     * a multiple of 8, to preserve alignement in structures using it.
-     */
-    uint8_t oxm_fields[4];     /* OXMs start here - Make compiler happy */
-};
-OFP_ASSERT(sizeof(struct ofp_match) == 8);
-
-/* Components of a OXM TLV header. */
-#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_CLASS(HEADER), OXM_FIELD(HEADER), OXM_LENGTH(HEADER))
-
-/* OXM Class IDs.
- * The high order bit differentiate reserved classes from member classes.
- * Classes 0x0000 to 0x7FFF are member classes, allocated by ONF.
- * Classes 0x8000 to 0xFFFE are reserved classes, reserved for standardisation.
- */
-enum ofp_oxm_class {
-    OFPXMC_NXM_0          = 0x0000,    /* Backward compatibility with NXM */
-    OFPXMC_NXM_1          = 0x0001,    /* Backward compatibility with NXM */
-    OFPXMC_OPENFLOW_BASIC = 0x8000,    /* Basic class for OpenFlow */
-    OFPXMC_EXPERIMENTER   = 0xFFFF,    /* Experimenter class */
-};
-
-/* OXM Flow match field types for OpenFlow basic class. */
-enum oxm_ofb_match_fields {
-    OFPXMT_OFB_IN_PORT        = 0,  /* Switch input port. */
-    OFPXMT_OFB_IN_PHY_PORT    = 1,  /* Switch physical input port. */
-    OFPXMT_OFB_METADATA       = 2,  /* Metadata passed between tables. */
-    OFPXMT_OFB_ETH_DST        = 3,  /* Ethernet destination address. */
-    OFPXMT_OFB_ETH_SRC        = 4,  /* Ethernet source address. */
-    OFPXMT_OFB_ETH_TYPE       = 5,  /* Ethernet frame type. */
-    OFPXMT_OFB_VLAN_VID       = 6,  /* VLAN id. */
-    OFPXMT_OFB_VLAN_PCP       = 7,  /* VLAN priority. */
-    OFPXMT_OFB_IP_DSCP        = 8,  /* IP DSCP (6 bits in ToS field). */
-    OFPXMT_OFB_IP_ECN         = 9,  /* IP ECN (2 bits in ToS field). */
-    OFPXMT_OFB_IP_PROTO       = 10, /* IP protocol. */
-    OFPXMT_OFB_IPV4_SRC       = 11, /* IPv4 source address. */
-    OFPXMT_OFB_IPV4_DST       = 12, /* IPv4 destination address. */
-    OFPXMT_OFB_TCP_SRC        = 13, /* TCP source port. */
-    OFPXMT_OFB_TCP_DST        = 14, /* TCP destination port. */
-    OFPXMT_OFB_UDP_SRC        = 15, /* UDP source port. */
-    OFPXMT_OFB_UDP_DST        = 16, /* UDP destination port. */
-    OFPXMT_OFB_SCTP_SRC       = 17, /* SCTP source port. */
-    OFPXMT_OFB_SCTP_DST       = 18, /* SCTP destination port. */
-    OFPXMT_OFB_ICMPV4_TYPE    = 19, /* ICMP type. */
-    OFPXMT_OFB_ICMPV4_CODE    = 20, /* ICMP code. */
-    OFPXMT_OFB_ARP_OP         = 21, /* ARP opcode. */
-    OFPXMT_OFB_ARP_SPA        = 22, /* ARP source IPv4 address. */
-    OFPXMT_OFB_ARP_TPA        = 23, /* ARP target IPv4 address. */
-    OFPXMT_OFB_ARP_SHA        = 24, /* ARP source hardware address. */
-    OFPXMT_OFB_ARP_THA        = 25, /* ARP target hardware address. */
-    OFPXMT_OFB_IPV6_SRC       = 26, /* IPv6 source address. */
-    OFPXMT_OFB_IPV6_DST       = 27, /* IPv6 destination address. */
-    OFPXMT_OFB_IPV6_FLABEL    = 28, /* IPv6 Flow Label */
-    OFPXMT_OFB_ICMPV6_TYPE    = 29, /* ICMPv6 type. */
-    OFPXMT_OFB_ICMPV6_CODE    = 30, /* ICMPv6 code. */
-    OFPXMT_OFB_IPV6_ND_TARGET = 31, /* Target address for ND. */
-    OFPXMT_OFB_IPV6_ND_SLL    = 32, /* Source link-layer for ND. */
-    OFPXMT_OFB_IPV6_ND_TLL    = 33, /* Target link-layer for ND. */
-    OFPXMT_OFB_MPLS_LABEL     = 34, /* MPLS label. */
-    OFPXMT_OFB_MPLS_TC        = 35, /* MPLS TC. */
-};
-
-#define OFPXMT_OFB_ALL    ((UINT64_C(1) << 36) - 1)
-
-/* OpenFlow port on which the packet was received.
- * May be a physical port, a logical port, or the reserved port OFPP_LOCAL
- *
- * Prereqs: None.
- *
- * Format: 32-bit integer in network byte order.
- *
- * Masking: Not maskable. */
-#define OXM_OF_IN_PORT    OXM_HEADER  (0x8000, OFPXMT_OFB_IN_PORT, 4)
-
-/* Physical port on which the packet was received.
- *
- * Consider a packet received on a tunnel interface defined over a link
- * aggregation group (LAG) with two physical port members.  If the tunnel
- * interface is the logical port bound to OpenFlow.  In this case,
- * OFPXMT_OF_IN_PORT is the tunnel's port number and OFPXMT_OF_IN_PHY_PORT is
- * the physical port number of the LAG on which the tunnel is configured.
- *
- * When a packet is received directly on a physical port and not processed by a
- * logical port, OFPXMT_OF_IN_PORT and OFPXMT_OF_IN_PHY_PORT have the same
- * value.
- *
- * This field is usually not available in a regular match and only available
- * in ofp_packet_in messages when it's different from OXM_OF_IN_PORT.
- *
- * Prereqs: OXM_OF_IN_PORT must be present.
- *
- * Format: 32-bit integer in network byte order.
- *
- * Masking: Not maskable. */
-#define OXM_OF_IN_PHY_PORT OXM_HEADER  (0x8000, OFPXMT_OFB_IN_PHY_PORT, 4)
-
-/* Table metadata.
- *
- * Prereqs: None.
- *
- * Format: 64-bit integer in network byte order.
- *
- * Masking: Arbitrary masks.
- */
-#define OXM_OF_METADATA   OXM_HEADER  (0x8000, OFPXMT_OFB_METADATA, 8)
-#define OXM_OF_METADATA_W OXM_HEADER_W(0x8000, OFPXMT_OFB_METADATA, 8)
-
-/* Source or destination address in Ethernet header.
- *
- * Prereqs: None.
- *
- * Format: 48-bit Ethernet MAC address.
- *
- * Masking: Arbitrary masks. */
-#define OXM_OF_ETH_DST    OXM_HEADER  (0x8000, OFPXMT_OFB_ETH_DST, 6)
-#define OXM_OF_ETH_DST_W  OXM_HEADER_W(0x8000, OFPXMT_OFB_ETH_DST, 6)
-#define OXM_OF_ETH_SRC    OXM_HEADER  (0x8000, OFPXMT_OFB_ETH_SRC, 6)
-#define OXM_OF_ETH_SRC_W  OXM_HEADER_W(0x8000, OFPXMT_OFB_ETH_SRC, 6)
-
-/* Packet's Ethernet type.
- *
- * Prereqs: None.
- *
- * Format: 16-bit integer in network byte order.
- *
- * Masking: Not maskable. */
-#define OXM_OF_ETH_TYPE   OXM_HEADER  (0x8000, OFPXMT_OFB_ETH_TYPE, 2)
-
-/* The VLAN id is 12-bits, so we can use the entire 16 bits to indicate
- * special conditions.
- */
-enum ofp_vlan_id {
-    OFPVID_PRESENT = 0x1000, /* Bit that indicate that a VLAN id is set */
-    OFPVID_NONE    = 0x0000, /* No VLAN id was set. */
-};
-/* Define for compatibility */
-#define OFP_VLAN_NONE      OFPVID_NONE
-
-/* 802.1Q VID.
- *
- * For a packet with an 802.1Q header, this is the VLAN-ID (VID) from the
- * outermost tag, with the CFI bit forced to 1. For a packet with no 802.1Q
- * header, this has value OFPVID_NONE.
- *
- * Prereqs: None.
- *
- * Format: 16-bit integer in network byte order with bit 13 indicating
- * presence of VLAN header and 3 most-significant bits forced to 0.
- * Only the lower 13 bits have meaning.
- *
- * Masking: Arbitrary masks.
- *
- * This field can be used in various ways:
- *
- *   - If it is not constrained at all, the nx_match matches packets without
- *     an 802.1Q header or with an 802.1Q header that has any VID value.
- *
- *   - Testing for an exact match with 0x0 matches only packets without
- *     an 802.1Q header.
- *
- *   - Testing for an exact match with a VID value with CFI=1 matches packets
- *     that have an 802.1Q header with a specified VID.
- *
- *   - Testing for an exact match with a nonzero VID value with CFI=0 does
- *     not make sense.  The switch may reject this combination.
- *
- *   - Testing with nxm_value=0, nxm_mask=0x0fff matches packets with no 802.1Q
- *     header or with an 802.1Q header with a VID of 0.
- *
- *   - 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  (0x8000, OFPXMT_OFB_VLAN_VID, 2)
-#define OXM_OF_VLAN_VID_W OXM_HEADER_W(0x8000, OFPXMT_OFB_VLAN_VID, 2)
-
-/* 802.1Q PCP.
- *
- * For a packet with an 802.1Q header, this is the VLAN-PCP from the
- * outermost tag.  For a packet with no 802.1Q header, this has value
- * 0.
- *
- * Prereqs: OXM_OF_VLAN_VID must be different from OFPVID_NONE.
- *
- * Format: 8-bit integer with 5 most-significant bits forced to 0.
- * Only the lower 3 bits have meaning.
- *
- * Masking: Not maskable.
- */
-#define OXM_OF_VLAN_PCP   OXM_HEADER  (0x8000, OFPXMT_OFB_VLAN_PCP, 1)
-
-/* The Diff Serv Code Point (DSCP) bits of the IP header.
- * Part of the IPv4 ToS field or the IPv6 Traffic Class field.
- *
- * Prereqs: OXM_OF_ETH_TYPE must be either 0x0800 or 0x86dd.
- *
- * Format: 8-bit integer with 2 most-significant bits forced to 0.
- * Only the lower 6 bits have meaning.
- *
- * Masking: Not maskable. */
-#define OXM_OF_IP_DSCP     OXM_HEADER  (0x8000, OFPXMT_OFB_IP_DSCP, 1)
-
-/* The ECN bits of the IP header.
- * Part of the IPv4 ToS field or the IPv6 Traffic Class field.
- *
- * Prereqs: OXM_OF_ETH_TYPE must be either 0x0800 or 0x86dd.
- *
- * Format: 8-bit integer with 6 most-significant bits forced to 0.
- * Only the lower 2 bits have meaning.
- *
- * Masking: Not maskable. */
-#define OXM_OF_IP_ECN     OXM_HEADER  (0x8000, OFPXMT_OFB_IP_ECN, 1)
-
-/* The "protocol" byte in the IP header.
- *
- * Prereqs: OXM_OF_ETH_TYPE must be either 0x0800 or 0x86dd.
- *
- * Format: 8-bit integer.
- *
- * Masking: Not maskable. */
-#define OXM_OF_IP_PROTO   OXM_HEADER  (0x8000, OFPXMT_OFB_IP_PROTO, 1)
-
-/* The source or destination address in the IP header.
- *
- * Prereqs: OXM_OF_ETH_TYPE must match 0x0800 exactly.
- *
- * Format: 32-bit integer in network byte order.
- *
- * Masking: Arbitrary masks.
- */
-#define OXM_OF_IPV4_SRC     OXM_HEADER  (0x8000, OFPXMT_OFB_IPV4_SRC, 4)
-#define OXM_OF_IPV4_SRC_W   OXM_HEADER_W(0x8000, OFPXMT_OFB_IPV4_SRC, 4)
-#define OXM_OF_IPV4_DST     OXM_HEADER  (0x8000, OFPXMT_OFB_IPV4_DST, 4)
-#define OXM_OF_IPV4_DST_W   OXM_HEADER_W(0x8000, OFPXMT_OFB_IPV4_DST, 4)
-
-/* The source or destination port in the TCP header.
- *
- * Prereqs:
- *   OXM_OF_ETH_TYPE must be either 0x0800 or 0x86dd.
- *   OXM_OF_IP_PROTO must match 6 exactly.
- *
- * Format: 16-bit integer in network byte order.
- *
- * Masking: Not maskable. */
-#define OXM_OF_TCP_SRC    OXM_HEADER  (0x8000, OFPXMT_OFB_TCP_SRC, 2)
-#define OXM_OF_TCP_DST    OXM_HEADER  (0x8000, OFPXMT_OFB_TCP_DST, 2)
-
-/* The source or destination port in the UDP header.
- *
- * Prereqs:
- *   OXM_OF_ETH_TYPE must match either 0x0800 or 0x86dd.
- *   OXM_OF_IP_PROTO must match 17 exactly.
- *
- * Format: 16-bit integer in network byte order.
- *
- * Masking: Not maskable. */
-#define OXM_OF_UDP_SRC    OXM_HEADER  (0x8000, OFPXMT_OFB_UDP_SRC, 2)
-#define OXM_OF_UDP_DST    OXM_HEADER  (0x8000, OFPXMT_OFB_UDP_DST, 2)
-
-/* The source or destination port in the SCTP header.
- *
- * Prereqs:
- *   OXM_OF_ETH_TYPE must match either 0x0800 or 0x86dd.
- *   OXM_OF_IP_PROTO must match 132 exactly.
- *
- * Format: 16-bit integer in network byte order.
- *
- * Masking: Not maskable. */
-#define OXM_OF_SCTP_SRC   OXM_HEADER  (0x8000, OFPXMT_OFB_SCTP_SRC, 2)
-#define OXM_OF_SCTP_DST   OXM_HEADER  (0x8000, OFPXMT_OFB_SCTP_DST, 2)
-
-/* The type or code in the ICMP header.
- *
- * Prereqs:
- *   OXM_OF_ETH_TYPE must match 0x0800 exactly.
- *   OXM_OF_IP_PROTO must match 1 exactly.
- *
- * Format: 8-bit integer.
- *
- * Masking: Not maskable. */
-#define OXM_OF_ICMPV4_TYPE  OXM_HEADER  (0x8000, OFPXMT_OFB_ICMPV4_TYPE, 1)
-#define OXM_OF_ICMPV4_CODE  OXM_HEADER  (0x8000, OFPXMT_OFB_ICMPV4_CODE, 1)
-
-/* ARP opcode.
- *
- * For an Ethernet+IP ARP packet, the opcode in the ARP header.  Always 0
- * otherwise.
- *
- * Prereqs: OXM_OF_ETH_TYPE must match 0x0806 exactly.
- *
- * Format: 16-bit integer in network byte order.
- *
- * Masking: Not maskable. */
-#define OXM_OF_ARP_OP     OXM_HEADER  (0x8000, OFPXMT_OFB_ARP_OP, 2)
-
-/* For an Ethernet+IP ARP packet, the source or target protocol address
- * in the ARP header.  Always 0 otherwise.
- *
- * Prereqs: OXM_OF_ETH_TYPE must match 0x0806 exactly.
- *
- * Format: 32-bit integer in network byte order.
- *
- * Masking: Arbitrary masks.
- */
-#define OXM_OF_ARP_SPA    OXM_HEADER  (0x8000, OFPXMT_OFB_ARP_SPA, 4)
-#define OXM_OF_ARP_SPA_W  OXM_HEADER_W(0x8000, OFPXMT_OFB_ARP_SPA, 4)
-#define OXM_OF_ARP_TPA    OXM_HEADER  (0x8000, OFPXMT_OFB_ARP_TPA, 4)
-#define OXM_OF_ARP_TPA_W  OXM_HEADER_W(0x8000, OFPXMT_OFB_ARP_TPA, 4)
-
-/* For an Ethernet+IP ARP packet, the source or target hardware address
- * in the ARP header.  Always 0 otherwise.
- *
- * Prereqs: OXM_OF_ETH_TYPE must match 0x0806 exactly.
- *
- * Format: 48-bit Ethernet MAC address.
- *
- * Masking: Not maskable. */
-#define OXM_OF_ARP_SHA    OXM_HEADER  (0x8000, OFPXMT_OFB_ARP_SHA, 6)
-#define OXM_OF_ARP_THA    OXM_HEADER  (0x8000, OFPXMT_OFB_ARP_THA, 6)
-
-/* The source or destination address in the IPv6 header.
- *
- * Prereqs: OXM_OF_ETH_TYPE must match 0x86dd exactly.
- *
- * Format: 128-bit IPv6 address.
- *
- * Masking: Arbitrary masks.
- */
-#define OXM_OF_IPV6_SRC    OXM_HEADER  (0x8000, OFPXMT_OFB_IPV6_SRC, 16)
-#define OXM_OF_IPV6_SRC_W  OXM_HEADER_W(0x8000, OFPXMT_OFB_IPV6_SRC, 16)
-#define OXM_OF_IPV6_DST    OXM_HEADER  (0x8000, OFPXMT_OFB_IPV6_DST, 16)
-#define OXM_OF_IPV6_DST_W  OXM_HEADER_W(0x8000, OFPXMT_OFB_IPV6_DST, 16)
-
-/* The IPv6 Flow Label
- *
- * Prereqs:
- *   OXM_OF_ETH_TYPE must match 0x86dd exactly
- *
- * Format: 32-bit integer with 12 most-significant bits forced to 0.
- * Only the lower 20 bits have meaning.
- *
- * Masking: Maskable. */
-#define OXM_OF_IPV6_FLABEL   OXM_HEADER  (0x8000, OFPXMT_OFB_IPV6_FLABEL, 4)
-
-/* The type or code in the ICMPv6 header.
- *
- * Prereqs:
- *   OXM_OF_ETH_TYPE must match 0x86dd exactly.
- *   OXM_OF_IP_PROTO must match 58 exactly.
- *
- * Format: 8-bit integer.
- *
- * Masking: Not maskable. */
-#define OXM_OF_ICMPV6_TYPE OXM_HEADER  (0x8000, OFPXMT_OFB_ICMPV6_TYPE, 1)
-#define OXM_OF_ICMPV6_CODE OXM_HEADER  (0x8000, OFPXMT_OFB_ICMPV6_CODE, 1)
-
-/* The target address in an IPv6 Neighbor Discovery message.
- *
- * Prereqs:
- *   OXM_OF_ETH_TYPE must match 0x86dd exactly.
- *   OXM_OF_IP_PROTO must match 58 exactly.
- *   OXM_OF_ICMPV6_TYPE must be either 135 or 136.
- *
- * Format: 128-bit IPv6 address.
- *
- * Masking: Not maskable. */
-#define OXM_OF_IPV6_ND_TARGET OXM_HEADER (0x8000, OFPXMT_OFB_IPV6_ND_TARGET, 16)
-
-/* The source link-layer address option in an IPv6 Neighbor Discovery
- * message.
- *
- * Prereqs:
- *   OXM_OF_ETH_TYPE must match 0x86dd exactly.
- *   OXM_OF_IP_PROTO must match 58 exactly.
- *   OXM_OF_ICMPV6_TYPE must be exactly 135.
- *
- * Format: 48-bit Ethernet MAC address.
- *
- * Masking: Not maskable. */
-#define OXM_OF_IPV6_ND_SLL  OXM_HEADER  (0x8000, OFPXMT_OFB_IPV6_ND_SLL, 6)
-
-/* The target link-layer address option in an IPv6 Neighbor Discovery
- * message.
- *
- * Prereqs:
- *   OXM_OF_ETH_TYPE must match 0x86dd exactly.
- *   OXM_OF_IP_PROTO must match 58 exactly.
- *   OXM_OF_ICMPV6_TYPE must be exactly 136.
- *
- * Format: 48-bit Ethernet MAC address.
- *
- * Masking: Not maskable. */
-#define OXM_OF_IPV6_ND_TLL  OXM_HEADER  (0x8000, OFPXMT_OFB_IPV6_ND_TLL, 6)
-
-/* The LABEL in the first MPLS shim header.
- *
- * Prereqs:
- *   OXM_OF_ETH_TYPE must match 0x8847 or 0x8848 exactly.
- *
- * Format: 32-bit integer in network byte order with 12 most-significant
- * bits forced to 0. Only the lower 20 bits have meaning.
- *
- * Masking: Not maskable. */
-#define OXM_OF_MPLS_LABEL  OXM_HEADER  (0x8000, OFPXMT_OFB_MPLS_LABEL, 4)
-
-/* The TC in the first MPLS shim header.
- *
- * Prereqs:
- *   OXM_OF_ETH_TYPE must match 0x8847 or 0x8848 exactly.
- *
- * Format: 8-bit integer with 5 most-significant bits forced to 0.
- * Only the lower 3 bits have meaning.
- *
- * Masking: Not maskable. */
-#define OXM_OF_MPLS_TC     OXM_HEADER  (0x8000, OFPXMT_OFB_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_oxm_experimenter_header) == 8);
-
-/* ## ----------------- ## */
-/* ## OpenFlow Actions. ## */
-/* ## ----------------- ## */
-
-enum ofp_action_type {
-    OFPAT_OUTPUT       = 0,  /* Output to switch port. */
-    OFPAT_COPY_TTL_OUT = 11, /* Copy TTL "outwards" -- from next-to-outermost
-                                to outermost */
-    OFPAT_COPY_TTL_IN  = 12, /* Copy TTL "inwards" -- from outermost to
-                               next-to-outermost */
-    OFPAT_SET_MPLS_TTL = 15, /* MPLS TTL */
-    OFPAT_DEC_MPLS_TTL = 16, /* Decrement MPLS TTL */
-
-    OFPAT_PUSH_VLAN    = 17, /* Push a new VLAN tag */
-    OFPAT_POP_VLAN     = 18, /* Pop the outer VLAN tag */
-    OFPAT_PUSH_MPLS    = 19, /* Push a new MPLS tag */
-    OFPAT_POP_MPLS     = 20, /* Pop the outer MPLS tag */
-    OFPAT_SET_QUEUE    = 21, /* Set queue id when outputting to a port */
-    OFPAT_GROUP        = 22, /* Apply group. */
-    OFPAT_SET_NW_TTL   = 23, /* IP TTL. */
-    OFPAT_DEC_NW_TTL   = 24, /* Decrement IP TTL. */
-    OFPAT_SET_FIELD    = 25, /* Set a header field using OXM TLV format. */
-    OFPAT_EXPERIMENTER = 0xffff
-};
-
-enum ofp_controller_max_len {
-	OFPCML_MAX       = 0xffe5, /* maximum max_len value which can be used
-	                              to request a specific byte length. */
-	OFPCML_NO_BUFFER = 0xffff  /* indicates that no buffering should be
-	                              applied and the whole packet is to be
-	                              sent to the controller. */
-};
-
-/* Action structure for OFPAT_OUTPUT, which sends packets out 'port'.
- * When the 'port' is the OFPP_CONTROLLER, 'max_len' indicates the max
- * number of bytes to send.  A 'max_len' of zero means no bytes of the
- * packet should be sent. A 'max_len' of OFPCML_NO_BUFFER means that
- * the packet is not buffered and the complete packet is to be sent to
- * the controller. */
-struct ofp_action_output {
-    uint16_t type;                  /* OFPAT_OUTPUT. */
-    uint16_t len;                   /* Length is 16. */
-    uint32_t port;                  /* Output port. */
-    uint16_t max_len;               /* Max length to send to controller. */
-    uint8_t pad[6];                 /* Pad to 64 bits. */
-};
-OFP_ASSERT(sizeof(struct ofp_action_output) == 16);
-
-/* Action structure for OFPAT_SET_MPLS_TTL. */
-struct ofp_action_mpls_ttl {
-    uint16_t type;                  /* OFPAT_SET_MPLS_TTL. */
-    uint16_t len;                   /* Length is 8. */
-    uint8_t mpls_ttl;               /* MPLS TTL */
-    uint8_t pad[3];
-};
-OFP_ASSERT(sizeof(struct ofp_action_mpls_ttl) == 8);
-
-/* Action structure for OFPAT_PUSH_VLAN/MPLS. */
-struct ofp_action_push {
-    uint16_t type;                  /* OFPAT_PUSH_VLAN/MPLS. */
-    uint16_t len;                   /* Length is 8. */
-    uint16_t ethertype;             /* Ethertype */
-    uint8_t pad[2];
-};
-OFP_ASSERT(sizeof(struct ofp_action_push) == 8);
-
-/* Action structure for OFPAT_POP_MPLS. */
-struct ofp_action_pop_mpls {
-    uint16_t type;                  /* OFPAT_POP_MPLS. */
-    uint16_t len;                   /* Length is 8. */
-    uint16_t ethertype;             /* Ethertype */
-    uint8_t pad[2];
-};
-OFP_ASSERT(sizeof(struct ofp_action_pop_mpls) == 8);
-
-/* Action structure for OFPAT_GROUP. */
-struct ofp_action_group {
-    uint16_t type;                  /* OFPAT_GROUP. */
-    uint16_t len;                   /* Length is 8. */
-    uint32_t group_id;              /* Group identifier. */
-};
-OFP_ASSERT(sizeof(struct ofp_action_group) == 8);
-
-/* Action structure for OFPAT_SET_NW_TTL. */
-struct ofp_action_nw_ttl {
-    uint16_t type;                  /* OFPAT_SET_NW_TTL. */
-    uint16_t len;                   /* Length is 8. */
-    uint8_t nw_ttl;                 /* IP TTL */
-    uint8_t pad[3];
-};
-OFP_ASSERT(sizeof(struct ofp_action_nw_ttl) == 8);
-
-/* Action structure for OFPAT_SET_FIELD. */
-struct ofp_action_set_field {
-    uint16_t type;                  /* OFPAT_SET_FIELD. */
-    uint16_t len;                   /* Length is padded to 64 bits. */
-    /* Followed by:
-     *   - Exactly oxm_len bytes containing a single OXM TLV, then
-     *   - Exactly ((oxm_len + 4) + 7)/8*8 - (oxm_len + 4) (between 0 and 7)
-     *     bytes of all-zero bytes
-     */
-    uint8_t field[4];               /* OXM TLV - Make compiler happy */
-};
-OFP_ASSERT(sizeof(struct ofp_action_set_field) == 8);
-
-/* Action header for OFPAT_EXPERIMENTER.
- * The rest of the body is experimenter-defined. */
-struct ofp_action_experimenter_header {
-    uint16_t type;                  /* OFPAT_EXPERIMENTER. */
-    uint16_t len;                   /* Length is a multiple of 8. */
-    uint32_t experimenter;          /* Experimenter ID which takes the same
-                                       form as in struct
-                                       ofp_experimenter_header. */
-};
-OFP_ASSERT(sizeof(struct ofp_action_experimenter_header) == 8);
-
-/* Action header that is common to all actions.  The length includes the
- * header and any padding used to make the action 64-bit aligned.
- * NB: The length of an action *must* always be a multiple of eight. */
-struct ofp_action_header {
-    uint16_t type;                  /* One of OFPAT_*. */
-    uint16_t len;                   /* Length of action, including this
-                                       header.  This is the length of action,
-                                       including any padding to make it
-                                       64-bit aligned. */
-    uint8_t pad[4];
-};
-OFP_ASSERT(sizeof(struct ofp_action_header) == 8);
-
-/* ## ---------------------- ## */
-/* ## OpenFlow Instructions. ## */
-/* ## ---------------------- ## */
-
-enum ofp_instruction_type {
-    OFPIT_GOTO_TABLE = 1,       /* Setup the next table in the lookup
-                                   pipeline */
-    OFPIT_WRITE_METADATA = 2,   /* Setup the metadata field for use later in
-                                   pipeline */
-    OFPIT_WRITE_ACTIONS = 3,    /* Write the action(s) onto the datapath action
-                                   set */
-    OFPIT_APPLY_ACTIONS = 4,    /* Applies the action(s) immediately */
-    OFPIT_CLEAR_ACTIONS = 5,    /* Clears all actions from the datapath
-                                   action set */
-
-    OFPIT_EXPERIMENTER = 0xFFFF  /* Experimenter instruction */
-};
-
-/* Generic ofp_instruction structure */
-struct ofp_instruction {
-    uint16_t type;                /* Instruction type */
-    uint16_t len;                 /* Length of this struct in bytes. */
-    uint8_t pad[4];               /* Align to 64-bits */
-};
-OFP_ASSERT(sizeof(struct ofp_instruction) == 8);
-
-/* Instruction structure for OFPIT_GOTO_TABLE */
-struct ofp_instruction_goto_table {
-    uint16_t type;                /* OFPIT_GOTO_TABLE */
-    uint16_t len;                 /* Length of this struct in bytes. */
-    uint8_t table_id;             /* Set next table in the lookup pipeline */
-    uint8_t pad[3];               /* Pad to 64 bits. */
-};
-OFP_ASSERT(sizeof(struct ofp_instruction_goto_table) == 8);
-
-/* Instruction structure for OFPIT_WRITE_METADATA */
-struct ofp_instruction_write_metadata {
-    uint16_t type;                /* OFPIT_WRITE_METADATA */
-    uint16_t len;                 /* Length of this struct in bytes. */
-    uint8_t pad[4];               /* Align to 64-bits */
-    uint64_t metadata;            /* Metadata value to write */
-    uint64_t metadata_mask;       /* Metadata write bitmask */
-};
-OFP_ASSERT(sizeof(struct ofp_instruction_write_metadata) == 24);
-
-/* Instruction structure for OFPIT_WRITE/APPLY/CLEAR_ACTIONS */
-struct ofp_instruction_actions {
-    uint16_t type;              /* One of OFPIT_*_ACTIONS */
-    uint16_t len;               /* Length of this struct in bytes. */
-    uint8_t pad[4];             /* Align to 64-bits */
-    struct ofp_action_header actions[0];  /* Actions associated with
-                                             OFPIT_WRITE_ACTIONS and
-                                             OFPIT_APPLY_ACTIONS */
-};
-OFP_ASSERT(sizeof(struct ofp_instruction_actions) == 8);
-
-/* Instruction structure for experimental instructions */
-struct ofp_instruction_experimenter {
-    uint16_t type;		/* OFPIT_EXPERIMENTER */
-    uint16_t len;               /* Length of this struct in bytes */
-    uint32_t experimenter;      /* Experimenter ID which takes the same form
-                                   as in struct ofp_experimenter_header. */
-    /* Experimenter-defined arbitrary additional data. */
-};
-OFP_ASSERT(sizeof(struct ofp_instruction_experimenter) == 8);
-
-/* ## --------------------------- ## */
-/* ## OpenFlow Flow Modification. ## */
-/* ## --------------------------- ## */
-
-enum ofp_flow_mod_command {
-    OFPFC_ADD           = 0, /* New flow. */
-    OFPFC_MODIFY        = 1, /* Modify all matching flows. */
-    OFPFC_MODIFY_STRICT = 2, /* Modify entry strictly matching wildcards and
-                                priority. */
-    OFPFC_DELETE        = 3, /* Delete all matching flows. */
-    OFPFC_DELETE_STRICT = 4, /* Delete entry strictly matching wildcards and
-                                priority. */
-};
-
-/* Value used in "idle_timeout" and "hard_timeout" to indicate that the entry
- * is permanent. */
-#define OFP_FLOW_PERMANENT 0
-
-/* By default, choose a priority in the middle. */
-#define OFP_DEFAULT_PRIORITY 0x8000
-
-enum ofp_flow_mod_flags {
-    OFPFF_SEND_FLOW_REM = 1 << 0,  /* Send flow removed message when flow
-                                    * expires or is deleted. */
-    OFPFF_CHECK_OVERLAP = 1 << 1,  /* Check for overlapping entries first. */
-    OFPFF_RESET_COUNTS  = 1 << 2   /* Reset flow packet and byte counts. */
-};
-
-/* Flow setup and teardown (controller -> datapath). */
-struct ofp_flow_mod {
-    struct ofp_header header;
-    uint64_t cookie;             /* Opaque controller-issued identifier. */
-    uint64_t cookie_mask;        /* Mask used to restrict the cookie bits
-                                    that must match when the command is
-                                    OFPFC_MODIFY* or OFPFC_DELETE*. A value
-                                    of 0 indicates no restriction. */
-
-    /* Flow actions. */
-    uint8_t table_id;             /* ID of the table to put the flow in.
-                                     For OFPFC_DELETE_* commands, OFPTT_ALL
-                                     can also be used to delete matching
-                                     flows from all tables. */
-    uint8_t command;              /* One of OFPFC_*. */
-    uint16_t idle_timeout;        /* Idle time before discarding (seconds). */
-    uint16_t hard_timeout;        /* Max time before discarding (seconds). */
-    uint16_t priority;            /* Priority level of flow entry. */
-    uint32_t buffer_id;           /* Buffered packet to apply to, or
-                                     OFP_NO_BUFFER.
-                                     Not meaningful for OFPFC_DELETE*. */
-    uint32_t out_port;            /* For OFPFC_DELETE* commands, require
-                                     matching entries to include this as an
-                                     output port.  A value of OFPP_ANY
-                                     indicates no restriction. */
-    uint32_t out_group;           /* For OFPFC_DELETE* commands, require
-                                     matching entries to include this as an
-                                     output group.  A value of OFPG_ANY
-                                     indicates no restriction. */
-    uint16_t flags;               /* One of OFPFF_*. */
-    uint8_t pad[2];
-    struct ofp_match match;       /* Fields to match. Variable size. */
-    //struct ofp_instruction instructions[0]; /* Instruction set */
-};
-OFP_ASSERT(sizeof(struct ofp_flow_mod) == 56);
-
-/* Group numbering. Groups can use any number up to OFPG_MAX. */
-enum ofp_group {
-    /* Last usable group number. */
-    OFPG_MAX        = 0xffffff00,
-
-    /* Fake groups. */
-    OFPG_ALL        = 0xfffffffc,  /* Represents all groups for group delete
-                                      commands. */
-    OFPG_ANY        = 0xffffffff   /* Wildcard group used only for flow stats
-                                      requests. Selects all flows regardless of
-                                      group (including flows with no group).
-                                      */
-};
-
-/* Group commands */
-enum ofp_group_mod_command {
-    OFPGC_ADD    = 0,       /* New group. */
-    OFPGC_MODIFY = 1,       /* Modify all matching groups. */
-    OFPGC_DELETE = 2,       /* Delete all matching groups. */
-};
-
-/* Bucket for use in groups. */
-struct ofp_bucket {
-    uint16_t len;                   /* Length the bucket in bytes, including
-                                       this header and any padding to make it
-                                       64-bit aligned. */
-    uint16_t weight;                /* Relative weight of bucket.  Only
-                                       defined for select groups. */
-    uint32_t watch_port;            /* Port whose state affects whether this
-                                       bucket is live.  Only required for fast
-                                       failover groups. */
-    uint32_t watch_group;           /* Group whose state affects whether this
-                                       bucket is live.  Only required for fast
-                                       failover groups. */
-    uint8_t pad[4];
-    struct ofp_action_header actions[0]; /* The action length is inferred
-                                           from the length field in the
-                                           header. */
-};
-OFP_ASSERT(sizeof(struct ofp_bucket) == 16);
-
-/* Group setup and teardown (controller -> datapath). */
-struct ofp_group_mod {
-    struct ofp_header header;
-    uint16_t command;             /* One of OFPGC_*. */
-    uint8_t type;                 /* One of OFPGT_*. */
-    uint8_t pad;                  /* Pad to 64 bits. */
-    uint32_t group_id;            /* Group identifier. */
-    struct ofp_bucket buckets[0]; /* The length of the bucket array is inferred
-                                     from the length field in the header. */
-};
-OFP_ASSERT(sizeof(struct ofp_group_mod) == 16);
-
-/* Group types.  Values in the range [128, 255] are reserved for experimental
- * use. */
-enum ofp_group_type {
-    OFPGT_ALL      = 0, /* All (multicast/broadcast) group.  */
-    OFPGT_SELECT   = 1, /* Select group. */
-    OFPGT_INDIRECT = 2, /* Indirect group. */
-    OFPGT_FF       = 3, /* Fast failover group. */
-};
-
-/* Special buffer-id to indicate 'no buffer' */
-#define OFP_NO_BUFFER 0xffffffff
-
-/* Send packet (controller -> datapath). */
-struct ofp_packet_out {
-    struct ofp_header header;
-    uint32_t buffer_id;           /* ID assigned by datapath (OFP_NO_BUFFER
-                                     if none). */
-    uint32_t in_port;             /* Packet's input port or OFPP_CONTROLLER. */
-    uint16_t actions_len;         /* Size of action array in bytes. */
-    uint8_t pad[6];
-    struct ofp_action_header actions[0]; /* Action list. */
-    /* uint8_t data[0]; */        /* Packet data.  The length is inferred
-                                     from the length field in the header.
-                                     (Only meaningful if buffer_id == -1.) */
-};
-OFP_ASSERT(sizeof(struct ofp_packet_out) == 24);
-
-/* Why is this packet being sent to the controller? */
-enum ofp_packet_in_reason {
-    OFPR_NO_MATCH    = 0,   /* No matching flow. */
-    OFPR_ACTION      = 1,   /* Action explicitly output to controller. */
-    OFPR_INVALID_TTL = 2,   /* Packet has invalid TTL */
-};
-
-/* Packet received on port (datapath -> controller). */
-struct ofp_packet_in {
-    struct ofp_header header;
-    uint32_t buffer_id;     /* ID assigned by datapath. */
-    uint16_t total_len;     /* Full length of frame. */
-    uint8_t reason;         /* Reason packet is being sent (one of OFPR_*) */
-    uint8_t table_id;       /* ID of the table that was looked up */
-    struct ofp_match match; /* Packet metadata. Variable size. */
-    /* Followed by:
-     *   - Exactly 2 all-zero padding bytes, then
-     *   - An Ethernet frame whose length is inferred from header.length.
-     * The padding bytes preceding the Ethernet frame ensure that the IP
-     * header (if any) following the Ethernet header is 32-bit aligned.
-     */
-    //uint8_t pad[2];       /* Align to 64 bit + 16 bit */
-    //uint8_t data[0];      /* Ethernet frame */
-};
-OFP_ASSERT(sizeof(struct ofp_packet_in) == 24);
-
-/* Why was this flow removed? */
-enum ofp_flow_removed_reason {
-    OFPRR_IDLE_TIMEOUT = 0,     /* Flow idle time exceeded idle_timeout. */
-    OFPRR_HARD_TIMEOUT = 1,     /* Time exceeded hard_timeout. */
-    OFPRR_DELETE       = 2,     /* Evicted by a DELETE flow mod. */
-    OFPRR_GROUP_DELETE = 3,     /* Group was removed. */
-};
-
-/* Flow removed (datapath -> controller). */
-struct ofp_flow_removed {
-    struct ofp_header header;
-    uint64_t cookie;          /* Opaque controller-issued identifier. */
-
-    uint16_t priority;        /* Priority level of flow entry. */
-    uint8_t reason;           /* One of OFPRR_*. */
-    uint8_t table_id;         /* ID of the table */
-
-    uint32_t duration_sec;    /* Time flow was alive in seconds. */
-    uint32_t duration_nsec;   /* Time flow was alive in nanoseconds beyond
-                                 duration_sec. */
-    uint16_t idle_timeout;    /* Idle timeout from original flow mod. */
-    uint16_t hard_timeout;    /* Hard timeout from original flow mod. */
-    uint64_t packet_count;
-    uint64_t byte_count;
-    struct ofp_match match;   /* Description of fields. Variable size. */
-};
-OFP_ASSERT(sizeof(struct ofp_flow_removed) == 56);
-
-/* Values for 'type' in ofp_error_message.  These values are immutable: they
- * will not change in future versions of the protocol (although new values may
- * be added). */
-enum ofp_error_type {
-    OFPET_HELLO_FAILED         = 0,  /* Hello protocol failed. */
-    OFPET_BAD_REQUEST          = 1,  /* Request was not understood. */
-    OFPET_BAD_ACTION           = 2,  /* Error in action description. */
-    OFPET_BAD_INSTRUCTION      = 3,  /* Error in instruction list. */
-    OFPET_BAD_MATCH            = 4,  /* Error in match. */
-    OFPET_FLOW_MOD_FAILED      = 5,  /* Problem modifying flow entry. */
-    OFPET_GROUP_MOD_FAILED     = 6,  /* Problem modifying group entry. */
-    OFPET_PORT_MOD_FAILED      = 7,  /* Port mod request failed. */
-    OFPET_TABLE_MOD_FAILED     = 8,  /* Table mod request failed. */
-    OFPET_QUEUE_OP_FAILED      = 9,  /* Queue operation failed. */
-    OFPET_SWITCH_CONFIG_FAILED = 10, /* Switch config request failed. */
-    OFPET_ROLE_REQUEST_FAILED  = 11, /* Controller Role request failed. */
-    OFPET_EXPERIMENTER = 0xffff      /* Experimenter error messages. */
-};
-
-/* ofp_error_msg 'code' values for OFPET_HELLO_FAILED.  'data' contains an
- * ASCII text string that may give failure details. */
-enum ofp_hello_failed_code {
-    OFPHFC_INCOMPATIBLE = 0,    /* No compatible version. */
-    OFPHFC_EPERM        = 1,    /* Permissions error. */
-};
-
-/* ofp_error_msg 'code' values for OFPET_BAD_REQUEST.  'data' contains at least
- * the first 64 bytes of the failed request. */
-enum ofp_bad_request_code {
-    OFPBRC_BAD_VERSION      = 0,  /* ofp_header.version not supported. */
-    OFPBRC_BAD_TYPE         = 1,  /* ofp_header.type not supported. */
-    OFPBRC_BAD_STAT         = 2,  /* ofp_stats_request.type not supported. */
-    OFPBRC_BAD_EXPERIMENTER = 3,  /* Experimenter id not supported
-                                   * (in ofp_experimenter_header or
-                                   * ofp_stats_request or ofp_stats_reply). */
-    OFPBRC_BAD_EXP_TYPE     = 4,  /* Experimenter type not supported. */
-    OFPBRC_EPERM            = 5,  /* Permissions error. */
-    OFPBRC_BAD_LEN          = 6,  /* Wrong request length for type. */
-    OFPBRC_BUFFER_EMPTY     = 7,  /* Specified buffer has already been used. */
-    OFPBRC_BUFFER_UNKNOWN   = 8,  /* Specified buffer does not exist. */
-    OFPBRC_BAD_TABLE_ID     = 9,  /* Specified table-id invalid or does not
-                                   * exist. */
-    OFPBRC_IS_SLAVE         = 10, /* Denied because controller is slave. */
-    OFPBRC_BAD_PORT         = 11, /* Invalid port. */
-    OFPBRC_BAD_PACKET       = 12, /* Invalid packet in packet-out. */
-};
-
-/* ofp_error_msg 'code' values for OFPET_BAD_ACTION.  'data' contains at least
- * the first 64 bytes of the failed request. */
-enum ofp_bad_action_code {
-    OFPBAC_BAD_TYPE           = 0,  /* Unknown action type. */
-    OFPBAC_BAD_LEN            = 1,  /* Length problem in actions. */
-    OFPBAC_BAD_EXPERIMENTER   = 2,  /* Unknown experimenter id specified. */
-    OFPBAC_BAD_EXP_TYPE       = 3,  /* Unknown action for experimenter id. */
-    OFPBAC_BAD_OUT_PORT       = 4,  /* Problem validating output port. */
-    OFPBAC_BAD_ARGUMENT       = 5,  /* Bad action argument. */
-    OFPBAC_EPERM              = 6,  /* Permissions error. */
-    OFPBAC_TOO_MANY           = 7,  /* Can't handle this many actions. */
-    OFPBAC_BAD_QUEUE          = 8,  /* Problem validating output queue. */
-    OFPBAC_BAD_OUT_GROUP      = 9,  /* Invalid group id in forward action. */
-    OFPBAC_MATCH_INCONSISTENT = 10, /* Action can't apply for this match,
-                                       or Set-Field missing prerequisite. */
-    OFPBAC_UNSUPPORTED_ORDER  = 11, /* Action order is unsupported for the
-                                 action list in an Apply-Actions instruction */
-    OFPBAC_BAD_TAG            = 12, /* Actions uses an unsupported
-                                       tag/encap. */
-    OFPBAC_BAD_SET_TYPE       = 13, /* Unsupported type in SET_FIELD action. */
-    OFPBAC_BAD_SET_LEN        = 14, /* Length problem in SET_FIELD action. */
-    OFPBAC_BAD_SET_ARGUMENT   = 15, /* Bad argument in SET_FIELD action. */
-};
-
-/* ofp_error_msg 'code' values for OFPET_BAD_INSTRUCTION.  'data' contains at least
- * the first 64 bytes of the failed request. */
-enum ofp_bad_instruction_code {
-    OFPBIC_UNKNOWN_INST     = 0, /* Unknown instruction. */
-    OFPBIC_UNSUP_INST       = 1, /* Switch or table does not support the
-                                    instruction. */
-    OFPBIC_BAD_TABLE_ID     = 2, /* Invalid Table-ID specified. */
-    OFPBIC_UNSUP_METADATA   = 3, /* Metadata value unsupported by datapath. */
-    OFPBIC_UNSUP_METADATA_MASK = 4, /* Metadata mask value unsupported by
-                                       datapath. */
-    OFPBIC_BAD_EXPERIMENTER = 5, /* Unknown experimenter id specified. */
-    OFPBIC_BAD_EXP_TYPE     = 6, /* Unknown instruction for experimenter id. */
-    OFPBIC_BAD_LEN          = 7, /* Length problem in instructions. */
-    OFPBIC_EPERM            = 8, /* Permissions error. */
-};
-
-/* ofp_error_msg 'code' values for OFPET_BAD_MATCH.  'data' contains at least
- * the first 64 bytes of the failed request. */
-enum ofp_bad_match_code {
-    OFPBMC_BAD_TYPE         = 0,  /* Unsupported match type specified by the
-                                     match */
-    OFPBMC_BAD_LEN          = 1,  /* Length problem in match. */
-    OFPBMC_BAD_TAG          = 2,  /* Match uses an unsupported tag/encap. */
-    OFPBMC_BAD_DL_ADDR_MASK = 3,  /* Unsupported datalink addr mask - switch
-                                     does not support arbitrary datalink
-                                     address mask. */
-    OFPBMC_BAD_NW_ADDR_MASK = 4,  /* Unsupported network addr mask - switch
-                                     does not support arbitrary network
-                                     address mask. */
-    OFPBMC_BAD_WILDCARDS    = 5,  /* Unsupported combination of fields masked
-                                     or omitted in the match. */
-    OFPBMC_BAD_FIELD        = 6,  /* Unsupported field type in the match. */
-    OFPBMC_BAD_VALUE        = 7,  /* Unsupported value in a match field. */
-    OFPBMC_BAD_MASK         = 8,  /* Unsupported mask specified in the match,
-                                     field is not dl-address or nw-address. */
-    OFPBMC_BAD_PREREQ       = 9,  /* A prerequisite was not met. */
-    OFPBMC_DUP_FIELD        = 10, /* A field type was duplicated. */
-    OFPBMC_EPERM            = 11, /* Permissions error. */
-};
-
-/* ofp_error_msg 'code' values for OFPET_FLOW_MOD_FAILED.  'data' contains
- * at least the first 64 bytes of the failed request. */
-enum ofp_flow_mod_failed_code {
-    OFPFMFC_UNKNOWN      = 0,   /* Unspecified error. */
-    OFPFMFC_TABLE_FULL   = 1,   /* Flow not added because table was full. */
-    OFPFMFC_BAD_TABLE_ID = 2,   /* Table does not exist */
-    OFPFMFC_OVERLAP      = 3,   /* Attempted to add overlapping flow with
-                                   CHECK_OVERLAP flag set. */
-    OFPFMFC_EPERM        = 4,   /* Permissions error. */
-    OFPFMFC_BAD_TIMEOUT  = 5,   /* Flow not added because of unsupported
-                                   idle/hard timeout. */
-    OFPFMFC_BAD_COMMAND  = 6,   /* Unsupported or unknown command. */
-    OFPFMFC_BAD_FLAGS    = 7,   /* Unsupported or unknown flags. */
-};
-
-/* ofp_error_msg 'code' values for OFPET_GROUP_MOD_FAILED.  'data' contains
- * at least the first 64 bytes of the failed request. */
-enum ofp_group_mod_failed_code {
-    OFPGMFC_GROUP_EXISTS         = 0,  /* Group not added because a group ADD
-                                          attempted to replace an
-                                          already-present group. */
-    OFPGMFC_INVALID_GROUP        = 1,  /* Group not added because Group
-                                          specified is invalid. */
-    OFPGMFC_WEIGHT_UNSUPPORTED   = 2,  /* Switch does not support unequal load
-                                          sharing with select groups. */
-    OFPGMFC_OUT_OF_GROUPS        = 3,  /* The group table is full. */
-    OFPGMFC_OUT_OF_BUCKETS       = 4,  /* The maximum number of action buckets
-                                          for a group has been exceeded. */
-    OFPGMFC_CHAINING_UNSUPPORTED = 5,  /* Switch does not support groups that
-                                          forward to groups. */
-    OFPGMFC_WATCH_UNSUPPORTED    = 6,  /* This group cannot watch the watch_port
-                                          or watch_group specified. */
-    OFPGMFC_LOOP                 = 7,  /* Group entry would cause a loop. */
-    OFPGMFC_UNKNOWN_GROUP        = 8,  /* Group not modified because a group
-                                          MODIFY attempted to modify a
-                                          non-existent group. */
-    OFPGMFC_CHAINED_GROUP        = 9,  /* Group not deleted because another
-                                          group is forwarding to it. */
-    OFPGMFC_BAD_TYPE             = 10, /* Unsupported or unknown group type. */
-    OFPGMFC_BAD_COMMAND          = 11, /* Unsupported or unknown command. */
-    OFPGMFC_BAD_BUCKET           = 12, /* Error in bucket. */
-    OFPGMFC_BAD_WATCH            = 13, /* Error in watch port/group. */
-    OFPGMFC_EPERM                = 14, /* Permissions error. */
-};
-
-/* ofp_error_msg 'code' values for OFPET_PORT_MOD_FAILED.  'data' contains
- * at least the first 64 bytes of the failed request. */
-enum ofp_port_mod_failed_code {
-    OFPPMFC_BAD_PORT      = 0,   /* Specified port number does not exist. */
-    OFPPMFC_BAD_HW_ADDR   = 1,   /* Specified hardware address does not
-                                  * match the port number. */
-    OFPPMFC_BAD_CONFIG    = 2,   /* Specified config is invalid. */
-    OFPPMFC_BAD_ADVERTISE = 3,   /* Specified advertise is invalid. */
-    OFPPMFC_EPERM         = 4,   /* Permissions error. */
-};
-
-/* ofp_error_msg 'code' values for OFPET_TABLE_MOD_FAILED.  'data' contains
- * at least the first 64 bytes of the failed request. */
-enum ofp_table_mod_failed_code {
-    OFPTMFC_BAD_TABLE  = 0,      /* Specified table does not exist. */
-    OFPTMFC_BAD_CONFIG = 1,      /* Specified config is invalid. */
-    OFPTMFC_EPERM      = 2,      /* Permissions error. */
-};
-
-/* ofp_error msg 'code' values for OFPET_QUEUE_OP_FAILED. 'data' contains
- * at least the first 64 bytes of the failed request */
-enum ofp_queue_op_failed_code {
-    OFPQOFC_BAD_PORT   = 0,     /* Invalid port (or port does not exist). */
-    OFPQOFC_BAD_QUEUE  = 1,     /* Queue does not exist. */
-    OFPQOFC_EPERM      = 2,     /* Permissions error. */
-};
-
-/* ofp_error_msg 'code' values for OFPET_SWITCH_CONFIG_FAILED. 'data' contains
- * at least the first 64 bytes of the failed request. */
-enum ofp_switch_config_failed_code {
-    OFPSCFC_BAD_FLAGS  = 0,      /* Specified flags is invalid. */
-    OFPSCFC_BAD_LEN    = 1,      /* Specified len is invalid. */
-    OFPQCFC_EPERM      = 2,      /* Permissions error. */
-};
-
-/* ofp_error_msg 'code' values for OFPET_ROLE_REQUEST_FAILED. 'data' contains
- * at least the first 64 bytes of the failed request. */
-enum ofp_role_request_failed_code {
-    OFPRRFC_STALE      = 0,      /* Stale Message: old generation_id. */
-    OFPRRFC_UNSUP      = 1,      /* Controller role change unsupported. */
-    OFPRRFC_BAD_ROLE   = 2,      /* Invalid role. */
-};
-
-/* OFPT_ERROR: Error message (datapath -> controller). */
-struct ofp_error_msg {
-    struct ofp_header header;
-
-    uint16_t type;
-    uint16_t code;
-    uint8_t data[0];          /* Variable-length data.  Interpreted based
-                                 on the type and code.  No padding. */
-};
-OFP_ASSERT(sizeof(struct ofp_error_msg) == 12);
-
-/* OFPET_EXPERIMENTER: Error message (datapath -> controller). */
-struct ofp_error_experimenter_msg {
-    struct ofp_header header;
-
-    uint16_t type;            /* OFPET_EXPERIMENTER. */
-    uint16_t exp_type;        /* Experimenter defined. */
-    uint32_t experimenter;    /* Experimenter ID which takes the same form
-                                 as in struct ofp_experimenter_header. */
-    uint8_t data[0];          /* Variable-length data.  Interpreted based
-                                 on the type and code.  No padding. */
-};
-OFP_ASSERT(sizeof(struct ofp_error_experimenter_msg) == 16);
-
-enum ofp_stats_types {
-    /* Description of this OpenFlow switch.
-     * The request body is empty.
-     * The reply body is struct ofp_desc_stats. */
-    OFPST_DESC = 0,
-
-    /* Individual flow statistics.
-     * The request body is struct ofp_flow_stats_request.
-     * The reply body is an array of struct ofp_flow_stats. */
-    OFPST_FLOW = 1,
-
-    /* Aggregate flow statistics.
-     * The request body is struct ofp_aggregate_stats_request.
-     * The reply body is struct ofp_aggregate_stats_reply. */
-    OFPST_AGGREGATE = 2,
-
-    /* Flow table statistics.
-     * The request body is empty.
-     * The reply body is an array of struct ofp_table_stats. */
-    OFPST_TABLE = 3,
-
-    /* Port statistics.
-     * The request body is struct ofp_port_stats_request.
-     * The reply body is an array of struct ofp_port_stats. */
-    OFPST_PORT = 4,
-
-    /* Queue statistics for a port
-     * The request body is struct ofp_queue_stats_request.
-     * The reply body is an array of struct ofp_queue_stats */
-    OFPST_QUEUE = 5,
-
-    /* Group counter statistics.
-     * The request body is struct ofp_group_stats_request.
-     * The reply is an array of struct ofp_group_stats. */
-    OFPST_GROUP = 6,
-
-    /* Group description statistics.
-     * The request body is empty.
-     * The reply body is an array of struct ofp_group_desc_stats. */
-    OFPST_GROUP_DESC = 7,
-
-    /* Group features.
-     * The request body is empty.
-     * The reply body is struct ofp_group_features_stats. */
-    OFPST_GROUP_FEATURES = 8,
-
-    /* Experimenter extension.
-     * The request and reply bodies begin with
-     * struct ofp_experimenter_stats_header.
-     * The request and reply bodies are otherwise experimenter-defined. */
-    OFPST_EXPERIMENTER = 0xffff
-};
-
-struct ofp_stats_request {
-    struct ofp_header header;
-    uint16_t type;              /* One of the OFPST_* constants. */
-    uint16_t flags;             /* OFPSF_REQ_* flags (none yet defined). */
-    uint8_t pad[4];
-    uint8_t body[0];            /* Body of the request. */
-};
-OFP_ASSERT(sizeof(struct ofp_stats_request) == 16);
-
-enum ofp_stats_reply_flags {
-    OFPSF_REPLY_MORE  = 1 << 0  /* More replies to follow. */
-};
-
-struct ofp_stats_reply {
-    struct ofp_header header;
-    uint16_t type;              /* One of the OFPST_* constants. */
-    uint16_t flags;             /* OFPSF_REPLY_* flags. */
-    uint8_t pad[4];
-    uint8_t body[0];            /* Body of the reply. */
-};
-OFP_ASSERT(sizeof(struct ofp_stats_reply) == 16);
-
-#define DESC_STR_LEN   256
-#define SERIAL_NUM_LEN 32
-/* Body of reply to OFPST_DESC request.  Each entry is a NULL-terminated
- * ASCII string. */
-struct ofp_desc_stats {
-    char mfr_desc[DESC_STR_LEN];       /* Manufacturer description. */
-    char hw_desc[DESC_STR_LEN];        /* Hardware description. */
-    char sw_desc[DESC_STR_LEN];        /* Software description. */
-    char serial_num[SERIAL_NUM_LEN];   /* Serial number. */
-    char dp_desc[DESC_STR_LEN];        /* Human readable description of datapath. */
-};
-OFP_ASSERT(sizeof(struct ofp_desc_stats) == 1056);
-
-/* Body for ofp_stats_request of type OFPST_FLOW. */
-struct ofp_flow_stats_request {
-    uint8_t table_id;         /* ID of table to read (from ofp_table_stats),
-                                 OFPTT_ALL for all tables. */
-    uint8_t pad[3];           /* Align to 32 bits. */
-    uint32_t out_port;        /* Require matching entries to include this
-                                 as an output port.  A value of OFPP_ANY
-                                 indicates no restriction. */
-    uint32_t out_group;       /* Require matching entries to include this
-                                 as an output group.  A value of OFPG_ANY
-                                 indicates no restriction. */
-    uint8_t pad2[4];          /* Align to 64 bits. */
-    uint64_t cookie;          /* Require matching entries to contain this
-                                 cookie value */
-    uint64_t cookie_mask;     /* Mask used to restrict the cookie bits that
-                                 must match. A value of 0 indicates
-                                 no restriction. */
-    struct ofp_match match;   /* Fields to match. Variable size. */
-};
-OFP_ASSERT(sizeof(struct ofp_flow_stats_request) == 40);
-
-/* Body of reply to OFPST_FLOW request. */
-struct ofp_flow_stats {
-    uint16_t length;          /* Length of this entry. */
-    uint8_t table_id;         /* ID of table flow came from. */
-    uint8_t pad;
-    uint32_t duration_sec;    /* Time flow has been alive in seconds. */
-    uint32_t duration_nsec;   /* Time flow has been alive in nanoseconds beyond
-                                 duration_sec. */
-    uint16_t priority;        /* Priority of the entry. */
-    uint16_t idle_timeout;    /* Number of seconds idle before expiration. */
-    uint16_t hard_timeout;    /* Number of seconds before expiration. */
-    uint8_t pad2[6];          /* Align to 64-bits. */
-    uint64_t cookie;          /* Opaque controller-issued identifier. */
-    uint64_t packet_count;    /* Number of packets in flow. */
-    uint64_t byte_count;      /* Number of bytes in flow. */
-    struct ofp_match match;   /* Description of fields. Variable size. */
-    //struct ofp_instruction instructions[0]; /* Instruction set. */
-};
-OFP_ASSERT(sizeof(struct ofp_flow_stats) == 56);
-
-/* Body for ofp_stats_request of type OFPST_AGGREGATE. */
-struct ofp_aggregate_stats_request {
-    uint8_t table_id;         /* ID of table to read (from ofp_table_stats)
-                                 OFPTT_ALL for all tables. */
-    uint8_t pad[3];           /* Align to 32 bits. */
-    uint32_t out_port;        /* Require matching entries to include this
-                                 as an output port.  A value of OFPP_ANY
-                                 indicates no restriction. */
-    uint32_t out_group;       /* Require matching entries to include this
-                                 as an output group.  A value of OFPG_ANY
-                                 indicates no restriction. */
-    uint8_t pad2[4];          /* Align to 64 bits. */
-    uint64_t cookie;          /* Require matching entries to contain this
-                                 cookie value */
-    uint64_t cookie_mask;     /* Mask used to restrict the cookie bits that
-                                 must match. A value of 0 indicates
-                                 no restriction. */
-    struct ofp_match match;   /* Fields to match. Variable size. */
-};
-OFP_ASSERT(sizeof(struct ofp_aggregate_stats_request) == 40);
-
-/* Body of reply to OFPST_AGGREGATE request. */
-struct ofp_aggregate_stats_reply {
-    uint64_t packet_count;    /* Number of packets in flows. */
-    uint64_t byte_count;      /* Number of bytes in flows. */
-    uint32_t flow_count;      /* Number of flows. */
-    uint8_t pad[4];           /* Align to 64 bits. */
-};
-OFP_ASSERT(sizeof(struct ofp_aggregate_stats_reply) == 24);
-
-/* Body of reply to OFPST_TABLE request. */
-struct ofp_table_stats {
-    uint8_t table_id;        /* Identifier of table.  Lower numbered tables
-                                are consulted first. */
-    uint8_t pad[7];          /* Align to 64-bits. */
-    char name[OFP_MAX_TABLE_NAME_LEN];
-    uint64_t match;          /* Bitmap of (1 << OFPXMT_*) that indicate the
-                                fields the table can match on. */
-    uint64_t wildcards;      /* Bitmap of (1 << OFPXMT_*) wildcards that are
-                                supported by the table. */
-    uint32_t write_actions;  /* Bitmap of OFPAT_* that are supported
-                                by the table with OFPIT_WRITE_ACTIONS. */
-    uint32_t apply_actions;  /* Bitmap of OFPAT_* that are supported
-                                by the table with OFPIT_APPLY_ACTIONS. */
-    uint64_t write_setfields;/* Bitmap of (1 << OFPXMT_*) header fields that
-                                can be set with OFPIT_WRITE_ACTIONS. */
-    uint64_t apply_setfields;/* Bitmap of (1 << OFPXMT_*) header fields that
-                                can be set with OFPIT_APPLY_ACTIONS. */
-    uint64_t metadata_match; /* Bits of metadata table can match. */
-    uint64_t metadata_write; /* Bits of metadata table can write. */
-    uint32_t instructions;   /* Bitmap of OFPIT_* values supported. */
-    uint32_t config;         /* Bitmap of OFPTC_* values */
-    uint32_t max_entries;    /* Max number of entries supported. */
-    uint32_t active_count;   /* Number of active entries. */
-    uint64_t lookup_count;   /* Number of packets looked up in table. */
-    uint64_t matched_count;  /* Number of packets that hit table. */
-};
-OFP_ASSERT(sizeof(struct ofp_table_stats) == 128);
-
-/* Body for ofp_stats_request of type OFPST_PORT. */
-struct ofp_port_stats_request {
-    uint32_t port_no;        /* OFPST_PORT message must request statistics
-                              * either for a single port (specified in
-                              * port_no) or for all ports (if port_no ==
-                              * OFPP_ANY). */
-    uint8_t pad[4];
-};
-OFP_ASSERT(sizeof(struct ofp_port_stats_request) == 8);
-
-/* Body of reply to OFPST_PORT request. If a counter is unsupported, set
- * the field to all ones. */
-struct ofp_port_stats {
-    uint32_t port_no;
-    uint8_t pad[4];          /* Align to 64-bits. */
-    uint64_t rx_packets;     /* Number of received packets. */
-    uint64_t tx_packets;     /* Number of transmitted packets. */
-    uint64_t rx_bytes;       /* Number of received bytes. */
-    uint64_t tx_bytes;       /* Number of transmitted bytes. */
-    uint64_t rx_dropped;     /* Number of packets dropped by RX. */
-    uint64_t tx_dropped;     /* Number of packets dropped by TX. */
-    uint64_t rx_errors;      /* Number of receive errors.  This is a super-set
-                                of more specific receive errors and should be
-                                greater than or equal to the sum of all
-                                rx_*_err values. */
-    uint64_t tx_errors;      /* Number of transmit errors.  This is a super-set
-                                of more specific transmit errors and should be
-                                greater than or equal to the sum of all
-                                tx_*_err values (none currently defined.) */
-    uint64_t rx_frame_err;   /* Number of frame alignment errors. */
-    uint64_t rx_over_err;    /* Number of packets with RX overrun. */
-    uint64_t rx_crc_err;     /* Number of CRC errors. */
-    uint64_t collisions;     /* Number of collisions. */
-};
-OFP_ASSERT(sizeof(struct ofp_port_stats) == 104);
-
-/* Body of OFPST_GROUP request. */
-struct ofp_group_stats_request {
-    uint32_t group_id;       /* All groups if OFPG_ALL. */
-    uint8_t pad[4];          /* Align to 64 bits. */
-};
-OFP_ASSERT(sizeof(struct ofp_group_stats_request) == 8);
-
-/* Used in group stats replies. */
-struct ofp_bucket_counter {
-    uint64_t packet_count;   /* Number of packets processed by bucket. */
-    uint64_t byte_count;     /* Number of bytes processed by bucket. */
-};
-OFP_ASSERT(sizeof(struct ofp_bucket_counter) == 16);
-
-/* Body of reply to OFPST_GROUP request. */
-struct ofp_group_stats {
-    uint16_t length;         /* Length of this entry. */
-    uint8_t pad[2];          /* Align to 64 bits. */
-    uint32_t group_id;       /* Group identifier. */
-    uint32_t ref_count;      /* Number of flows or groups that directly forward
-                                to this group. */
-    uint8_t pad2[4];         /* Align to 64 bits. */
-    uint64_t packet_count;   /* Number of packets processed by group. */
-    uint64_t byte_count;     /* Number of bytes processed by group. */
-    struct ofp_bucket_counter bucket_stats[0];
-};
-OFP_ASSERT(sizeof(struct ofp_group_stats) == 32);
-
-/* Body of reply to OFPST_GROUP_DESC request. */
-struct ofp_group_desc_stats {
-    uint16_t length;              /* Length of this entry. */
-    uint8_t type;                 /* One of OFPGT_*. */
-    uint8_t pad;                  /* Pad to 64 bits. */
-    uint32_t group_id;            /* Group identifier. */
-    struct ofp_bucket buckets[0];
-};
-OFP_ASSERT(sizeof(struct ofp_group_desc_stats) == 8);
-
-/* Group configuration flags */
-enum ofp_group_capabilities {
-    OFPGFC_SELECT_WEIGHT   = 1 << 0,  /* Support weight for select groups */
-    OFPGFC_SELECT_LIVENESS = 1 << 1,  /* Support liveness for select groups */
-    OFPGFC_CHAINING        = 1 << 2,  /* Support chaining groups */
-    OFPGFC_CHAINING_CHECKS = 1 << 3,  /* Check chaining for loops and delete */
-};
-
-/* Body of reply to OFPST_GROUP_FEATURES request. Group features. */
-struct ofp_group_features_stats {
-    uint32_t  types;           /* Bitmap of OFPGT_* values supported. */
-    uint32_t  capabilities;    /* Bitmap of OFPGFC_* capability supported. */
-    uint32_t  max_groups[4];   /* Maximum number of groups for each type. */
-    uint32_t  actions[4];      /* Bitmaps of OFPAT_* that are supported. */
-};
-OFP_ASSERT(sizeof(struct ofp_group_features_stats) == 40);
-
-/* Body for ofp_stats_request/reply of type OFPST_EXPERIMENTER. */
-struct ofp_experimenter_stats_header {
-    uint32_t experimenter;    /* Experimenter ID which takes the same form
-                                 as in struct ofp_experimenter_header. */
-    uint32_t exp_type;        /* Experimenter defined. */
-    /* Experimenter-defined arbitrary additional data. */
-};
-OFP_ASSERT(sizeof(struct ofp_experimenter_stats_header) == 8);
-
-/* Experimenter extension. */
-struct ofp_experimenter_header {
-    struct ofp_header header;   /* Type OFPT_EXPERIMENTER. */
-    uint32_t experimenter;      /* Experimenter ID:
-                                 * - MSB 0: low-order bytes are IEEE OUI.
-                                 * - MSB != 0: defined by ONF. */
-    uint32_t exp_type;          /* Experimenter defined. */
-    /* Experimenter-defined arbitrary additional data. */
-};
-OFP_ASSERT(sizeof(struct ofp_experimenter_header) == 16);
-
-/* All ones is used to indicate all queues in a port (for stats retrieval). */
-#define OFPQ_ALL      0xffffffff
-
-/* Min rate > 1000 means not configured. */
-#define OFPQ_MIN_RATE_UNCFG      0xffff
-
-/* Max rate > 1000 means not configured. */
-#define OFPQ_MAX_RATE_UNCFG      0xffff
-
-enum ofp_queue_properties {
-    OFPQT_MIN_RATE      = 1,      /* Minimum datarate guaranteed. */
-    OFPQT_MAX_RATE      = 2,      /* Maximum datarate. */
-    OFPQT_EXPERIMENTER  = 0xffff  /* Experimenter defined property. */
-};
-
-/* Common description for a queue. */
-struct ofp_queue_prop_header {
-    uint16_t property;    /* One of OFPQT_. */
-    uint16_t len;         /* Length of property, including this header. */
-    uint8_t pad[4];       /* 64-bit alignemnt. */
-};
-OFP_ASSERT(sizeof(struct ofp_queue_prop_header) == 8);
-
-/* Min-Rate queue property description. */
-struct ofp_queue_prop_min_rate {
-    struct ofp_queue_prop_header prop_header; /* prop: OFPQT_MIN, len: 16. */
-    uint16_t rate;        /* In 1/10 of a percent; >1000 -> disabled. */
-    uint8_t pad[6];       /* 64-bit alignment */
-};
-OFP_ASSERT(sizeof(struct ofp_queue_prop_min_rate) == 16);
-
-/* Max-Rate queue property description. */
-struct ofp_queue_prop_max_rate {
-    struct ofp_queue_prop_header prop_header; /* prop: OFPQT_MAX, len: 16. */
-    uint16_t rate;        /* In 1/10 of a percent; >1000 -> disabled. */
-    uint8_t pad[6];       /* 64-bit alignment */
-};
-OFP_ASSERT(sizeof(struct ofp_queue_prop_max_rate) == 16);
-
-/* Experimenter queue property description. */
-struct ofp_queue_prop_experimenter {
-    struct ofp_queue_prop_header prop_header; /* prop: OFPQT_EXPERIMENTER, len: 16. */
-    uint32_t experimenter;          /* Experimenter ID which takes the same
-                                       form as in struct
-                                       ofp_experimenter_header. */
-    uint8_t pad[4];       /* 64-bit alignment */
-    uint8_t data[0];      /* Experimenter defined data. */
-};
-OFP_ASSERT(sizeof(struct ofp_queue_prop_experimenter) == 16);
-
-/* Full description for a queue. */
-struct ofp_packet_queue {
-    uint32_t queue_id;     /* id for the specific queue. */
-    uint32_t port;         /* Port this queue is attached to. */
-    uint16_t len;          /* Length in bytes of this queue desc. */
-    uint8_t pad[6];        /* 64-bit alignment. */
-    struct ofp_queue_prop_header properties[0]; /* List of properties. */
-};
-OFP_ASSERT(sizeof(struct ofp_packet_queue) == 16);
-
-/* Query for port queue configuration. */
-struct ofp_queue_get_config_request {
-    struct ofp_header header;
-    uint32_t port;         /* Port to be queried. Should refer
-                              to a valid physical port (i.e. < OFPP_MAX),
-                              or OFPP_ANY to request all configured
-                              queues.*/
-    uint8_t pad[4];
-};
-OFP_ASSERT(sizeof(struct ofp_queue_get_config_request) == 16);
-
-/* Queue configuration for a given port. */
-struct ofp_queue_get_config_reply {
-    struct ofp_header header;
-    uint32_t port;
-    uint8_t pad[4];
-    struct ofp_packet_queue queues[0]; /* List of configured queues. */
-};
-OFP_ASSERT(sizeof(struct ofp_queue_get_config_reply) == 16);
-
-/* OFPAT_SET_QUEUE action struct: send packets to given queue on port. */
-struct ofp_action_set_queue {
-    uint16_t type;            /* OFPAT_SET_QUEUE. */
-    uint16_t len;             /* Len is 8. */
-    uint32_t queue_id;        /* Queue id for the packets. */
-};
-OFP_ASSERT(sizeof(struct ofp_action_set_queue) == 8);
-
-struct ofp_queue_stats_request {
-    uint32_t port_no;        /* All ports if OFPP_ANY. */
-    uint32_t queue_id;       /* All queues if OFPQ_ALL. */
-};
-OFP_ASSERT(sizeof(struct ofp_queue_stats_request) == 8);
-
-struct ofp_queue_stats {
-    uint32_t port_no;
-    uint32_t queue_id;       /* Queue i.d */
-    uint64_t tx_bytes;       /* Number of transmitted bytes. */
-    uint64_t tx_packets;     /* Number of transmitted packets. */
-    uint64_t tx_errors;      /* Number of packets dropped due to overrun. */
-};
-OFP_ASSERT(sizeof(struct ofp_queue_stats) == 32);
-
-/* Configures the "role" of the sending controller.  The default role is:
- *
- *    - Equal (NX_ROLE_EQUAL), which allows the controller access to all
- *      OpenFlow features. All controllers have equal responsibility.
- *
- * The other possible roles are a related pair:
- *
- *    - Master (NX_ROLE_MASTER) is equivalent to Equal, except that there may
- *      be at most one Master controller at a time: when a controller
- *      configures itself as Master, any existing Master is demoted to the
- *      Slave role.
- *
- *    - Slave (NX_ROLE_SLAVE) allows the controller read-only access to
- *      OpenFlow features.  In particular attempts to modify the flow table
- *      will be rejected with an OFPBRC_EPERM error.
- *
- *      Slave controllers do not receive OFPT_PACKET_IN or OFPT_FLOW_REMOVED
- *      messages, but they do receive OFPT_PORT_STATUS messages.
- */
-
-/* Controller roles. */
-enum ofp_controller_role {
-    OFPCR_ROLE_NOCHANGE = 0,    /* Don't change current role. */
-    OFPCR_ROLE_EQUAL    = 1,    /* Default role, full access. */
-    OFPCR_ROLE_MASTER   = 2,    /* Full access, at most one master. */
-    OFPCR_ROLE_SLAVE    = 3,    /* Read-only access. */
-};
-
-/* Role request and reply message. */
-struct ofp_role_request {
-    struct ofp_header header;   /* Type OFPT_ROLE_REQUEST/OFPT_ROLE_REPLY. */
-    uint32_t role;              /* One of NX_ROLE_*. */
-    uint8_t pad[4];             /* Align to 64 bits. */
-    uint64_t generation_id;     /* Master Election Generation Id */
-};
-OFP_ASSERT(sizeof(struct ofp_role_request) == 24);
-
-#endif /* openflow/openflow.h */
diff --git a/canonical/openflow.h-1.3 b/canonical/openflow.h-1.3
deleted file mode 100644
index 791ceda..0000000
--- a/canonical/openflow.h-1.3
+++ /dev/null
@@ -1,2318 +0,0 @@
-/* Copyright (c) 2008 The Board of Trustees of The Leland Stanford
- * Junior University
- * Copyright (c) 2011, 2012 Open Networking Foundation
- *
- * We are making the OpenFlow specification and associated documentation
- * (Software) available for public use and benefit with the expectation
- * that others will use, modify and enhance the Software and contribute
- * those enhancements back to the community. However, since we would
- * like to make the Software available for broadest use, with as few
- * restrictions as possible permission is hereby granted, free of
- * charge, to any person obtaining a copy of this Software to deal in
- * the Software under the copyrights without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sublicense, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
- * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
- * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- *
- * The name and trademarks of copyright holder(s) may NOT be used in
- * advertising or publicity pertaining to the Software or any
- * derivatives without specific, written prior permission.
- */
-
-/* OpenFlow: protocol between controller and datapath. */
-
-#ifndef OPENFLOW_OPENFLOW_H
-#define OPENFLOW_OPENFLOW_H 1
-
-#ifdef __KERNEL__
-#include <linux/types.h>
-#else
-#include <stdint.h>
-#endif
-
-#ifdef SWIG
-#define OFP_ASSERT(EXPR)        /* SWIG can't handle OFP_ASSERT. */
-#elif !defined(__cplusplus)
-/* Build-time assertion for use in a declaration context. */
-#define OFP_ASSERT(EXPR)                                                \
-        extern int (*build_assert(void))[ sizeof(struct {               \
-                    unsigned int build_assert_failed : (EXPR) ? 1 : -1; })]
-#else /* __cplusplus */
-#define OFP_ASSERT(_EXPR) typedef int build_assert_failed[(_EXPR) ? 1 : -1]
-#endif /* __cplusplus */
-
-#ifndef SWIG
-#define OFP_PACKED __attribute__((packed))
-#else
-#define OFP_PACKED              /* SWIG doesn't understand __attribute. */
-#endif
-
-/* Version number:
- * Non-experimental versions released: 0x01 = 1.0 ; 0x02 = 1.1 ; 0x03 = 1.2
- *     0x04 = 1.3
- * Experimental versions released: 0x81 -- 0x99
- */
-/* The most significant bit being set in the version field indicates an
- * experimental OpenFlow version.
- */
-#define OFP_VERSION   0x04
-
-#define OFP_MAX_TABLE_NAME_LEN 32
-#define OFP_MAX_PORT_NAME_LEN  16
-
-#define OFP_TCP_PORT  6633
-#define OFP_SSL_PORT  6633
-
-#define OFP_ETH_ALEN 6          /* Bytes in an Ethernet address. */
-
-/* Port numbering. Ports are numbered starting from 1. */
-enum ofp_port_no {
-    /* Maximum number of physical and logical switch ports. */
-    OFPP_MAX        = 0xffffff00,
-
-    /* Reserved OpenFlow Port (fake output "ports"). */
-    OFPP_IN_PORT    = 0xfffffff8,  /* Send the packet out the input port.  This
-                                      reserved port must be explicitly used
-                                      in order to send back out of the input
-                                      port. */
-    OFPP_TABLE      = 0xfffffff9,  /* Submit the packet to the first flow table
-                                      NB: This destination port can only be
-                                      used in packet-out messages. */
-    OFPP_NORMAL     = 0xfffffffa,  /* Process with normal L2/L3 switching. */
-    OFPP_FLOOD      = 0xfffffffb,  /* All physical ports in VLAN, except input
-                                      port and those blocked or link down. */
-    OFPP_ALL        = 0xfffffffc,  /* All physical ports except input port. */
-    OFPP_CONTROLLER = 0xfffffffd,  /* Send to controller. */
-    OFPP_LOCAL      = 0xfffffffe,  /* Local openflow "port". */
-    OFPP_ANY        = 0xffffffff   /* Wildcard port used only for flow mod
-                                      (delete) and flow stats requests. Selects
-                                      all flows regardless of output port
-                                      (including flows with no output port). */
-};
-
-enum ofp_type {
-    /* Immutable messages. */
-    OFPT_HELLO              = 0,  /* Symmetric message */
-    OFPT_ERROR              = 1,  /* Symmetric message */
-    OFPT_ECHO_REQUEST       = 2,  /* Symmetric message */
-    OFPT_ECHO_REPLY         = 3,  /* Symmetric message */
-    OFPT_EXPERIMENTER       = 4,  /* Symmetric message */
-
-    /* Switch configuration messages. */
-    OFPT_FEATURES_REQUEST   = 5,  /* Controller/switch message */
-    OFPT_FEATURES_REPLY     = 6,  /* Controller/switch message */
-    OFPT_GET_CONFIG_REQUEST = 7,  /* Controller/switch message */
-    OFPT_GET_CONFIG_REPLY   = 8,  /* Controller/switch message */
-    OFPT_SET_CONFIG         = 9,  /* Controller/switch message */
-
-    /* Asynchronous messages. */
-    OFPT_PACKET_IN          = 10, /* Async message */
-    OFPT_FLOW_REMOVED       = 11, /* Async message */
-    OFPT_PORT_STATUS        = 12, /* Async message */
-
-    /* Controller command messages. */
-    OFPT_PACKET_OUT         = 13, /* Controller/switch message */
-    OFPT_FLOW_MOD           = 14, /* Controller/switch message */
-    OFPT_GROUP_MOD          = 15, /* Controller/switch message */
-    OFPT_PORT_MOD           = 16, /* Controller/switch message */
-    OFPT_TABLE_MOD          = 17, /* Controller/switch message */
-
-    /* Multipart messages. */
-    OFPT_MULTIPART_REQUEST      = 18, /* Controller/switch message */
-    OFPT_MULTIPART_REPLY        = 19, /* Controller/switch message */
-
-    /* Barrier messages. */
-    OFPT_BARRIER_REQUEST    = 20, /* Controller/switch message */
-    OFPT_BARRIER_REPLY      = 21, /* Controller/switch message */
-
-    /* Queue Configuration messages. */
-    OFPT_QUEUE_GET_CONFIG_REQUEST = 22,  /* Controller/switch message */
-    OFPT_QUEUE_GET_CONFIG_REPLY   = 23,  /* Controller/switch message */
-
-    /* Controller role change request messages. */
-    OFPT_ROLE_REQUEST       = 24, /* Controller/switch message */
-    OFPT_ROLE_REPLY         = 25, /* Controller/switch message */
-
-    /* Asynchronous message configuration. */
-    OFPT_GET_ASYNC_REQUEST  = 26, /* Controller/switch message */
-    OFPT_GET_ASYNC_REPLY    = 27, /* Controller/switch message */
-    OFPT_SET_ASYNC          = 28, /* Controller/switch message */
-
-    /* Meters and rate limiters configuration messages. */
-    OFPT_METER_MOD          = 29, /* Controller/switch message */
-};
-
-/* Header on all OpenFlow packets. */
-struct ofp_header {
-    uint8_t version;    /* OFP_VERSION. */
-    uint8_t type;       /* One of the OFPT_ constants. */
-    uint16_t length;    /* Length including this ofp_header. */
-    uint32_t xid;       /* Transaction id associated with this packet.
-                           Replies use the same id as was in the request
-                           to facilitate pairing. */
-};
-OFP_ASSERT(sizeof(struct ofp_header) == 8);
-
-/* Hello elements types.
- */
-enum ofp_hello_elem_type {
-    OFPHET_VERSIONBITMAP          = 1,  /* Bitmap of version supported. */
-};
-
-/* Common header for all Hello Elements */
-struct ofp_hello_elem_header {
-    uint16_t         type;    /* One of OFPHET_*. */
-    uint16_t         length;  /* Length in bytes of this element. */
-};
-OFP_ASSERT(sizeof(struct ofp_hello_elem_header) == 4);
-
-/* Version bitmap Hello Element */
-struct ofp_hello_elem_versionbitmap {
-    uint16_t         type;    /* OFPHET_VERSIONBITMAP. */
-    uint16_t         length;  /* Length in bytes of this element. */
-    /* Followed by:
-     *   - Exactly (length - 4) bytes containing the bitmaps, then
-     *   - Exactly (length + 7)/8*8 - (length) (between 0 and 7)
-     *     bytes of all-zero bytes */
-    uint32_t         bitmaps[0];   /* List of bitmaps - supported versions */
-};
-OFP_ASSERT(sizeof(struct ofp_hello_elem_versionbitmap) == 4);
-
-/* OFPT_HELLO.  This message includes zero or more hello elements having
- * variable size. Unknown elements types must be ignored/skipped, to allow
- * for future extensions. */
-struct ofp_hello {
-    struct ofp_header header;
-
-    /* Hello element list */
-    struct ofp_hello_elem_header elements[0];
-};
-OFP_ASSERT(sizeof(struct ofp_hello) == 8);
-
-#define OFP_DEFAULT_MISS_SEND_LEN   128
-
-enum ofp_config_flags {
-    /* Handling of IP fragments. */
-    OFPC_FRAG_NORMAL   = 0,       /* No special handling for fragments. */
-    OFPC_FRAG_DROP     = 1 << 0,  /* Drop fragments. */
-    OFPC_FRAG_REASM    = 1 << 1,  /* Reassemble (only if OFPC_IP_REASM set). */
-    OFPC_FRAG_MASK     = 3,
-};
-
-/* Switch configuration. */
-struct ofp_switch_config {
-    struct ofp_header header;
-    uint16_t flags;             /* OFPC_* flags. */
-    uint16_t miss_send_len;     /* Max bytes of packet that datapath
-                                   should send to the controller. See
-                                   ofp_controller_max_len for valid values.
-                                   */
-};
-OFP_ASSERT(sizeof(struct ofp_switch_config) == 12);
-
-/* Flags to configure the table. Reserved for future use. */
-enum ofp_table_config {
-    OFPTC_DEPRECATED_MASK       = 3,  /* Deprecated bits */
-};
-
-/* Table numbering. Tables can use any number up to OFPT_MAX. */
-enum ofp_table {
-    /* Last usable table number. */
-    OFPTT_MAX        = 0xfe,
-
-    /* Fake tables. */
-    OFPTT_ALL        = 0xff   /* Wildcard table used for table config,
-                                 flow stats and flow deletes. */
-};
-
-
-/* Configure/Modify behavior of a flow table */
-struct ofp_table_mod {
-    struct ofp_header header;
-    uint8_t table_id;       /* ID of the table, OFPTT_ALL indicates all tables */
-    uint8_t pad[3];         /* Pad to 32 bits */
-    uint32_t config;        /* Bitmap of OFPTC_* flags */
-};
-OFP_ASSERT(sizeof(struct ofp_table_mod) == 16);
-
-/* Capabilities supported by the datapath. */
-enum ofp_capabilities {
-    OFPC_FLOW_STATS     = 1 << 0,  /* Flow statistics. */
-    OFPC_TABLE_STATS    = 1 << 1,  /* Table statistics. */
-    OFPC_PORT_STATS     = 1 << 2,  /* Port statistics. */
-    OFPC_GROUP_STATS    = 1 << 3,  /* Group statistics. */
-    OFPC_IP_REASM       = 1 << 5,  /* Can reassemble IP fragments. */
-    OFPC_QUEUE_STATS    = 1 << 6,  /* Queue statistics. */
-    OFPC_PORT_BLOCKED   = 1 << 8   /* Switch will block looping ports. */
-};
-
-/* Flags to indicate behavior of the physical port.  These flags are
- * used in ofp_port to describe the current configuration.  They are
- * used in the ofp_port_mod message to configure the port's behavior.
- */
-enum ofp_port_config {
-    OFPPC_PORT_DOWN    = 1 << 0,  /* Port is administratively down. */
-
-    OFPPC_NO_RECV      = 1 << 2,  /* Drop all packets received by port. */
-    OFPPC_NO_FWD       = 1 << 5,  /* Drop packets forwarded to port. */
-    OFPPC_NO_PACKET_IN = 1 << 6   /* Do not send packet-in msgs for port. */
-};
-
-/* Current state of the physical port.  These are not configurable from
- * the controller.
- */
-enum ofp_port_state {
-    OFPPS_LINK_DOWN    = 1 << 0,  /* No physical link present. */
-    OFPPS_BLOCKED      = 1 << 1,  /* Port is blocked */
-    OFPPS_LIVE         = 1 << 2,  /* Live for Fast Failover Group. */
-};
-
-/* Features of ports available in a datapath. */
-enum ofp_port_features {
-    OFPPF_10MB_HD    = 1 << 0,  /* 10 Mb half-duplex rate support. */
-    OFPPF_10MB_FD    = 1 << 1,  /* 10 Mb full-duplex rate support. */
-    OFPPF_100MB_HD   = 1 << 2,  /* 100 Mb half-duplex rate support. */
-    OFPPF_100MB_FD   = 1 << 3,  /* 100 Mb full-duplex rate support. */
-    OFPPF_1GB_HD     = 1 << 4,  /* 1 Gb half-duplex rate support. */
-    OFPPF_1GB_FD     = 1 << 5,  /* 1 Gb full-duplex rate support. */
-    OFPPF_10GB_FD    = 1 << 6,  /* 10 Gb full-duplex rate support. */
-    OFPPF_40GB_FD    = 1 << 7,  /* 40 Gb full-duplex rate support. */
-    OFPPF_100GB_FD   = 1 << 8,  /* 100 Gb full-duplex rate support. */
-    OFPPF_1TB_FD     = 1 << 9,  /* 1 Tb full-duplex rate support. */
-    OFPPF_OTHER      = 1 << 10, /* Other rate, not in the list. */
-
-    OFPPF_COPPER     = 1 << 11, /* Copper medium. */
-    OFPPF_FIBER      = 1 << 12, /* Fiber medium. */
-    OFPPF_AUTONEG    = 1 << 13, /* Auto-negotiation. */
-    OFPPF_PAUSE      = 1 << 14, /* Pause. */
-    OFPPF_PAUSE_ASYM = 1 << 15  /* Asymmetric pause. */
-};
-
-/* Description of a port */
-struct ofp_port {
-    uint32_t port_no;
-    uint8_t pad[4];
-    uint8_t hw_addr[OFP_ETH_ALEN];
-    uint8_t pad2[2];                  /* Align to 64 bits. */
-    char name[OFP_MAX_PORT_NAME_LEN]; /* Null-terminated */
-
-    uint32_t config;        /* Bitmap of OFPPC_* flags. */
-    uint32_t state;         /* Bitmap of OFPPS_* flags. */
-
-    /* Bitmaps of OFPPF_* that describe features.  All bits zeroed if
-     * unsupported or unavailable. */
-    uint32_t curr;          /* Current features. */
-    uint32_t advertised;    /* Features being advertised by the port. */
-    uint32_t supported;     /* Features supported by the port. */
-    uint32_t peer;          /* Features advertised by peer. */
-
-    uint32_t curr_speed;    /* Current port bitrate in kbps. */
-    uint32_t max_speed;     /* Max port bitrate in kbps */
-};
-OFP_ASSERT(sizeof(struct ofp_port) == 64);
-
-/* Switch features. */
-struct ofp_switch_features {
-    struct ofp_header header;
-    uint64_t datapath_id;   /* Datapath unique ID.  The lower 48-bits are for
-                               a MAC address, while the upper 16-bits are
-                               implementer-defined. */
-
-    uint32_t n_buffers;     /* Max packets buffered at once. */
-
-    uint8_t n_tables;       /* Number of tables supported by datapath. */
-    uint8_t auxiliary_id;   /* Identify auxiliary connections */
-    uint8_t pad[2];         /* Align to 64-bits. */
-
-    /* Features. */
-    uint32_t capabilities;  /* Bitmap of support "ofp_capabilities". */
-    uint32_t reserved;
-};
-OFP_ASSERT(sizeof(struct ofp_switch_features) == 32);
-
-/* What changed about the physical port */
-enum ofp_port_reason {
-    OFPPR_ADD     = 0,         /* The port was added. */
-    OFPPR_DELETE  = 1,         /* The port was removed. */
-    OFPPR_MODIFY  = 2,         /* Some attribute of the port has changed. */
-};
-
-/* A physical port has changed in the datapath */
-struct ofp_port_status {
-    struct ofp_header header;
-    uint8_t reason;          /* One of OFPPR_*. */
-    uint8_t pad[7];          /* Align to 64-bits. */
-    struct ofp_port desc;
-};
-OFP_ASSERT(sizeof(struct ofp_port_status) == 80);
-
-/* Modify behavior of the physical port */
-struct ofp_port_mod {
-    struct ofp_header header;
-    uint32_t port_no;
-    uint8_t pad[4];
-    uint8_t hw_addr[OFP_ETH_ALEN]; /* The hardware address is not
-                                      configurable.  This is used to
-                                      sanity-check the request, so it must
-                                      be the same as returned in an
-                                      ofp_port struct. */
-    uint8_t pad2[2];        /* Pad to 64 bits. */
-    uint32_t config;        /* Bitmap of OFPPC_* flags. */
-    uint32_t mask;          /* Bitmap of OFPPC_* flags to be changed. */
-
-    uint32_t advertise;     /* Bitmap of OFPPF_*.  Zero all bits to prevent
-                               any action taking place. */
-    uint8_t pad3[4];        /* Pad to 64 bits. */
-};
-OFP_ASSERT(sizeof(struct ofp_port_mod) == 40);
-
-/* ## -------------------------- ## */
-/* ## OpenFlow Extensible Match. ## */
-/* ## -------------------------- ## */
-
-/* The match type indicates the match structure (set of fields that compose the
- * match) in use. The match type is placed in the type field at the beginning
- * of all match structures. The "OpenFlow Extensible Match" type corresponds
- * to OXM TLV format described below and must be supported by all OpenFlow
- * switches. Extensions that define other match types may be published on the
- * ONF wiki. Support for extensions is optional.
- */
-enum ofp_match_type {
-    OFPMT_STANDARD = 0,       /* Deprecated. */
-    OFPMT_OXM      = 1,       /* OpenFlow Extensible Match */
-};
-
-/* Fields to match against flows */
-struct ofp_match {
-    uint16_t type;             /* One of OFPMT_* */
-    uint16_t length;           /* Length of ofp_match (excluding padding) */
-    /* Followed by:
-     *   - Exactly (length - 4) (possibly 0) bytes containing OXM TLVs, then
-     *   - Exactly ((length + 7)/8*8 - length) (between 0 and 7) bytes of
-     *     all-zero bytes
-     * In summary, ofp_match is padded as needed, to make its overall size
-     * a multiple of 8, to preserve alignement in structures using it.
-     */
-    uint8_t oxm_fields[4];     /* OXMs start here - Make compiler happy */
-};
-OFP_ASSERT(sizeof(struct ofp_match) == 8);
-
-/* Components of a OXM TLV header. */
-#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_CLASS(HEADER), OXM_FIELD(HEADER), OXM_LENGTH(HEADER))
-
-/* OXM Class IDs.
- * The high order bit differentiate reserved classes from member classes.
- * Classes 0x0000 to 0x7FFF are member classes, allocated by ONF.
- * Classes 0x8000 to 0xFFFE are reserved classes, reserved for standardisation.
- */
-enum ofp_oxm_class {
-    OFPXMC_NXM_0          = 0x0000,    /* Backward compatibility with NXM */
-    OFPXMC_NXM_1          = 0x0001,    /* Backward compatibility with NXM */
-    OFPXMC_OPENFLOW_BASIC = 0x8000,    /* Basic class for OpenFlow */
-    OFPXMC_EXPERIMENTER   = 0xFFFF,    /* Experimenter class */
-};
-
-/* OXM Flow match field types for OpenFlow basic class. */
-enum oxm_ofb_match_fields {
-    OFPXMT_OFB_IN_PORT        = 0,  /* Switch input port. */
-    OFPXMT_OFB_IN_PHY_PORT    = 1,  /* Switch physical input port. */
-    OFPXMT_OFB_METADATA       = 2,  /* Metadata passed between tables. */
-    OFPXMT_OFB_ETH_DST        = 3,  /* Ethernet destination address. */
-    OFPXMT_OFB_ETH_SRC        = 4,  /* Ethernet source address. */
-    OFPXMT_OFB_ETH_TYPE       = 5,  /* Ethernet frame type. */
-    OFPXMT_OFB_VLAN_VID       = 6,  /* VLAN id. */
-    OFPXMT_OFB_VLAN_PCP       = 7,  /* VLAN priority. */
-    OFPXMT_OFB_IP_DSCP        = 8,  /* IP DSCP (6 bits in ToS field). */
-    OFPXMT_OFB_IP_ECN         = 9,  /* IP ECN (2 bits in ToS field). */
-    OFPXMT_OFB_IP_PROTO       = 10, /* IP protocol. */
-    OFPXMT_OFB_IPV4_SRC       = 11, /* IPv4 source address. */
-    OFPXMT_OFB_IPV4_DST       = 12, /* IPv4 destination address. */
-    OFPXMT_OFB_TCP_SRC        = 13, /* TCP source port. */
-    OFPXMT_OFB_TCP_DST        = 14, /* TCP destination port. */
-    OFPXMT_OFB_UDP_SRC        = 15, /* UDP source port. */
-    OFPXMT_OFB_UDP_DST        = 16, /* UDP destination port. */
-    OFPXMT_OFB_SCTP_SRC       = 17, /* SCTP source port. */
-    OFPXMT_OFB_SCTP_DST       = 18, /* SCTP destination port. */
-    OFPXMT_OFB_ICMPV4_TYPE    = 19, /* ICMP type. */
-    OFPXMT_OFB_ICMPV4_CODE    = 20, /* ICMP code. */
-    OFPXMT_OFB_ARP_OP         = 21, /* ARP opcode. */
-    OFPXMT_OFB_ARP_SPA        = 22, /* ARP source IPv4 address. */
-    OFPXMT_OFB_ARP_TPA        = 23, /* ARP target IPv4 address. */
-    OFPXMT_OFB_ARP_SHA        = 24, /* ARP source hardware address. */
-    OFPXMT_OFB_ARP_THA        = 25, /* ARP target hardware address. */
-    OFPXMT_OFB_IPV6_SRC       = 26, /* IPv6 source address. */
-    OFPXMT_OFB_IPV6_DST       = 27, /* IPv6 destination address. */
-    OFPXMT_OFB_IPV6_FLABEL    = 28, /* IPv6 Flow Label */
-    OFPXMT_OFB_ICMPV6_TYPE    = 29, /* ICMPv6 type. */
-    OFPXMT_OFB_ICMPV6_CODE    = 30, /* ICMPv6 code. */
-    OFPXMT_OFB_IPV6_ND_TARGET = 31, /* Target address for ND. */
-    OFPXMT_OFB_IPV6_ND_SLL    = 32, /* Source link-layer for ND. */
-    OFPXMT_OFB_IPV6_ND_TLL    = 33, /* Target link-layer for ND. */
-    OFPXMT_OFB_MPLS_LABEL     = 34, /* MPLS label. */
-    OFPXMT_OFB_MPLS_TC        = 35, /* MPLS TC. */
-    OFPXMT_OFP_MPLS_BOS       = 36, /* MPLS BoS bit. */
-    OFPXMT_OFB_PBB_ISID       = 37, /* PBB I-SID. */
-    OFPXMT_OFB_TUNNEL_ID      = 38, /* Logical Port Metadata. */
-    OFPXMT_OFB_IPV6_EXTHDR    = 39, /* IPv6 Extension Header pseudo-field */
-};
-
-#define OFPXMT_OFB_ALL    ((UINT64_C(1) << 40) - 1)
-
-/* OpenFlow port on which the packet was received.
- * May be a physical port, a logical port, or the reserved port OFPP_LOCAL
- *
- * Prereqs: None.
- *
- * Format: 32-bit integer in network byte order.
- *
- * Masking: Not maskable. */
-#define OXM_OF_IN_PORT    OXM_HEADER  (0x8000, OFPXMT_OFB_IN_PORT, 4)
-
-/* Physical port on which the packet was received.
- *
- * Consider a packet received on a tunnel interface defined over a link
- * aggregation group (LAG) with two physical port members.  If the tunnel
- * interface is the logical port bound to OpenFlow.  In this case,
- * OFPXMT_OF_IN_PORT is the tunnel's port number and OFPXMT_OF_IN_PHY_PORT is
- * the physical port number of the LAG on which the tunnel is configured.
- *
- * When a packet is received directly on a physical port and not processed by a
- * logical port, OFPXMT_OF_IN_PORT and OFPXMT_OF_IN_PHY_PORT have the same
- * value.
- *
- * This field is usually not available in a regular match and only available
- * in ofp_packet_in messages when it's different from OXM_OF_IN_PORT.
- *
- * Prereqs: OXM_OF_IN_PORT must be present.
- *
- * Format: 32-bit integer in network byte order.
- *
- * Masking: Not maskable. */
-#define OXM_OF_IN_PHY_PORT OXM_HEADER  (0x8000, OFPXMT_OFB_IN_PHY_PORT, 4)
-
-/* Table metadata.
- *
- * Prereqs: None.
- *
- * Format: 64-bit integer in network byte order.
- *
- * Masking: Arbitrary masks.
- */
-#define OXM_OF_METADATA   OXM_HEADER  (0x8000, OFPXMT_OFB_METADATA, 8)
-#define OXM_OF_METADATA_W OXM_HEADER_W(0x8000, OFPXMT_OFB_METADATA, 8)
-
-/* Source or destination address in Ethernet header.
- *
- * Prereqs: None.
- *
- * Format: 48-bit Ethernet MAC address.
- *
- * Masking: Arbitrary masks. */
-#define OXM_OF_ETH_DST    OXM_HEADER  (0x8000, OFPXMT_OFB_ETH_DST, 6)
-#define OXM_OF_ETH_DST_W  OXM_HEADER_W(0x8000, OFPXMT_OFB_ETH_DST, 6)
-#define OXM_OF_ETH_SRC    OXM_HEADER  (0x8000, OFPXMT_OFB_ETH_SRC, 6)
-#define OXM_OF_ETH_SRC_W  OXM_HEADER_W(0x8000, OFPXMT_OFB_ETH_SRC, 6)
-
-/* Packet's Ethernet type.
- *
- * Prereqs: None.
- *
- * Format: 16-bit integer in network byte order.
- *
- * Masking: Not maskable. */
-#define OXM_OF_ETH_TYPE   OXM_HEADER  (0x8000, OFPXMT_OFB_ETH_TYPE, 2)
-
-/* The VLAN id is 12-bits, so we can use the entire 16 bits to indicate
- * special conditions.
- */
-enum ofp_vlan_id {
-    OFPVID_PRESENT = 0x1000, /* Bit that indicate that a VLAN id is set */
-    OFPVID_NONE    = 0x0000, /* No VLAN id was set. */
-};
-/* Define for compatibility */
-#define OFP_VLAN_NONE      OFPVID_NONE
-
-/* 802.1Q VID.
- *
- * For a packet with an 802.1Q header, this is the VLAN-ID (VID) from the
- * outermost tag, with the CFI bit forced to 1. For a packet with no 802.1Q
- * header, this has value OFPVID_NONE.
- *
- * Prereqs: None.
- *
- * Format: 16-bit integer in network byte order with bit 13 indicating
- * presence of VLAN header and 3 most-significant bits forced to 0.
- * Only the lower 13 bits have meaning.
- *
- * Masking: Arbitrary masks.
- *
- * This field can be used in various ways:
- *
- *   - If it is not constrained at all, the nx_match matches packets without
- *     an 802.1Q header or with an 802.1Q header that has any VID value.
- *
- *   - Testing for an exact match with 0x0 matches only packets without
- *     an 802.1Q header.
- *
- *   - Testing for an exact match with a VID value with CFI=1 matches packets
- *     that have an 802.1Q header with a specified VID.
- *
- *   - Testing for an exact match with a nonzero VID value with CFI=0 does
- *     not make sense.  The switch may reject this combination.
- *
- *   - Testing with nxm_value=0, nxm_mask=0x0fff matches packets with no 802.1Q
- *     header or with an 802.1Q header with a VID of 0.
- *
- *   - 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  (0x8000, OFPXMT_OFB_VLAN_VID, 2)
-#define OXM_OF_VLAN_VID_W OXM_HEADER_W(0x8000, OFPXMT_OFB_VLAN_VID, 2)
-
-/* 802.1Q PCP.
- *
- * For a packet with an 802.1Q header, this is the VLAN-PCP from the
- * outermost tag.  For a packet with no 802.1Q header, this has value
- * 0.
- *
- * Prereqs: OXM_OF_VLAN_VID must be different from OFPVID_NONE.
- *
- * Format: 8-bit integer with 5 most-significant bits forced to 0.
- * Only the lower 3 bits have meaning.
- *
- * Masking: Not maskable.
- */
-#define OXM_OF_VLAN_PCP   OXM_HEADER  (0x8000, OFPXMT_OFB_VLAN_PCP, 1)
-
-/* The Diff Serv Code Point (DSCP) bits of the IP header.
- * Part of the IPv4 ToS field or the IPv6 Traffic Class field.
- *
- * Prereqs: OXM_OF_ETH_TYPE must be either 0x0800 or 0x86dd.
- *
- * Format: 8-bit integer with 2 most-significant bits forced to 0.
- * Only the lower 6 bits have meaning.
- *
- * Masking: Not maskable. */
-#define OXM_OF_IP_DSCP     OXM_HEADER  (0x8000, OFPXMT_OFB_IP_DSCP, 1)
-
-/* The ECN bits of the IP header.
- * Part of the IPv4 ToS field or the IPv6 Traffic Class field.
- *
- * Prereqs: OXM_OF_ETH_TYPE must be either 0x0800 or 0x86dd.
- *
- * Format: 8-bit integer with 6 most-significant bits forced to 0.
- * Only the lower 2 bits have meaning.
- *
- * Masking: Not maskable. */
-#define OXM_OF_IP_ECN     OXM_HEADER  (0x8000, OFPXMT_OFB_IP_ECN, 1)
-
-/* The "protocol" byte in the IP header.
- *
- * Prereqs: OXM_OF_ETH_TYPE must be either 0x0800 or 0x86dd.
- *
- * Format: 8-bit integer.
- *
- * Masking: Not maskable. */
-#define OXM_OF_IP_PROTO   OXM_HEADER  (0x8000, OFPXMT_OFB_IP_PROTO, 1)
-
-/* The source or destination address in the IP header.
- *
- * Prereqs: OXM_OF_ETH_TYPE must match 0x0800 exactly.
- *
- * Format: 32-bit integer in network byte order.
- *
- * Masking: Arbitrary masks.
- */
-#define OXM_OF_IPV4_SRC     OXM_HEADER  (0x8000, OFPXMT_OFB_IPV4_SRC, 4)
-#define OXM_OF_IPV4_SRC_W   OXM_HEADER_W(0x8000, OFPXMT_OFB_IPV4_SRC, 4)
-#define OXM_OF_IPV4_DST     OXM_HEADER  (0x8000, OFPXMT_OFB_IPV4_DST, 4)
-#define OXM_OF_IPV4_DST_W   OXM_HEADER_W(0x8000, OFPXMT_OFB_IPV4_DST, 4)
-
-/* The source or destination port in the TCP header.
- *
- * Prereqs:
- *   OXM_OF_ETH_TYPE must be either 0x0800 or 0x86dd.
- *   OXM_OF_IP_PROTO must match 6 exactly.
- *
- * Format: 16-bit integer in network byte order.
- *
- * Masking: Not maskable. */
-#define OXM_OF_TCP_SRC    OXM_HEADER  (0x8000, OFPXMT_OFB_TCP_SRC, 2)
-#define OXM_OF_TCP_DST    OXM_HEADER  (0x8000, OFPXMT_OFB_TCP_DST, 2)
-
-/* The source or destination port in the UDP header.
- *
- * Prereqs:
- *   OXM_OF_ETH_TYPE must match either 0x0800 or 0x86dd.
- *   OXM_OF_IP_PROTO must match 17 exactly.
- *
- * Format: 16-bit integer in network byte order.
- *
- * Masking: Not maskable. */
-#define OXM_OF_UDP_SRC    OXM_HEADER  (0x8000, OFPXMT_OFB_UDP_SRC, 2)
-#define OXM_OF_UDP_DST    OXM_HEADER  (0x8000, OFPXMT_OFB_UDP_DST, 2)
-
-/* The source or destination port in the SCTP header.
- *
- * Prereqs:
- *   OXM_OF_ETH_TYPE must match either 0x0800 or 0x86dd.
- *   OXM_OF_IP_PROTO must match 132 exactly.
- *
- * Format: 16-bit integer in network byte order.
- *
- * Masking: Not maskable. */
-#define OXM_OF_SCTP_SRC   OXM_HEADER  (0x8000, OFPXMT_OFB_SCTP_SRC, 2)
-#define OXM_OF_SCTP_DST   OXM_HEADER  (0x8000, OFPXMT_OFB_SCTP_DST, 2)
-
-/* The type or code in the ICMP header.
- *
- * Prereqs:
- *   OXM_OF_ETH_TYPE must match 0x0800 exactly.
- *   OXM_OF_IP_PROTO must match 1 exactly.
- *
- * Format: 8-bit integer.
- *
- * Masking: Not maskable. */
-#define OXM_OF_ICMPV4_TYPE  OXM_HEADER  (0x8000, OFPXMT_OFB_ICMPV4_TYPE, 1)
-#define OXM_OF_ICMPV4_CODE  OXM_HEADER  (0x8000, OFPXMT_OFB_ICMPV4_CODE, 1)
-
-/* ARP opcode.
- *
- * For an Ethernet+IP ARP packet, the opcode in the ARP header.  Always 0
- * otherwise.
- *
- * Prereqs: OXM_OF_ETH_TYPE must match 0x0806 exactly.
- *
- * Format: 16-bit integer in network byte order.
- *
- * Masking: Not maskable. */
-#define OXM_OF_ARP_OP     OXM_HEADER  (0x8000, OFPXMT_OFB_ARP_OP, 2)
-
-/* For an Ethernet+IP ARP packet, the source or target protocol address
- * in the ARP header.  Always 0 otherwise.
- *
- * Prereqs: OXM_OF_ETH_TYPE must match 0x0806 exactly.
- *
- * Format: 32-bit integer in network byte order.
- *
- * Masking: Arbitrary masks.
- */
-#define OXM_OF_ARP_SPA    OXM_HEADER  (0x8000, OFPXMT_OFB_ARP_SPA, 4)
-#define OXM_OF_ARP_SPA_W  OXM_HEADER_W(0x8000, OFPXMT_OFB_ARP_SPA, 4)
-#define OXM_OF_ARP_TPA    OXM_HEADER  (0x8000, OFPXMT_OFB_ARP_TPA, 4)
-#define OXM_OF_ARP_TPA_W  OXM_HEADER_W(0x8000, OFPXMT_OFB_ARP_TPA, 4)
-
-/* For an Ethernet+IP ARP packet, the source or target hardware address
- * in the ARP header.  Always 0 otherwise.
- *
- * Prereqs: OXM_OF_ETH_TYPE must match 0x0806 exactly.
- *
- * Format: 48-bit Ethernet MAC address.
- *
- * Masking: Not maskable. */
-#define OXM_OF_ARP_SHA    OXM_HEADER  (0x8000, OFPXMT_OFB_ARP_SHA, 6)
-#define OXM_OF_ARP_THA    OXM_HEADER  (0x8000, OFPXMT_OFB_ARP_THA, 6)
-
-/* The source or destination address in the IPv6 header.
- *
- * Prereqs: OXM_OF_ETH_TYPE must match 0x86dd exactly.
- *
- * Format: 128-bit IPv6 address.
- *
- * Masking: Arbitrary masks.
- */
-#define OXM_OF_IPV6_SRC    OXM_HEADER  (0x8000, OFPXMT_OFB_IPV6_SRC, 16)
-#define OXM_OF_IPV6_SRC_W  OXM_HEADER_W(0x8000, OFPXMT_OFB_IPV6_SRC, 16)
-#define OXM_OF_IPV6_DST    OXM_HEADER  (0x8000, OFPXMT_OFB_IPV6_DST, 16)
-#define OXM_OF_IPV6_DST_W  OXM_HEADER_W(0x8000, OFPXMT_OFB_IPV6_DST, 16)
-
-/* The IPv6 Flow Label
- *
- * Prereqs:
- *   OXM_OF_ETH_TYPE must match 0x86dd exactly
- *
- * Format: 32-bit integer with 12 most-significant bits forced to 0.
- * Only the lower 20 bits have meaning.
- *
- * Masking: Maskable. */
-#define OXM_OF_IPV6_FLABEL   OXM_HEADER  (0x8000, OFPXMT_OFB_IPV6_FLABEL, 4)
-
-/* The type or code in the ICMPv6 header.
- *
- * Prereqs:
- *   OXM_OF_ETH_TYPE must match 0x86dd exactly.
- *   OXM_OF_IP_PROTO must match 58 exactly.
- *
- * Format: 8-bit integer.
- *
- * Masking: Not maskable. */
-#define OXM_OF_ICMPV6_TYPE OXM_HEADER  (0x8000, OFPXMT_OFB_ICMPV6_TYPE, 1)
-#define OXM_OF_ICMPV6_CODE OXM_HEADER  (0x8000, OFPXMT_OFB_ICMPV6_CODE, 1)
-
-/* The target address in an IPv6 Neighbor Discovery message.
- *
- * Prereqs:
- *   OXM_OF_ETH_TYPE must match 0x86dd exactly.
- *   OXM_OF_IP_PROTO must match 58 exactly.
- *   OXM_OF_ICMPV6_TYPE must be either 135 or 136.
- *
- * Format: 128-bit IPv6 address.
- *
- * Masking: Not maskable. */
-#define OXM_OF_IPV6_ND_TARGET OXM_HEADER (0x8000, OFPXMT_OFB_IPV6_ND_TARGET, 16)
-
-/* The source link-layer address option in an IPv6 Neighbor Discovery
- * message.
- *
- * Prereqs:
- *   OXM_OF_ETH_TYPE must match 0x86dd exactly.
- *   OXM_OF_IP_PROTO must match 58 exactly.
- *   OXM_OF_ICMPV6_TYPE must be exactly 135.
- *
- * Format: 48-bit Ethernet MAC address.
- *
- * Masking: Not maskable. */
-#define OXM_OF_IPV6_ND_SLL  OXM_HEADER  (0x8000, OFPXMT_OFB_IPV6_ND_SLL, 6)
-
-/* The target link-layer address option in an IPv6 Neighbor Discovery
- * message.
- *
- * Prereqs:
- *   OXM_OF_ETH_TYPE must match 0x86dd exactly.
- *   OXM_OF_IP_PROTO must match 58 exactly.
- *   OXM_OF_ICMPV6_TYPE must be exactly 136.
- *
- * Format: 48-bit Ethernet MAC address.
- *
- * Masking: Not maskable. */
-#define OXM_OF_IPV6_ND_TLL  OXM_HEADER  (0x8000, OFPXMT_OFB_IPV6_ND_TLL, 6)
-
-/* The LABEL in the first MPLS shim header.
- *
- * Prereqs:
- *   OXM_OF_ETH_TYPE must match 0x8847 or 0x8848 exactly.
- *
- * Format: 32-bit integer in network byte order with 12 most-significant
- * bits forced to 0. Only the lower 20 bits have meaning.
- *
- * Masking: Not maskable. */
-#define OXM_OF_MPLS_LABEL  OXM_HEADER  (0x8000, OFPXMT_OFB_MPLS_LABEL, 4)
-
-/* The TC in the first MPLS shim header.
- *
- * Prereqs:
- *   OXM_OF_ETH_TYPE must match 0x8847 or 0x8848 exactly.
- *
- * Format: 8-bit integer with 5 most-significant bits forced to 0.
- * Only the lower 3 bits have meaning.
- *
- * Masking: Not maskable. */
-#define OXM_OF_MPLS_TC     OXM_HEADER  (0x8000, OFPXMT_OFB_MPLS_TC, 1)
-
-/* The BoS bit in the first MPLS shim header.
- *
- * Prereqs:
- *   OXM_OF_ETH_TYPE must match 0x8847 or 0x8848 exactly.
- *
- * Format: 8-bit integer with 7 most-significant bits forced to 0.
- * Only the lowest bit have a meaning.
- *
- * Masking: Not maskable. */
-#define OXM_OF_MPLS_BOS     OXM_HEADER  (0x8000, OFPXMT_OFB_MPLS_BOS, 1)
-
-/* IEEE 802.1ah I-SID.
- *
- * For a packet with a PBB header, this is the I-SID from the
- * outermost service tag.
- *
- * Prereqs:
- *   OXM_OF_ETH_TYPE must match 0x88E7 exactly.
- *
- * Format: 24-bit integer in network byte order.
- *
- * Masking: Arbitrary masks. */
-#define OXM_OF_PBB_ISID   OXM_HEADER  (0x8000, OFPXMT_OFB_PBB_ISID, 3)
-#define OXM_OF_PBB_ISID_W OXM_HEADER_W(0x8000, OFPXMT_OFB_PBB_ISID, 3)
-
-/* Logical Port Metadata.
- *
- * Metadata associated with a logical port.
- * If the logical port performs encapsulation and decapsulation, this
- * is the demultiplexing field from the encapsulation header.
- * For example, for a packet received via GRE tunnel including a (32-bit) key,
- * the key is stored in the low 32-bits and the high bits are zeroed.
- * For a MPLS logical port, the low 20 bits represent the MPLS Label.
- * For a VxLAN logical port, the low 24 bits represent the VNI.
- * If the packet is not received through a logical port, the value is 0.
- *
- * Prereqs: None.
- *
- * Format: 64-bit integer in network byte order.
- *
- * Masking: Arbitrary masks. */
-#define OXM_OF_TUNNEL_ID    OXM_HEADER  (0x8000, OFPXMT_OFB_TUNNEL_ID, 8)
-#define OXM_OF_TUNNEL_ID_W  OXM_HEADER_W(0x8000, OFPXMT_OFB_TUNNEL_ID, 8)
-
-/* The IPv6 Extension Header pseudo-field.
- *
- * Prereqs:
- *   OXM_OF_ETH_TYPE must match 0x86dd exactly
- *
- * Format: 16-bit integer with 7 most-significant bits forced to 0.
- * Only the lower 9 bits have meaning.
- *
- * Masking: Maskable. */
-#define OXM_OF_IPV6_EXTHDR   OXM_HEADER  (0x8000, OFPXMT_OFB_IPV6_EXTHDR, 2)
-#define OXM_OF_IPV6_EXTHDR_W OXM_HEADER_W(0x8000, OFPXMT_OFB_IPV6_EXTHDR, 2)
-
-/* Bit definitions for IPv6 Extension Header pseudo-field. */
-enum ofp_ipv6exthdr_flags {      
-    OFPIEH_NONEXT = 1 << 0,     /* "No next header" encountered. */
-    OFPIEH_ESP    = 1 << 1,     /* Encrypted Sec Payload header present. */
-    OFPIEH_AUTH   = 1 << 2,     /* Authentication header present. */
-    OFPIEH_DEST   = 1 << 3,     /* 1 or 2 dest headers present. */
-    OFPIEH_FRAG   = 1 << 4,     /* Fragment header present. */
-    OFPIEH_ROUTER = 1 << 5,     /* Router header present. */
-    OFPIEH_HOP    = 1 << 6,     /* Hop-by-hop header present. */
-    OFPIEH_UNREP  = 1 << 7,     /* Unexpected repeats encountered. */
-    OFPIEH_UNSEQ  = 1 << 8,     /* Unexpected sequencing encountered. */
-};
-
-/* 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_oxm_experimenter_header) == 8);
-
-/* ## ----------------- ## */
-/* ## OpenFlow Actions. ## */
-/* ## ----------------- ## */
-
-enum ofp_action_type {
-    OFPAT_OUTPUT       = 0,  /* Output to switch port. */
-    OFPAT_COPY_TTL_OUT = 11, /* Copy TTL "outwards" -- from next-to-outermost
-                                to outermost */
-    OFPAT_COPY_TTL_IN  = 12, /* Copy TTL "inwards" -- from outermost to
-                               next-to-outermost */
-    OFPAT_SET_MPLS_TTL = 15, /* MPLS TTL */
-    OFPAT_DEC_MPLS_TTL = 16, /* Decrement MPLS TTL */
-
-    OFPAT_PUSH_VLAN    = 17, /* Push a new VLAN tag */
-    OFPAT_POP_VLAN     = 18, /* Pop the outer VLAN tag */
-    OFPAT_PUSH_MPLS    = 19, /* Push a new MPLS tag */
-    OFPAT_POP_MPLS     = 20, /* Pop the outer MPLS tag */
-    OFPAT_SET_QUEUE    = 21, /* Set queue id when outputting to a port */
-    OFPAT_GROUP        = 22, /* Apply group. */
-    OFPAT_SET_NW_TTL   = 23, /* IP TTL. */
-    OFPAT_DEC_NW_TTL   = 24, /* Decrement IP TTL. */
-    OFPAT_SET_FIELD    = 25, /* Set a header field using OXM TLV format. */
-    OFPAT_PUSH_PBB     = 26, /* Push a new PBB service tag (I-TAG) */
-    OFPAT_POP_PBB      = 27, /* Pop the outer PBB service tag (I-TAG) */
-    OFPAT_EXPERIMENTER = 0xffff
-};
-
-/* Action header that is common to all actions.  The length includes the
- * header and any padding used to make the action 64-bit aligned.
- * NB: The length of an action *must* always be a multiple of eight. */
-struct ofp_action_header {
-    uint16_t type;                  /* One of OFPAT_*. */
-    uint16_t len;                   /* Length of action, including this
-                                       header.  This is the length of action,
-                                       including any padding to make it
-                                       64-bit aligned. */
-    uint8_t pad[4];
-};
-OFP_ASSERT(sizeof(struct ofp_action_header) == 8);
-
-enum ofp_controller_max_len {
-	OFPCML_MAX       = 0xffe5, /* maximum max_len value which can be used
-	                              to request a specific byte length. */
-	OFPCML_NO_BUFFER = 0xffff  /* indicates that no buffering should be
-	                              applied and the whole packet is to be
-	                              sent to the controller. */
-};
-
-/* Action structure for OFPAT_OUTPUT, which sends packets out 'port'.
- * When the 'port' is the OFPP_CONTROLLER, 'max_len' indicates the max
- * number of bytes to send.  A 'max_len' of zero means no bytes of the
- * packet should be sent. A 'max_len' of OFPCML_NO_BUFFER means that
- * the packet is not buffered and the complete packet is to be sent to
- * the controller. */
-struct ofp_action_output {
-    uint16_t type;                  /* OFPAT_OUTPUT. */
-    uint16_t len;                   /* Length is 16. */
-    uint32_t port;                  /* Output port. */
-    uint16_t max_len;               /* Max length to send to controller. */
-    uint8_t pad[6];                 /* Pad to 64 bits. */
-};
-OFP_ASSERT(sizeof(struct ofp_action_output) == 16);
-
-/* Action structure for OFPAT_SET_MPLS_TTL. */
-struct ofp_action_mpls_ttl {
-    uint16_t type;                  /* OFPAT_SET_MPLS_TTL. */
-    uint16_t len;                   /* Length is 8. */
-    uint8_t mpls_ttl;               /* MPLS TTL */
-    uint8_t pad[3];
-};
-OFP_ASSERT(sizeof(struct ofp_action_mpls_ttl) == 8);
-
-/* Action structure for OFPAT_PUSH_VLAN/MPLS/PBB. */
-struct ofp_action_push {
-    uint16_t type;                  /* OFPAT_PUSH_VLAN/MPLS/PBB. */
-    uint16_t len;                   /* Length is 8. */
-    uint16_t ethertype;             /* Ethertype */
-    uint8_t pad[2];
-};
-OFP_ASSERT(sizeof(struct ofp_action_push) == 8);
-
-/* Action structure for OFPAT_POP_MPLS. */
-struct ofp_action_pop_mpls {
-    uint16_t type;                  /* OFPAT_POP_MPLS. */
-    uint16_t len;                   /* Length is 8. */
-    uint16_t ethertype;             /* Ethertype */
-    uint8_t pad[2];
-};
-OFP_ASSERT(sizeof(struct ofp_action_pop_mpls) == 8);
-
-/* Action structure for OFPAT_GROUP. */
-struct ofp_action_group {
-    uint16_t type;                  /* OFPAT_GROUP. */
-    uint16_t len;                   /* Length is 8. */
-    uint32_t group_id;              /* Group identifier. */
-};
-OFP_ASSERT(sizeof(struct ofp_action_group) == 8);
-
-/* Action structure for OFPAT_SET_NW_TTL. */
-struct ofp_action_nw_ttl {
-    uint16_t type;                  /* OFPAT_SET_NW_TTL. */
-    uint16_t len;                   /* Length is 8. */
-    uint8_t nw_ttl;                 /* IP TTL */
-    uint8_t pad[3];
-};
-OFP_ASSERT(sizeof(struct ofp_action_nw_ttl) == 8);
-
-/* Action structure for OFPAT_SET_FIELD. */
-struct ofp_action_set_field {
-    uint16_t type;                  /* OFPAT_SET_FIELD. */
-    uint16_t len;                   /* Length is padded to 64 bits. */
-    /* Followed by:
-     *   - Exactly oxm_len bytes containing a single OXM TLV, then
-     *   - Exactly ((oxm_len + 4) + 7)/8*8 - (oxm_len + 4) (between 0 and 7)
-     *     bytes of all-zero bytes
-     */
-    uint8_t field[4];               /* OXM TLV - Make compiler happy */
-};
-OFP_ASSERT(sizeof(struct ofp_action_set_field) == 8);
-
-/* Action header for OFPAT_EXPERIMENTER.
- * The rest of the body is experimenter-defined. */
-struct ofp_action_experimenter_header {
-    uint16_t type;                  /* OFPAT_EXPERIMENTER. */
-    uint16_t len;                   /* Length is a multiple of 8. */
-    uint32_t experimenter;          /* Experimenter ID which takes the same
-                                       form as in struct
-                                       ofp_experimenter_header. */
-};
-OFP_ASSERT(sizeof(struct ofp_action_experimenter_header) == 8);
-
-/* ## ---------------------- ## */
-/* ## OpenFlow Instructions. ## */
-/* ## ---------------------- ## */
-
-enum ofp_instruction_type {
-    OFPIT_GOTO_TABLE = 1,       /* Setup the next table in the lookup
-                                   pipeline */
-    OFPIT_WRITE_METADATA = 2,   /* Setup the metadata field for use later in
-                                   pipeline */
-    OFPIT_WRITE_ACTIONS = 3,    /* Write the action(s) onto the datapath action
-                                   set */
-    OFPIT_APPLY_ACTIONS = 4,    /* Applies the action(s) immediately */
-    OFPIT_CLEAR_ACTIONS = 5,    /* Clears all actions from the datapath
-                                   action set */
-    OFPIT_METER = 6,            /* Apply meter (rate limiter) */
-
-    OFPIT_EXPERIMENTER = 0xFFFF  /* Experimenter instruction */
-};
-
-/* Instruction header that is common to all instructions.  The length includes
- * the header and any padding used to make the instruction 64-bit aligned.
- * NB: The length of an instruction *must* always be a multiple of eight. */
-struct ofp_instruction {
-    uint16_t type;                /* Instruction type */
-    uint16_t len;                 /* Length of this struct in bytes. */
-};
-OFP_ASSERT(sizeof(struct ofp_instruction) == 4);
-
-/* Instruction structure for OFPIT_GOTO_TABLE */
-struct ofp_instruction_goto_table {
-    uint16_t type;                /* OFPIT_GOTO_TABLE */
-    uint16_t len;                 /* Length of this struct in bytes. */
-    uint8_t table_id;             /* Set next table in the lookup pipeline */
-    uint8_t pad[3];               /* Pad to 64 bits. */
-};
-OFP_ASSERT(sizeof(struct ofp_instruction_goto_table) == 8);
-
-/* Instruction structure for OFPIT_WRITE_METADATA */
-struct ofp_instruction_write_metadata {
-    uint16_t type;                /* OFPIT_WRITE_METADATA */
-    uint16_t len;                 /* Length of this struct in bytes. */
-    uint8_t pad[4];               /* Align to 64-bits */
-    uint64_t metadata;            /* Metadata value to write */
-    uint64_t metadata_mask;       /* Metadata write bitmask */
-};
-OFP_ASSERT(sizeof(struct ofp_instruction_write_metadata) == 24);
-
-/* Instruction structure for OFPIT_WRITE/APPLY/CLEAR_ACTIONS */
-struct ofp_instruction_actions {
-    uint16_t type;              /* One of OFPIT_*_ACTIONS */
-    uint16_t len;               /* Length of this struct in bytes. */
-    uint8_t pad[4];             /* Align to 64-bits */
-    struct ofp_action_header actions[0];  /* Actions associated with
-                                             OFPIT_WRITE_ACTIONS and
-                                             OFPIT_APPLY_ACTIONS */
-};
-OFP_ASSERT(sizeof(struct ofp_instruction_actions) == 8);
-
-/* Instruction structure for OFPIT_METER */
-struct ofp_instruction_meter {
-    uint16_t type;                /* OFPIT_METER */
-    uint16_t len;                 /* Length is 8. */
-    uint32_t meter_id;            /* Meter instance. */
-};
-OFP_ASSERT(sizeof(struct ofp_instruction_meter) == 8);
-
-/* Instruction structure for experimental instructions */
-struct ofp_instruction_experimenter {
-    uint16_t type;		/* OFPIT_EXPERIMENTER */
-    uint16_t len;               /* Length of this struct in bytes */
-    uint32_t experimenter;      /* Experimenter ID which takes the same form
-                                   as in struct ofp_experimenter_header. */
-    /* Experimenter-defined arbitrary additional data. */
-};
-OFP_ASSERT(sizeof(struct ofp_instruction_experimenter) == 8);
-
-/* ## --------------------------- ## */
-/* ## OpenFlow Flow Modification. ## */
-/* ## --------------------------- ## */
-
-enum ofp_flow_mod_command {
-    OFPFC_ADD           = 0, /* New flow. */
-    OFPFC_MODIFY        = 1, /* Modify all matching flows. */
-    OFPFC_MODIFY_STRICT = 2, /* Modify entry strictly matching wildcards and
-                                priority. */
-    OFPFC_DELETE        = 3, /* Delete all matching flows. */
-    OFPFC_DELETE_STRICT = 4, /* Delete entry strictly matching wildcards and
-                                priority. */
-};
-
-/* Value used in "idle_timeout" and "hard_timeout" to indicate that the entry
- * is permanent. */
-#define OFP_FLOW_PERMANENT 0
-
-/* By default, choose a priority in the middle. */
-#define OFP_DEFAULT_PRIORITY 0x8000
-
-enum ofp_flow_mod_flags {
-    OFPFF_SEND_FLOW_REM = 1 << 0,  /* Send flow removed message when flow
-                                    * expires or is deleted. */
-    OFPFF_CHECK_OVERLAP = 1 << 1,  /* Check for overlapping entries first. */
-    OFPFF_RESET_COUNTS  = 1 << 2,  /* Reset flow packet and byte counts. */
-    OFPFF_NO_PKT_COUNTS = 1 << 3,  /* Don't keep track of packet count. */
-    OFPFF_NO_BYT_COUNTS = 1 << 4,  /* Don't keep track of byte count. */
-};
-
-/* Flow setup and teardown (controller -> datapath). */
-struct ofp_flow_mod {
-    struct ofp_header header;
-    uint64_t cookie;             /* Opaque controller-issued identifier. */
-    uint64_t cookie_mask;        /* Mask used to restrict the cookie bits
-                                    that must match when the command is
-                                    OFPFC_MODIFY* or OFPFC_DELETE*. A value
-                                    of 0 indicates no restriction. */
-
-    /* Flow actions. */
-    uint8_t table_id;             /* ID of the table to put the flow in.
-                                     For OFPFC_DELETE_* commands, OFPTT_ALL
-                                     can also be used to delete matching
-                                     flows from all tables. */
-    uint8_t command;              /* One of OFPFC_*. */
-    uint16_t idle_timeout;        /* Idle time before discarding (seconds). */
-    uint16_t hard_timeout;        /* Max time before discarding (seconds). */
-    uint16_t priority;            /* Priority level of flow entry. */
-    uint32_t buffer_id;           /* Buffered packet to apply to, or
-                                     OFP_NO_BUFFER.
-                                     Not meaningful for OFPFC_DELETE*. */
-    uint32_t out_port;            /* For OFPFC_DELETE* commands, require
-                                     matching entries to include this as an
-                                     output port.  A value of OFPP_ANY
-                                     indicates no restriction. */
-    uint32_t out_group;           /* For OFPFC_DELETE* commands, require
-                                     matching entries to include this as an
-                                     output group.  A value of OFPG_ANY
-                                     indicates no restriction. */
-    uint16_t flags;               /* One of OFPFF_*. */
-    uint8_t pad[2];
-    struct ofp_match match;       /* Fields to match. Variable size. */
-    //struct ofp_instruction instructions[0]; /* Instruction set */
-};
-OFP_ASSERT(sizeof(struct ofp_flow_mod) == 56);
-
-/* Group numbering. Groups can use any number up to OFPG_MAX. */
-enum ofp_group {
-    /* Last usable group number. */
-    OFPG_MAX        = 0xffffff00,
-
-    /* Fake groups. */
-    OFPG_ALL        = 0xfffffffc,  /* Represents all groups for group delete
-                                      commands. */
-    OFPG_ANY        = 0xffffffff   /* Wildcard group used only for flow stats
-                                      requests. Selects all flows regardless of
-                                      group (including flows with no group).
-                                      */
-};
-
-/* Group commands */
-enum ofp_group_mod_command {
-    OFPGC_ADD    = 0,       /* New group. */
-    OFPGC_MODIFY = 1,       /* Modify all matching groups. */
-    OFPGC_DELETE = 2,       /* Delete all matching groups. */
-};
-
-/* Bucket for use in groups. */
-struct ofp_bucket {
-    uint16_t len;                   /* Length the bucket in bytes, including
-                                       this header and any padding to make it
-                                       64-bit aligned. */
-    uint16_t weight;                /* Relative weight of bucket.  Only
-                                       defined for select groups. */
-    uint32_t watch_port;            /* Port whose state affects whether this
-                                       bucket is live.  Only required for fast
-                                       failover groups. */
-    uint32_t watch_group;           /* Group whose state affects whether this
-                                       bucket is live.  Only required for fast
-                                       failover groups. */
-    uint8_t pad[4];
-    struct ofp_action_header actions[0]; /* The action length is inferred
-                                           from the length field in the
-                                           header. */
-};
-OFP_ASSERT(sizeof(struct ofp_bucket) == 16);
-
-/* Group setup and teardown (controller -> datapath). */
-struct ofp_group_mod {
-    struct ofp_header header;
-    uint16_t command;             /* One of OFPGC_*. */
-    uint8_t type;                 /* One of OFPGT_*. */
-    uint8_t pad;                  /* Pad to 64 bits. */
-    uint32_t group_id;            /* Group identifier. */
-    struct ofp_bucket buckets[0]; /* The length of the bucket array is inferred
-                                     from the length field in the header. */
-};
-OFP_ASSERT(sizeof(struct ofp_group_mod) == 16);
-
-/* Group types.  Values in the range [128, 255] are reserved for experimental
- * use. */
-enum ofp_group_type {
-    OFPGT_ALL      = 0, /* All (multicast/broadcast) group.  */
-    OFPGT_SELECT   = 1, /* Select group. */
-    OFPGT_INDIRECT = 2, /* Indirect group. */
-    OFPGT_FF       = 3, /* Fast failover group. */
-};
-
-/* Special buffer-id to indicate 'no buffer' */
-#define OFP_NO_BUFFER 0xffffffff
-
-/* Send packet (controller -> datapath). */
-struct ofp_packet_out {
-    struct ofp_header header;
-    uint32_t buffer_id;           /* ID assigned by datapath (OFP_NO_BUFFER
-                                     if none). */
-    uint32_t in_port;             /* Packet's input port or OFPP_CONTROLLER. */
-    uint16_t actions_len;         /* Size of action array in bytes. */
-    uint8_t pad[6];
-    struct ofp_action_header actions[0]; /* Action list. */
-    /* uint8_t data[0]; */        /* Packet data.  The length is inferred
-                                     from the length field in the header.
-                                     (Only meaningful if buffer_id == -1.) */
-};
-OFP_ASSERT(sizeof(struct ofp_packet_out) == 24);
-
-/* Why is this packet being sent to the controller? */
-enum ofp_packet_in_reason {
-    OFPR_NO_MATCH    = 0,   /* No matching flow (table-miss flow entry). */
-    OFPR_ACTION      = 1,   /* Action explicitly output to controller. */
-    OFPR_INVALID_TTL = 2,   /* Packet has invalid TTL */
-};
-
-/* Packet received on port (datapath -> controller). */
-struct ofp_packet_in {
-    struct ofp_header header;
-    uint32_t buffer_id;     /* ID assigned by datapath. */
-    uint16_t total_len;     /* Full length of frame. */
-    uint8_t reason;         /* Reason packet is being sent (one of OFPR_*) */
-    uint8_t table_id;       /* ID of the table that was looked up */
-    uint64_t cookie;        /* Cookie of the flow entry that was looked up. */
-    struct ofp_match match; /* Packet metadata. Variable size. */
-    /* Followed by:
-     *   - Exactly 2 all-zero padding bytes, then
-     *   - An Ethernet frame whose length is inferred from header.length.
-     * The padding bytes preceding the Ethernet frame ensure that the IP
-     * header (if any) following the Ethernet header is 32-bit aligned.
-     */
-    //uint8_t pad[2];       /* Align to 64 bit + 16 bit */
-    //uint8_t data[0];      /* Ethernet frame */
-};
-OFP_ASSERT(sizeof(struct ofp_packet_in) == 32);
-
-/* Why was this flow removed? */
-enum ofp_flow_removed_reason {
-    OFPRR_IDLE_TIMEOUT = 0,     /* Flow idle time exceeded idle_timeout. */
-    OFPRR_HARD_TIMEOUT = 1,     /* Time exceeded hard_timeout. */
-    OFPRR_DELETE       = 2,     /* Evicted by a DELETE flow mod. */
-    OFPRR_GROUP_DELETE = 3,     /* Group was removed. */
-};
-
-/* Flow removed (datapath -> controller). */
-struct ofp_flow_removed {
-    struct ofp_header header;
-    uint64_t cookie;          /* Opaque controller-issued identifier. */
-
-    uint16_t priority;        /* Priority level of flow entry. */
-    uint8_t reason;           /* One of OFPRR_*. */
-    uint8_t table_id;         /* ID of the table */
-
-    uint32_t duration_sec;    /* Time flow was alive in seconds. */
-    uint32_t duration_nsec;   /* Time flow was alive in nanoseconds beyond
-                                 duration_sec. */
-    uint16_t idle_timeout;    /* Idle timeout from original flow mod. */
-    uint16_t hard_timeout;    /* Hard timeout from original flow mod. */
-    uint64_t packet_count;
-    uint64_t byte_count;
-    struct ofp_match match;   /* Description of fields. Variable size. */
-};
-OFP_ASSERT(sizeof(struct ofp_flow_removed) == 56);
-
-/* Meter numbering. Flow meters can use any number up to OFPM_MAX. */
-enum ofp_meter {
-    /* Last usable meter. */
-    OFPM_MAX        = 0xffff0000,
-
-    /* Virtual meters. */
-    OFPM_SLOWPATH   = 0xfffffffd,  /* Meter for slow datapath. */
-    OFPM_CONTROLLER = 0xfffffffe,  /* Meter for controller connection. */
-    OFPM_ALL        = 0xffffffff,  /* Represents all meters for stat requests
-                                      commands. */
-};
-
-/* Meter band types */
-enum ofp_meter_band_type {
-    OFPMBT_DROP            = 1,      /* Drop packet. */
-    OFPMBT_DSCP_REMARK     = 2,      /* Remark DSCP in the IP header. */
-    OFPMBT_EXPERIMENTER    = 0xFFFF  /* Experimenter meter band. */
-};
-
-/* Common header for all meter bands */
-struct ofp_meter_band_header {
-    uint16_t        type;    /* One of OFPMBT_*. */
-    uint16_t        len;     /* Length in bytes of this band. */
-    uint32_t        rate;    /* Rate for this band. */
-    uint32_t        burst_size; /* Size of bursts. */
-};
-OFP_ASSERT(sizeof(struct ofp_meter_band_header) == 12);
-
-/* OFPMBT_DROP band - drop packets */
-struct ofp_meter_band_drop {
-    uint16_t        type;    /* OFPMBT_DROP. */
-    uint16_t        len;     /* Length in bytes of this band. */
-    uint32_t        rate;    /* Rate for dropping packets. */
-    uint32_t        burst_size; /* Size of bursts. */
-    uint8_t         pad[4];
-};
-OFP_ASSERT(sizeof(struct ofp_meter_band_drop) == 16);
-
-/* OFPMBT_DSCP_REMARK band - Remark DSCP in the IP header */
-struct ofp_meter_band_dscp_remark {
-    uint16_t        type;    /* OFPMBT_DSCP_REMARK. */
-    uint16_t        len;     /* Length in bytes of this band. */
-    uint32_t        rate;    /* Rate for remarking packets. */
-    uint32_t        burst_size; /* Size of bursts. */
-    uint8_t         prec_level; /* Number of precendence level to substract. */
-    uint8_t         pad[3];
-};
-OFP_ASSERT(sizeof(struct ofp_meter_band_dscp_remark) == 16);
-
-/* OFPMBT_EXPERIMENTER band - Write actions in action set */
-struct ofp_meter_band_experimenter {
-    uint16_t        type;    /* One of OFPMBT_*. */
-    uint16_t        len;     /* Length in bytes of this band. */
-    uint32_t        rate;    /* Rate for this band. */
-    uint32_t        burst_size;   /* Size of bursts. */
-    uint32_t        experimenter; /* Experimenter ID which takes the same
-                                     form as in struct
-                                     ofp_experimenter_header. */
-};
-OFP_ASSERT(sizeof(struct ofp_meter_band_experimenter) == 16);
-
-/* Meter commands */
-enum ofp_meter_mod_command {
-    OFPMC_ADD,              /* New meter. */
-    OFPMC_MODIFY,           /* Modify specified meter. */
-    OFPMC_DELETE,           /* Delete specified meter. */
-};
-
-/* Meter configuration flags */
-enum ofp_meter_flags {
-    OFPMF_KBPS    = 1 << 0,     /* Rate value in kb/s (kilo-bit per second). */
-    OFPMF_PKTPS   = 1 << 1,     /* Rate value in packet/sec. */
-    OFPMF_BURST   = 1 << 2,     /* Do burst size. */
-    OFPMF_STATS   = 1 << 3,     /* Collect statistics. */
-};
-
-/* Meter configuration. OFPT_METER_MOD. */
-struct ofp_meter_mod {
-    struct ofp_header	header;
-    uint16_t            command;        /* One of OFPMC_*. */
-    uint16_t            flags;          /* One of OFPMF_*. */
-    uint32_t            meter_id;       /* Meter instance. */
-    struct ofp_meter_band_header bands[0]; /* The bands length is
-                                           inferred from the length field
-                                           in the header. */
-};
-OFP_ASSERT(sizeof(struct ofp_meter_mod) == 16);
-
-/* Values for 'type' in ofp_error_message.  These values are immutable: they
- * will not change in future versions of the protocol (although new values may
- * be added). */
-enum ofp_error_type {
-    OFPET_HELLO_FAILED         = 0,  /* Hello protocol failed. */
-    OFPET_BAD_REQUEST          = 1,  /* Request was not understood. */
-    OFPET_BAD_ACTION           = 2,  /* Error in action description. */
-    OFPET_BAD_INSTRUCTION      = 3,  /* Error in instruction list. */
-    OFPET_BAD_MATCH            = 4,  /* Error in match. */
-    OFPET_FLOW_MOD_FAILED      = 5,  /* Problem modifying flow entry. */
-    OFPET_GROUP_MOD_FAILED     = 6,  /* Problem modifying group entry. */
-    OFPET_PORT_MOD_FAILED      = 7,  /* Port mod request failed. */
-    OFPET_TABLE_MOD_FAILED     = 8,  /* Table mod request failed. */
-    OFPET_QUEUE_OP_FAILED      = 9,  /* Queue operation failed. */
-    OFPET_SWITCH_CONFIG_FAILED = 10, /* Switch config request failed. */
-    OFPET_ROLE_REQUEST_FAILED  = 11, /* Controller Role request failed. */
-    OFPET_METER_MOD_FAILED     = 12, /* Error in meter. */
-    OFPET_TABLE_FEATURES_FAILED = 13, /* Setting table features failed. */
-    OFPET_EXPERIMENTER = 0xffff      /* Experimenter error messages. */
-};
-
-/* ofp_error_msg 'code' values for OFPET_HELLO_FAILED.  'data' contains an
- * ASCII text string that may give failure details. */
-enum ofp_hello_failed_code {
-    OFPHFC_INCOMPATIBLE = 0,    /* No compatible version. */
-    OFPHFC_EPERM        = 1,    /* Permissions error. */
-};
-
-/* ofp_error_msg 'code' values for OFPET_BAD_REQUEST.  'data' contains at least
- * the first 64 bytes of the failed request. */
-enum ofp_bad_request_code {
-    OFPBRC_BAD_VERSION      = 0,  /* ofp_header.version not supported. */
-    OFPBRC_BAD_TYPE         = 1,  /* ofp_header.type not supported. */
-    OFPBRC_BAD_MULTIPART    = 2,  /* ofp_multipart_request.type not supported. */
-    OFPBRC_BAD_EXPERIMENTER = 3,  /* Experimenter id not supported
-                                   * (in ofp_experimenter_header or
-                                   * ofp_multipart_request or
-                                   * ofp_multipart_reply). */
-    OFPBRC_BAD_EXP_TYPE     = 4,  /* Experimenter type not supported. */
-    OFPBRC_EPERM            = 5,  /* Permissions error. */
-    OFPBRC_BAD_LEN          = 6,  /* Wrong request length for type. */
-    OFPBRC_BUFFER_EMPTY     = 7,  /* Specified buffer has already been used. */
-    OFPBRC_BUFFER_UNKNOWN   = 8,  /* Specified buffer does not exist. */
-    OFPBRC_BAD_TABLE_ID     = 9,  /* Specified table-id invalid or does not
-                                   * exist. */
-    OFPBRC_IS_SLAVE         = 10, /* Denied because controller is slave. */
-    OFPBRC_BAD_PORT         = 11, /* Invalid port. */
-    OFPBRC_BAD_PACKET       = 12, /* Invalid packet in packet-out. */
-    OFPBRC_MULTIPART_BUFFER_OVERFLOW    = 13, /* ofp_multipart_request
-                                     overflowed the assigned buffer. */
-};
-
-/* ofp_error_msg 'code' values for OFPET_BAD_ACTION.  'data' contains at least
- * the first 64 bytes of the failed request. */
-enum ofp_bad_action_code {
-    OFPBAC_BAD_TYPE           = 0,  /* Unknown action type. */
-    OFPBAC_BAD_LEN            = 1,  /* Length problem in actions. */
-    OFPBAC_BAD_EXPERIMENTER   = 2,  /* Unknown experimenter id specified. */
-    OFPBAC_BAD_EXP_TYPE       = 3,  /* Unknown action for experimenter id. */
-    OFPBAC_BAD_OUT_PORT       = 4,  /* Problem validating output port. */
-    OFPBAC_BAD_ARGUMENT       = 5,  /* Bad action argument. */
-    OFPBAC_EPERM              = 6,  /* Permissions error. */
-    OFPBAC_TOO_MANY           = 7,  /* Can't handle this many actions. */
-    OFPBAC_BAD_QUEUE          = 8,  /* Problem validating output queue. */
-    OFPBAC_BAD_OUT_GROUP      = 9,  /* Invalid group id in forward action. */
-    OFPBAC_MATCH_INCONSISTENT = 10, /* Action can't apply for this match,
-                                       or Set-Field missing prerequisite. */
-    OFPBAC_UNSUPPORTED_ORDER  = 11, /* Action order is unsupported for the
-                                 action list in an Apply-Actions instruction */
-    OFPBAC_BAD_TAG            = 12, /* Actions uses an unsupported
-                                       tag/encap. */
-    OFPBAC_BAD_SET_TYPE       = 13, /* Unsupported type in SET_FIELD action. */
-    OFPBAC_BAD_SET_LEN        = 14, /* Length problem in SET_FIELD action. */
-    OFPBAC_BAD_SET_ARGUMENT   = 15, /* Bad argument in SET_FIELD action. */
-};
-
-/* ofp_error_msg 'code' values for OFPET_BAD_INSTRUCTION.  'data' contains at least
- * the first 64 bytes of the failed request. */
-enum ofp_bad_instruction_code {
-    OFPBIC_UNKNOWN_INST     = 0, /* Unknown instruction. */
-    OFPBIC_UNSUP_INST       = 1, /* Switch or table does not support the
-                                    instruction. */
-    OFPBIC_BAD_TABLE_ID     = 2, /* Invalid Table-ID specified. */
-    OFPBIC_UNSUP_METADATA   = 3, /* Metadata value unsupported by datapath. */
-    OFPBIC_UNSUP_METADATA_MASK = 4, /* Metadata mask value unsupported by
-                                       datapath. */
-    OFPBIC_BAD_EXPERIMENTER = 5, /* Unknown experimenter id specified. */
-    OFPBIC_BAD_EXP_TYPE     = 6, /* Unknown instruction for experimenter id. */
-    OFPBIC_BAD_LEN          = 7, /* Length problem in instructions. */
-    OFPBIC_EPERM            = 8, /* Permissions error. */
-};
-
-/* ofp_error_msg 'code' values for OFPET_BAD_MATCH.  'data' contains at least
- * the first 64 bytes of the failed request. */
-enum ofp_bad_match_code {
-    OFPBMC_BAD_TYPE         = 0,  /* Unsupported match type specified by the
-                                     match */
-    OFPBMC_BAD_LEN          = 1,  /* Length problem in match. */
-    OFPBMC_BAD_TAG          = 2,  /* Match uses an unsupported tag/encap. */
-    OFPBMC_BAD_DL_ADDR_MASK = 3,  /* Unsupported datalink addr mask - switch
-                                     does not support arbitrary datalink
-                                     address mask. */
-    OFPBMC_BAD_NW_ADDR_MASK = 4,  /* Unsupported network addr mask - switch
-                                     does not support arbitrary network
-                                     address mask. */
-    OFPBMC_BAD_WILDCARDS    = 5,  /* Unsupported combination of fields masked
-                                     or omitted in the match. */
-    OFPBMC_BAD_FIELD        = 6,  /* Unsupported field type in the match. */
-    OFPBMC_BAD_VALUE        = 7,  /* Unsupported value in a match field. */
-    OFPBMC_BAD_MASK         = 8,  /* Unsupported mask specified in the match,
-                                     field is not dl-address or nw-address. */
-    OFPBMC_BAD_PREREQ       = 9,  /* A prerequisite was not met. */
-    OFPBMC_DUP_FIELD        = 10, /* A field type was duplicated. */
-    OFPBMC_EPERM            = 11, /* Permissions error. */
-};
-
-/* ofp_error_msg 'code' values for OFPET_FLOW_MOD_FAILED.  'data' contains
- * at least the first 64 bytes of the failed request. */
-enum ofp_flow_mod_failed_code {
-    OFPFMFC_UNKNOWN      = 0,   /* Unspecified error. */
-    OFPFMFC_TABLE_FULL   = 1,   /* Flow not added because table was full. */
-    OFPFMFC_BAD_TABLE_ID = 2,   /* Table does not exist */
-    OFPFMFC_OVERLAP      = 3,   /* Attempted to add overlapping flow with
-                                   CHECK_OVERLAP flag set. */
-    OFPFMFC_EPERM        = 4,   /* Permissions error. */
-    OFPFMFC_BAD_TIMEOUT  = 5,   /* Flow not added because of unsupported
-                                   idle/hard timeout. */
-    OFPFMFC_BAD_COMMAND  = 6,   /* Unsupported or unknown command. */
-    OFPFMFC_BAD_FLAGS    = 7,   /* Unsupported or unknown flags. */
-};
-
-/* ofp_error_msg 'code' values for OFPET_GROUP_MOD_FAILED.  'data' contains
- * at least the first 64 bytes of the failed request. */
-enum ofp_group_mod_failed_code {
-    OFPGMFC_GROUP_EXISTS         = 0,  /* Group not added because a group ADD
-                                          attempted to replace an
-                                          already-present group. */
-    OFPGMFC_INVALID_GROUP        = 1,  /* Group not added because Group
-                                          specified is invalid. */
-    OFPGMFC_WEIGHT_UNSUPPORTED   = 2,  /* Switch does not support unequal load
-                                          sharing with select groups. */
-    OFPGMFC_OUT_OF_GROUPS        = 3,  /* The group table is full. */
-    OFPGMFC_OUT_OF_BUCKETS       = 4,  /* The maximum number of action buckets
-                                          for a group has been exceeded. */
-    OFPGMFC_CHAINING_UNSUPPORTED = 5,  /* Switch does not support groups that
-                                          forward to groups. */
-    OFPGMFC_WATCH_UNSUPPORTED    = 6,  /* This group cannot watch the watch_port
-                                          or watch_group specified. */
-    OFPGMFC_LOOP                 = 7,  /* Group entry would cause a loop. */
-    OFPGMFC_UNKNOWN_GROUP        = 8,  /* Group not modified because a group
-                                          MODIFY attempted to modify a
-                                          non-existent group. */
-    OFPGMFC_CHAINED_GROUP        = 9,  /* Group not deleted because another
-                                          group is forwarding to it. */
-    OFPGMFC_BAD_TYPE             = 10, /* Unsupported or unknown group type. */
-    OFPGMFC_BAD_COMMAND          = 11, /* Unsupported or unknown command. */
-    OFPGMFC_BAD_BUCKET           = 12, /* Error in bucket. */
-    OFPGMFC_BAD_WATCH            = 13, /* Error in watch port/group. */
-    OFPGMFC_EPERM                = 14, /* Permissions error. */
-};
-
-/* ofp_error_msg 'code' values for OFPET_PORT_MOD_FAILED.  'data' contains
- * at least the first 64 bytes of the failed request. */
-enum ofp_port_mod_failed_code {
-    OFPPMFC_BAD_PORT      = 0,   /* Specified port number does not exist. */
-    OFPPMFC_BAD_HW_ADDR   = 1,   /* Specified hardware address does not
-                                  * match the port number. */
-    OFPPMFC_BAD_CONFIG    = 2,   /* Specified config is invalid. */
-    OFPPMFC_BAD_ADVERTISE = 3,   /* Specified advertise is invalid. */
-    OFPPMFC_EPERM         = 4,   /* Permissions error. */
-};
-
-/* ofp_error_msg 'code' values for OFPET_TABLE_MOD_FAILED.  'data' contains
- * at least the first 64 bytes of the failed request. */
-enum ofp_table_mod_failed_code {
-    OFPTMFC_BAD_TABLE  = 0,      /* Specified table does not exist. */
-    OFPTMFC_BAD_CONFIG = 1,      /* Specified config is invalid. */
-    OFPTMFC_EPERM      = 2,      /* Permissions error. */
-};
-
-/* ofp_error msg 'code' values for OFPET_QUEUE_OP_FAILED. 'data' contains
- * at least the first 64 bytes of the failed request */
-enum ofp_queue_op_failed_code {
-    OFPQOFC_BAD_PORT   = 0,     /* Invalid port (or port does not exist). */
-    OFPQOFC_BAD_QUEUE  = 1,     /* Queue does not exist. */
-    OFPQOFC_EPERM      = 2,     /* Permissions error. */
-};
-
-/* ofp_error_msg 'code' values for OFPET_SWITCH_CONFIG_FAILED. 'data' contains
- * at least the first 64 bytes of the failed request. */
-enum ofp_switch_config_failed_code {
-    OFPSCFC_BAD_FLAGS  = 0,      /* Specified flags is invalid. */
-    OFPSCFC_BAD_LEN    = 1,      /* Specified len is invalid. */
-    OFPSCFC_EPERM      = 2,      /* Permissions error. */
-};
-
-/* ofp_error_msg 'code' values for OFPET_ROLE_REQUEST_FAILED. 'data' contains
- * at least the first 64 bytes of the failed request. */
-enum ofp_role_request_failed_code {
-    OFPRRFC_STALE      = 0,      /* Stale Message: old generation_id. */
-    OFPRRFC_UNSUP      = 1,      /* Controller role change unsupported. */
-    OFPRRFC_BAD_ROLE   = 2,      /* Invalid role. */
-};
-
-/* ofp_error_msg 'code' values for OFPET_METER_MOD_FAILED.  'data' contains
- * at least the first 64 bytes of the failed request. */
-enum ofp_meter_mod_failed_code {
-    OFPMMFC_UNKNOWN       = 0,  /* Unspecified error. */
-    OFPMMFC_METER_EXISTS  = 1,  /* Meter not added because a Meter ADD
-                                 * attempted to replace an existing Meter. */
-    OFPMMFC_INVALID_METER = 2,      /* Meter not added because Meter specified
-                                 * is invalid. */
-    OFPMMFC_UNKNOWN_METER = 3,  /* Meter not modified because a Meter
-                                   MODIFY attempted to modify a non-existent
-                                   Meter. */
-    OFPMMFC_BAD_COMMAND   = 4,  /* Unsupported or unknown command. */
-    OFPMMFC_BAD_FLAGS     = 5,  /* Flag configuration unsupported. */
-    OFPMMFC_BAD_RATE      = 6,  /* Rate unsupported. */
-    OFPMMFC_BAD_BURST     = 7,  /* Burst size unsupported. */
-    OFPMMFC_BAD_BAND      = 8,  /* Band unsupported. */
-    OFPMMFC_BAD_BAND_VALUE = 9, /* Band value unsupported. */
-    OFPMMFC_OUT_OF_METERS = 10, /* No more meters available. */
-    OFPMMFC_OUT_OF_BANDS  = 11, /* The maximum number of properties
-                                 * for a meter has been exceeded. */
-};
-
-/* ofp_error_msg 'code' values for OFPET_TABLE_FEATURES_FAILED. 'data' contains
- * at least the first 64 bytes of the failed request. */
-enum ofp_table_features_failed_code {
-    OFPTFFC_BAD_TABLE    = 0,      /* Specified table does not exist. */
-    OFPTFFC_BAD_METADATA = 1,      /* Invalid metadata mask. */
-    OFPTFFC_BAD_TYPE     = 2,      /* Unknown property type. */
-    OFPTFFC_BAD_LEN      = 3,      /* Length problem in properties. */
-    OFPTFFC_BAD_ARGUMENT = 4,      /* Unsupported property value. */
-    OFPTFFC_EPERM        = 5,      /* Permissions error. */
-};
-
-/* OFPT_ERROR: Error message (datapath -> controller). */
-struct ofp_error_msg {
-    struct ofp_header header;
-
-    uint16_t type;
-    uint16_t code;
-    uint8_t data[0];          /* Variable-length data.  Interpreted based
-                                 on the type and code.  No padding. */
-};
-OFP_ASSERT(sizeof(struct ofp_error_msg) == 12);
-
-/* OFPET_EXPERIMENTER: Error message (datapath -> controller). */
-struct ofp_error_experimenter_msg {
-    struct ofp_header header;
-
-    uint16_t type;            /* OFPET_EXPERIMENTER. */
-    uint16_t exp_type;        /* Experimenter defined. */
-    uint32_t experimenter;    /* Experimenter ID which takes the same form
-                                 as in struct ofp_experimenter_header. */
-    uint8_t data[0];          /* Variable-length data.  Interpreted based
-                                 on the type and code.  No padding. */
-};
-OFP_ASSERT(sizeof(struct ofp_error_experimenter_msg) == 16);
-
-enum ofp_multipart_types {
-    /* Description of this OpenFlow switch.
-     * The request body is empty.
-     * The reply body is struct ofp_desc. */
-    OFPMP_DESC = 0,
-
-    /* Individual flow statistics.
-     * The request body is struct ofp_flow_stats_request.
-     * The reply body is an array of struct ofp_flow_stats. */
-    OFPMP_FLOW = 1,
-
-    /* Aggregate flow statistics.
-     * The request body is struct ofp_aggregate_stats_request.
-     * The reply body is struct ofp_aggregate_stats_reply. */
-    OFPMP_AGGREGATE = 2,
-
-    /* Flow table statistics.
-     * The request body is empty.
-     * The reply body is an array of struct ofp_table_stats. */
-    OFPMP_TABLE = 3,
-
-    /* Port statistics.
-     * The request body is struct ofp_port_stats_request.
-     * The reply body is an array of struct ofp_port_stats. */
-    OFPMP_PORT_STATS = 4,
-
-    /* Queue statistics for a port
-     * The request body is struct ofp_queue_stats_request.
-     * The reply body is an array of struct ofp_queue_stats */
-    OFPMP_QUEUE = 5,
-
-    /* Group counter statistics.
-     * The request body is struct ofp_group_stats_request.
-     * The reply is an array of struct ofp_group_stats. */
-    OFPMP_GROUP = 6,
-
-    /* Group description.
-     * The request body is empty.
-     * The reply body is an array of struct ofp_group_desc_stats. */
-    OFPMP_GROUP_DESC = 7,
-
-    /* Group features.
-     * The request body is empty.
-     * The reply body is struct ofp_group_features. */
-    OFPMP_GROUP_FEATURES = 8,
-
-    /* Meter statistics.
-     * The request body is struct ofp_meter_multipart_requests.
-     * The reply body is an array of struct ofp_meter_stats. */
-    OFPMP_METER = 9,
-
-    /* Meter configuration.
-     * The request body is struct ofp_meter_multipart_requests.
-     * The reply body is an array of struct ofp_meter_config. */
-    OFPMP_METER_CONFIG = 10,
-
-    /* Meter features.
-     * The request body is empty.
-     * The reply body is struct ofp_meter_features. */
-    OFPMP_METER_FEATURES = 11,
-
-    /* Table features.
-     * The request body is either empty or contains an array of
-     * struct ofp_table_features containing the controller's
-     * desired view of the switch. If the switch is unable to
-     * set the specified view an error is returned.
-     * The reply body is an array of struct ofp_table_features. */
-    OFPMP_TABLE_FEATURES = 12,
-
-    /* Port description.
-     * The request body is empty.
-     * The reply body is an array of struct ofp_port. */
-    OFPMP_PORT_DESC = 13,
-
-    /* Experimenter extension.
-     * The request and reply bodies begin with
-     * struct ofp_experimenter_multipart_header.
-     * The request and reply bodies are otherwise experimenter-defined. */
-    OFPMP_EXPERIMENTER = 0xffff
-};
-
-enum ofp_multipart_request_flags {
-    OFPMPF_REQ_MORE  = 1 << 0  /* More requests to follow. */
-};
-
-struct ofp_multipart_request {
-    struct ofp_header header;
-    uint16_t type;              /* One of the OFPMP_* constants. */
-    uint16_t flags;             /* OFPMPF_REQ_* flags. */
-    uint8_t pad[4];
-    uint8_t body[0];            /* Body of the request. */
-};
-OFP_ASSERT(sizeof(struct ofp_multipart_request) == 16);
-
-enum ofp_multipart_reply_flags {
-    OFPMPF_REPLY_MORE  = 1 << 0  /* More replies to follow. */
-};
-
-struct ofp_multipart_reply {
-    struct ofp_header header;
-    uint16_t type;              /* One of the OFPMP_* constants. */
-    uint16_t flags;             /* OFPMPF_REPLY_* flags. */
-    uint8_t pad[4];
-    uint8_t body[0];            /* Body of the reply. */
-};
-OFP_ASSERT(sizeof(struct ofp_multipart_reply) == 16);
-
-#define DESC_STR_LEN   256
-#define SERIAL_NUM_LEN 32
-/* Body of reply to OFPMP_DESC request.  Each entry is a NULL-terminated
- * ASCII string. */
-struct ofp_desc {
-    char mfr_desc[DESC_STR_LEN];       /* Manufacturer description. */
-    char hw_desc[DESC_STR_LEN];        /* Hardware description. */
-    char sw_desc[DESC_STR_LEN];        /* Software description. */
-    char serial_num[SERIAL_NUM_LEN];   /* Serial number. */
-    char dp_desc[DESC_STR_LEN];        /* Human readable description of datapath. */
-};
-OFP_ASSERT(sizeof(struct ofp_desc) == 1056);
-
-/* Body for ofp_multipart_request of type OFPMP_FLOW. */
-struct ofp_flow_stats_request {
-    uint8_t table_id;         /* ID of table to read (from ofp_table_stats),
-                                 OFPTT_ALL for all tables. */
-    uint8_t pad[3];           /* Align to 32 bits. */
-    uint32_t out_port;        /* Require matching entries to include this
-                                 as an output port.  A value of OFPP_ANY
-                                 indicates no restriction. */
-    uint32_t out_group;       /* Require matching entries to include this
-                                 as an output group.  A value of OFPG_ANY
-                                 indicates no restriction. */
-    uint8_t pad2[4];          /* Align to 64 bits. */
-    uint64_t cookie;          /* Require matching entries to contain this
-                                 cookie value */
-    uint64_t cookie_mask;     /* Mask used to restrict the cookie bits that
-                                 must match. A value of 0 indicates
-                                 no restriction. */
-    struct ofp_match match;   /* Fields to match. Variable size. */
-};
-OFP_ASSERT(sizeof(struct ofp_flow_stats_request) == 40);
-
-/* Body of reply to OFPMP_FLOW request. */
-struct ofp_flow_stats {
-    uint16_t length;          /* Length of this entry. */
-    uint8_t table_id;         /* ID of table flow came from. */
-    uint8_t pad;
-    uint32_t duration_sec;    /* Time flow has been alive in seconds. */
-    uint32_t duration_nsec;   /* Time flow has been alive in nanoseconds beyond
-                                 duration_sec. */
-    uint16_t priority;        /* Priority of the entry. */
-    uint16_t idle_timeout;    /* Number of seconds idle before expiration. */
-    uint16_t hard_timeout;    /* Number of seconds before expiration. */
-    uint16_t flags;           /* One of OFPFF_*. */
-    uint8_t pad2[4];          /* Align to 64-bits. */
-    uint64_t cookie;          /* Opaque controller-issued identifier. */
-    uint64_t packet_count;    /* Number of packets in flow. */
-    uint64_t byte_count;      /* Number of bytes in flow. */
-    struct ofp_match match;   /* Description of fields. Variable size. */
-    //struct ofp_instruction instructions[0]; /* Instruction set. */
-};
-OFP_ASSERT(sizeof(struct ofp_flow_stats) == 56);
-
-/* Body for ofp_multipart_request of type OFPMP_AGGREGATE. */
-struct ofp_aggregate_stats_request {
-    uint8_t table_id;         /* ID of table to read (from ofp_table_stats)
-                                 OFPTT_ALL for all tables. */
-    uint8_t pad[3];           /* Align to 32 bits. */
-    uint32_t out_port;        /* Require matching entries to include this
-                                 as an output port.  A value of OFPP_ANY
-                                 indicates no restriction. */
-    uint32_t out_group;       /* Require matching entries to include this
-                                 as an output group.  A value of OFPG_ANY
-                                 indicates no restriction. */
-    uint8_t pad2[4];          /* Align to 64 bits. */
-    uint64_t cookie;          /* Require matching entries to contain this
-                                 cookie value */
-    uint64_t cookie_mask;     /* Mask used to restrict the cookie bits that
-                                 must match. A value of 0 indicates
-                                 no restriction. */
-    struct ofp_match match;   /* Fields to match. Variable size. */
-};
-OFP_ASSERT(sizeof(struct ofp_aggregate_stats_request) == 40);
-
-/* Body of reply to OFPMP_AGGREGATE request. */
-struct ofp_aggregate_stats_reply {
-    uint64_t packet_count;    /* Number of packets in flows. */
-    uint64_t byte_count;      /* Number of bytes in flows. */
-    uint32_t flow_count;      /* Number of flows. */
-    uint8_t pad[4];           /* Align to 64 bits. */
-};
-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. */
-    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         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_INSTRUCTIONS,
-                                 OFPTFPT_INSTRUCTIONS_MISS. */
-    uint16_t         length;  /* Length in bytes of this property. */
-    /* Followed by:
-     *   - Exactly (length - 4) bytes containing the instruction ids, then
-     *   - Exactly (length + 7)/8*8 - (length) (between 0 and 7)
-     *     bytes of all-zero bytes */
-    struct ofp_instruction   instruction_ids[0];   /* List of instructions */
-};
-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_NEXT_TABLES,
-                                 OFPTFPT_NEXT_TABLES_MISS. */
-    uint16_t         length;  /* Length in bytes of this property. */
-    /* Followed by:
-     *   - 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];
-};
-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_WRITE_ACTIONS,
-                                 OFPTFPT_WRITE_ACTIONS_MISS,
-                                 OFPTFPT_APPLY_ACTIONS,
-                                 OFPTFPT_APPLY_ACTIONS_MISS. */
-    uint16_t         length;  /* Length in bytes of this property. */
-    /* Followed by:
-     *   - Exactly (length - 4) bytes containing the action_ids, then
-     *   - Exactly (length + 7)/8*8 - (length) (between 0 and 7)
-     *     bytes of all-zero bytes */
-    struct ofp_action_header  action_ids[0];      /* List of actions */
-};
-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_MATCH,
-                                 OFPTFPT_WILDCARDS,
-                                 OFPTFPT_WRITE_SETFIELD,
-                                 OFPTFPT_WRITE_SETFIELD_MISS,
-                                 OFPTFPT_APPLY_SETFIELD,
-                                 OFPTFPT_APPLY_SETFIELD_MISS. */
-    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_ids[0];   /* Array of OXM headers */
-};
-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_EXPERIMENTER,
-                                 OFPTFPT_EXPERIMENTER_MISS. */
-    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 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. */
-    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. */
-
-    /* Table Feature Property list */
-    struct ofp_table_feature_prop_header properties[0];
-};
-OFP_ASSERT(sizeof(struct ofp_table_features) == 64);
-
-/* Body of reply to OFPMP_TABLE request. */
-struct ofp_table_stats {
-    uint8_t table_id;        /* Identifier of table.  Lower numbered tables
-                                are consulted first. */
-    uint8_t pad[3];          /* Align to 32-bits. */
-    uint32_t active_count;   /* Number of active entries. */
-    uint64_t lookup_count;   /* Number of packets looked up in table. */
-    uint64_t matched_count;  /* Number of packets that hit table. */
-};
-OFP_ASSERT(sizeof(struct ofp_table_stats) == 24);
-
-/* Body for ofp_multipart_request of type OFPMP_PORT. */
-struct ofp_port_stats_request {
-    uint32_t port_no;        /* OFPMP_PORT message must request statistics
-                              * either for a single port (specified in
-                              * port_no) or for all ports (if port_no ==
-                              * OFPP_ANY). */
-    uint8_t pad[4];
-};
-OFP_ASSERT(sizeof(struct ofp_port_stats_request) == 8);
-
-/* Body of reply to OFPMP_PORT request. If a counter is unsupported, set
- * the field to all ones. */
-struct ofp_port_stats {
-    uint32_t port_no;
-    uint8_t pad[4];          /* Align to 64-bits. */
-    uint64_t rx_packets;     /* Number of received packets. */
-    uint64_t tx_packets;     /* Number of transmitted packets. */
-    uint64_t rx_bytes;       /* Number of received bytes. */
-    uint64_t tx_bytes;       /* Number of transmitted bytes. */
-    uint64_t rx_dropped;     /* Number of packets dropped by RX. */
-    uint64_t tx_dropped;     /* Number of packets dropped by TX. */
-    uint64_t rx_errors;      /* Number of receive errors.  This is a super-set
-                                of more specific receive errors and should be
-                                greater than or equal to the sum of all
-                                rx_*_err values. */
-    uint64_t tx_errors;      /* Number of transmit errors.  This is a super-set
-                                of more specific transmit errors and should be
-                                greater than or equal to the sum of all
-                                tx_*_err values (none currently defined.) */
-    uint64_t rx_frame_err;   /* Number of frame alignment errors. */
-    uint64_t rx_over_err;    /* Number of packets with RX overrun. */
-    uint64_t rx_crc_err;     /* Number of CRC errors. */
-    uint64_t collisions;     /* Number of collisions. */
-    uint32_t duration_sec;   /* Time port has been alive in seconds. */
-    uint32_t duration_nsec;  /* Time port has been alive in nanoseconds beyond
-                                duration_sec. */
-};
-OFP_ASSERT(sizeof(struct ofp_port_stats) == 112);
-
-/* Body of OFPMP_GROUP request. */
-struct ofp_group_stats_request {
-    uint32_t group_id;       /* All groups if OFPG_ALL. */
-    uint8_t pad[4];          /* Align to 64 bits. */
-};
-OFP_ASSERT(sizeof(struct ofp_group_stats_request) == 8);
-
-/* Used in group stats replies. */
-struct ofp_bucket_counter {
-    uint64_t packet_count;   /* Number of packets processed by bucket. */
-    uint64_t byte_count;     /* Number of bytes processed by bucket. */
-};
-OFP_ASSERT(sizeof(struct ofp_bucket_counter) == 16);
-
-/* Body of reply to OFPMP_GROUP request. */
-struct ofp_group_stats {
-    uint16_t length;         /* Length of this entry. */
-    uint8_t pad[2];          /* Align to 64 bits. */
-    uint32_t group_id;       /* Group identifier. */
-    uint32_t ref_count;      /* Number of flows or groups that directly forward
-                                to this group. */
-    uint8_t pad2[4];         /* Align to 64 bits. */
-    uint64_t packet_count;   /* Number of packets processed by group. */
-    uint64_t byte_count;     /* Number of bytes processed by group. */
-    uint32_t duration_sec;   /* Time group has been alive in seconds. */
-    uint32_t duration_nsec;  /* Time group has been alive in nanoseconds beyond
-                                duration_sec. */
-    struct ofp_bucket_counter bucket_stats[0];
-};
-OFP_ASSERT(sizeof(struct ofp_group_stats) == 40);
-
-/* Body of reply to OFPMP_GROUP_DESC request. */
-struct ofp_group_desc_stats {
-    uint16_t length;              /* Length of this entry. */
-    uint8_t type;                 /* One of OFPGT_*. */
-    uint8_t pad;                  /* Pad to 64 bits. */
-    uint32_t group_id;            /* Group identifier. */
-    struct ofp_bucket buckets[0];
-};
-OFP_ASSERT(sizeof(struct ofp_group_desc_stats) == 8);
-
-/* Group configuration flags */
-enum ofp_group_capabilities {
-    OFPGFC_SELECT_WEIGHT   = 1 << 0,  /* Support weight for select groups */
-    OFPGFC_SELECT_LIVENESS = 1 << 1,  /* Support liveness for select groups */
-    OFPGFC_CHAINING        = 1 << 2,  /* Support chaining groups */
-    OFPGFC_CHAINING_CHECKS = 1 << 3,  /* Check chaining for loops and delete */
-};
-
-/* Body of reply to OFPMP_GROUP_FEATURES request. Group features. */
-struct ofp_group_features {
-    uint32_t  types;           /* Bitmap of OFPGT_* values supported. */
-    uint32_t  capabilities;    /* Bitmap of OFPGFC_* capability supported. */
-    uint32_t  max_groups[4];   /* Maximum number of groups for each type. */
-    uint32_t  actions[4];      /* Bitmaps of OFPAT_* that are supported. */
-};
-OFP_ASSERT(sizeof(struct ofp_group_features) == 40);
-
-/* Body of OFPMP_METER and OFPMP_METER_CONFIG requests. */
-struct ofp_meter_multipart_request {
-    uint32_t meter_id;       /* Meter instance, or OFPM_ALL. */
-    uint8_t pad[4];          /* Align to 64 bits. */
-};
-OFP_ASSERT(sizeof(struct ofp_meter_multipart_request) == 8);
-
-/* Statistics for each meter band */
-struct ofp_meter_band_stats {
-    uint64_t        packet_band_count;   /* Number of packets in band. */
-    uint64_t        byte_band_count;     /* Number of bytes in band. */
-};
-OFP_ASSERT(sizeof(struct ofp_meter_band_stats) == 16);
-
-/* Body of reply to OFPMP_METER request. Meter statistics. */
-struct ofp_meter_stats {
-    uint32_t        meter_id;         /* Meter instance. */
-    uint16_t        len;              /* Length in bytes of this stats. */
-    uint8_t         pad[6];
-    uint32_t        flow_count;       /* Number of flows bound to meter. */
-    uint64_t        packet_in_count;  /* Number of packets in input. */
-    uint64_t        byte_in_count;    /* Number of bytes in input. */
-    uint32_t   duration_sec;  /* Time meter has been alive in seconds. */
-    uint32_t   duration_nsec; /* Time meter has been alive in nanoseconds beyond
-                                 duration_sec. */
-    struct ofp_meter_band_stats band_stats[0]; /* The band_stats length is
-                                         inferred from the length field. */
-};
-OFP_ASSERT(sizeof(struct ofp_meter_stats) == 40);
-
-/* Body of reply to OFPMP_METER_CONFIG request. Meter configuration. */
-struct ofp_meter_config {
-    uint16_t        length;           /* Length of this entry. */
-    uint16_t        flags;            /* All OFPMC_* that apply. */
-    uint32_t        meter_id;         /* Meter instance. */
-    struct ofp_meter_band_header bands[0]; /* The bands length is
-                                         inferred from the length field. */
-};
-OFP_ASSERT(sizeof(struct ofp_meter_config) == 8);
-
-/* Body of reply to OFPMP_METER_FEATURES request. Meter features. */
-struct ofp_meter_features {
-    uint32_t    max_meter;    /* Maximum number of meters. */
-    uint32_t    band_types;   /* Bitmaps of OFPMBT_* values supported. */
-    uint32_t    capabilities; /* Bitmaps of "ofp_meter_flags". */
-    uint8_t     max_bands;    /* Maximum bands per meters */
-    uint8_t     max_color;    /* Maximum color value */
-    uint8_t     pad[2];
-};
-OFP_ASSERT(sizeof(struct ofp_meter_features) == 16);
-
-/* Body for ofp_multipart_request/reply of type OFPMP_EXPERIMENTER. */
-struct ofp_experimenter_multipart_header {
-    uint32_t experimenter;    /* Experimenter ID which takes the same form
-                                 as in struct ofp_experimenter_header. */
-    uint32_t exp_type;        /* Experimenter defined. */
-    /* Experimenter-defined arbitrary additional data. */
-};
-OFP_ASSERT(sizeof(struct ofp_experimenter_multipart_header) == 8);
-
-/* Experimenter extension. */
-struct ofp_experimenter_header {
-    struct ofp_header header;   /* Type OFPT_EXPERIMENTER. */
-    uint32_t experimenter;      /* Experimenter ID:
-                                 * - MSB 0: low-order bytes are IEEE OUI.
-                                 * - MSB != 0: defined by ONF. */
-    uint32_t exp_type;          /* Experimenter defined. */
-    /* Experimenter-defined arbitrary additional data. */
-};
-OFP_ASSERT(sizeof(struct ofp_experimenter_header) == 16);
-
-/* All ones is used to indicate all queues in a port (for stats retrieval). */
-#define OFPQ_ALL      0xffffffff
-
-/* Min rate > 1000 means not configured. */
-#define OFPQ_MIN_RATE_UNCFG      0xffff
-
-/* Max rate > 1000 means not configured. */
-#define OFPQ_MAX_RATE_UNCFG      0xffff
-
-enum ofp_queue_properties {
-    OFPQT_MIN_RATE      = 1,      /* Minimum datarate guaranteed. */
-    OFPQT_MAX_RATE      = 2,      /* Maximum datarate. */
-    OFPQT_EXPERIMENTER  = 0xffff  /* Experimenter defined property. */
-};
-
-/* Common description for a queue. */
-struct ofp_queue_prop_header {
-    uint16_t property;    /* One of OFPQT_. */
-    uint16_t len;         /* Length of property, including this header. */
-    uint8_t pad[4];       /* 64-bit alignemnt. */
-};
-OFP_ASSERT(sizeof(struct ofp_queue_prop_header) == 8);
-
-/* Min-Rate queue property description. */
-struct ofp_queue_prop_min_rate {
-    struct ofp_queue_prop_header prop_header; /* prop: OFPQT_MIN, len: 16. */
-    uint16_t rate;        /* In 1/10 of a percent; >1000 -> disabled. */
-    uint8_t pad[6];       /* 64-bit alignment */
-};
-OFP_ASSERT(sizeof(struct ofp_queue_prop_min_rate) == 16);
-
-/* Max-Rate queue property description. */
-struct ofp_queue_prop_max_rate {
-    struct ofp_queue_prop_header prop_header; /* prop: OFPQT_MAX, len: 16. */
-    uint16_t rate;        /* In 1/10 of a percent; >1000 -> disabled. */
-    uint8_t pad[6];       /* 64-bit alignment */
-};
-OFP_ASSERT(sizeof(struct ofp_queue_prop_max_rate) == 16);
-
-/* Experimenter queue property description. */
-struct ofp_queue_prop_experimenter {
-    struct ofp_queue_prop_header prop_header; /* prop: OFPQT_EXPERIMENTER, len: 16. */
-    uint32_t experimenter;          /* Experimenter ID which takes the same
-                                       form as in struct
-                                       ofp_experimenter_header. */
-    uint8_t pad[4];       /* 64-bit alignment */
-    uint8_t data[0];      /* Experimenter defined data. */
-};
-OFP_ASSERT(sizeof(struct ofp_queue_prop_experimenter) == 16);
-
-/* Full description for a queue. */
-struct ofp_packet_queue {
-    uint32_t queue_id;     /* id for the specific queue. */
-    uint32_t port;         /* Port this queue is attached to. */
-    uint16_t len;          /* Length in bytes of this queue desc. */
-    uint8_t pad[6];        /* 64-bit alignment. */
-    struct ofp_queue_prop_header properties[0]; /* List of properties. */
-};
-OFP_ASSERT(sizeof(struct ofp_packet_queue) == 16);
-
-/* Query for port queue configuration. */
-struct ofp_queue_get_config_request {
-    struct ofp_header header;
-    uint32_t port;         /* Port to be queried. Should refer
-                              to a valid physical port (i.e. < OFPP_MAX),
-                              or OFPP_ANY to request all configured
-                              queues.*/
-    uint8_t pad[4];
-};
-OFP_ASSERT(sizeof(struct ofp_queue_get_config_request) == 16);
-
-/* Queue configuration for a given port. */
-struct ofp_queue_get_config_reply {
-    struct ofp_header header;
-    uint32_t port;
-    uint8_t pad[4];
-    struct ofp_packet_queue queues[0]; /* List of configured queues. */
-};
-OFP_ASSERT(sizeof(struct ofp_queue_get_config_reply) == 16);
-
-/* OFPAT_SET_QUEUE action struct: send packets to given queue on port. */
-struct ofp_action_set_queue {
-    uint16_t type;            /* OFPAT_SET_QUEUE. */
-    uint16_t len;             /* Len is 8. */
-    uint32_t queue_id;        /* Queue id for the packets. */
-};
-OFP_ASSERT(sizeof(struct ofp_action_set_queue) == 8);
-
-struct ofp_queue_stats_request {
-    uint32_t port_no;        /* All ports if OFPP_ANY. */
-    uint32_t queue_id;       /* All queues if OFPQ_ALL. */
-};
-OFP_ASSERT(sizeof(struct ofp_queue_stats_request) == 8);
-
-struct ofp_queue_stats {
-    uint32_t port_no;
-    uint32_t queue_id;       /* Queue i.d */
-    uint64_t tx_bytes;       /* Number of transmitted bytes. */
-    uint64_t tx_packets;     /* Number of transmitted packets. */
-    uint64_t tx_errors;      /* Number of packets dropped due to overrun. */
-    uint32_t duration_sec;   /* Time queue has been alive in seconds. */
-    uint32_t duration_nsec;  /* Time queue has been alive in nanoseconds beyond
-                                duration_sec. */
-};
-OFP_ASSERT(sizeof(struct ofp_queue_stats) == 40);
-
-/* Configures the "role" of the sending controller.  The default role is:
- *
- *    - Equal (NX_ROLE_EQUAL), which allows the controller access to all
- *      OpenFlow features. All controllers have equal responsibility.
- *
- * The other possible roles are a related pair:
- *
- *    - Master (NX_ROLE_MASTER) is equivalent to Equal, except that there may
- *      be at most one Master controller at a time: when a controller
- *      configures itself as Master, any existing Master is demoted to the
- *      Slave role.
- *
- *    - Slave (NX_ROLE_SLAVE) allows the controller read-only access to
- *      OpenFlow features.  In particular attempts to modify the flow table
- *      will be rejected with an OFPBRC_EPERM error.
- *
- *      Slave controllers do not receive OFPT_PACKET_IN or OFPT_FLOW_REMOVED
- *      messages, but they do receive OFPT_PORT_STATUS messages.
- */
-
-/* Controller roles. */
-enum ofp_controller_role {
-    OFPCR_ROLE_NOCHANGE = 0,    /* Don't change current role. */
-    OFPCR_ROLE_EQUAL    = 1,    /* Default role, full access. */
-    OFPCR_ROLE_MASTER   = 2,    /* Full access, at most one master. */
-    OFPCR_ROLE_SLAVE    = 3,    /* Read-only access. */
-};
-
-/* Role request and reply message. */
-struct ofp_role_request {
-    struct ofp_header header;   /* Type OFPT_ROLE_REQUEST/OFPT_ROLE_REPLY. */
-    uint32_t role;              /* One of NX_ROLE_*. */
-    uint8_t pad[4];             /* Align to 64 bits. */
-    uint64_t generation_id;     /* Master Election Generation Id */
-};
-OFP_ASSERT(sizeof(struct ofp_role_request) == 24);
-
-/* Asynchronous message configuration. */
-struct ofp_async_config {
-    struct ofp_header header;     /* OFPT_GET_ASYNC_REPLY or OFPT_SET_ASYNC. */
-    uint32_t packet_in_mask[2];   /* Bitmasks of OFPR_* values. */
-    uint32_t port_status_mask[2]; /* Bitmasks of OFPPR_* values. */
-    uint32_t flow_removed_mask[2];/* Bitmasks of OFPRR_* values. */
-};
-OFP_ASSERT(sizeof(struct ofp_async_config) == 32);
-
-#endif /* openflow/openflow.h */
diff --git a/loxi_front_end/c_parse_utils.py b/loxi_front_end/c_parse_utils.py
index f06904b..5e8d471 100644
--- a/loxi_front_end/c_parse_utils.py
+++ b/loxi_front_end/c_parse_utils.py
@@ -28,9 +28,6 @@
 ##
 # @brief Utilities related to parsing C files
 #
-import re
-import sys
-import os
 import of_g
 
 def type_dec_to_count_base(m_type):
@@ -52,115 +49,3 @@
     else:
         base_type = m_type
     return count, base_type
-
-def comment_remover(text):
-    """
-    Remove C and C++ comments from text
-    @param text Possibly multiline string of C code.
-
-    http://stackoverflow.com/questions/241327/python-snippet-to-remove-c-and-c-comments
-    """
-
-    def replacer(match):
-        s = match.group(0)
-        if s.startswith('/'):
-            return ""
-        else:
-            return s
-    pattern = re.compile(
-        r'//.*?$|/\*.*?\*/|\'(?:\\.|[^\\\'])*\'|"(?:\\.|[^\\"])*"',
-        re.DOTALL | re.MULTILINE
-    )
-    return re.sub(pattern, replacer, text)
-
-
-def clean_up_input(text):
-    text = comment_remover(text)
-    text_lines = text.splitlines()
-    all_lines = []
-    for line in text_lines:
-        line = re.sub("\t", " ", line) # get rid of tabs
-        line = re.sub(" +$", "", line) # Strip trailing blanks
-        if len(line):
-            all_lines.append(line)
-    text = "\n".join(all_lines)
-    return text
-
-def extract_structs(contents):
-    """
-    Extract the structures from raw C code input
-    @param contents The text of the original C code
-    """
-    contents = clean_up_input(contents)
-    struct_list = re.findall("struct .* \{[^}]+\};", contents)
-    return struct_list
-
-def extract_enums(contents):
-    """
-    Extract the enums from raw C code input
-    @param contents The text of the original C code
-    @return An array where each entry is an (unparsed) enum instance
-    """
-    contents = clean_up_input(contents)
-    enum_list = re.findall("enum .* \{[^}]+\};", contents)
-    return enum_list
-
-def extract_enum_vals(enum):
-    """
-    From a C enum, return a pair (name, values)
-    @param enum The C syntax enumeration
-    @returns (name, values), see below
-
-    name is the enum name
-    values is a list pairs (<ident>, <value>) where ident is the
-    identifier and value is the associated value.
-
-    The values are integers when possible, otherwise strings
-    """
-
-    rv_list = []
-    name = re.search("enum +(\w+)", enum).group(1)
-    lines = " ".join(enum.split("\n"))
-    body = re.search("\{(.+)\}", lines).group(1)
-    entries = body.split(",")
-    previous_value = -1
-    for m in entries:
-        if re.match(" *$", m): # Empty line
-            continue
-        # Parse with = first
-        search_obj = re.match(" +(\w+) *= *(.*) *", m)
-        if search_obj:  # Okay, had =
-            e_name = search_obj.group(1)
-            e_value = search_obj.group(2)
-        else: # No equals
-            search_obj = re.match(" +(\w+)", m)
-            if not search_obj:
-                sys.stderr.write("\nError extracting enum for %s, member %s\n"
-                                 % (name, m))
-                sys.exit(1)
-            e_name = search_obj.group(1)
-            e_value = previous_value + 1
-        rv_list.append([e_name, e_value])
-
-        if type(e_value) is type(0):
-            previous_value = e_value
-        else:
-            try:
-                previous_value = int(e_value, 0)
-            except ValueError:
-                pass
-    return (name, rv_list)
-
-def extract_defines(contents):
-    """
-    Returns a list of pairs (<identifier>, <value>) where
-    #define <ident> <value> appears in the file
-    """
-    rv_list = []
-    contents = clean_up_input(contents)
-    define_list = re.findall("\#define +[^ ]+ .*\n", contents, re.M)
-    for entry in define_list:
-        match_obj = re.match("#define +([^ ]+) +(.+)$", entry)
-        rv_list.append([match_obj.group(1),match_obj.group(2)])
-    return rv_list
-        
diff --git a/loxi_front_end/identifiers.py b/loxi_front_end/identifiers.py
index a4122ee..91c0e57 100644
--- a/loxi_front_end/identifiers.py
+++ b/loxi_front_end/identifiers.py
@@ -30,7 +30,6 @@
 #
 
 import sys
-import of_h_utils
 from generic_utils import *
 import of_g
 
@@ -38,48 +37,34 @@
 # The value to use when an identifier is not defined for a version
 UNDEFINED_IDENT_VALUE = 0
 
-def add_identifiers(all_idents, idents_by_group, version, contents):
-    """
-    Update all_idents with identifiers from an openflow.h header file
-    @param all_idents A dict, usually of_g.identifiers
-    @param idents_by_group A dict for mapping LOXI idents to groups,
-    usually of_g.identifiers_by_group
-    @param version The OF wire version
-    @param contents The contents of an openflow.h file
-    """
-
-    # Get the dictionary of enums from the file text
-    enum_dict = of_h_utils.get_enum_dict(version,
-                                         contents)
-    for name, info in enum_dict.items():
-
-        # info is a DotDict w/ keys ofp_name, ofp_group and value.
-        if name in all_idents:
-            all_idents[name]["values_by_version"][version] = info.value
-            if ((all_idents[name]["ofp_name"] != info.ofp_name or 
-                all_idents[name]["ofp_group"] != info.ofp_group) and
-                info.ofp_name.find("OFPP_") != 0):
-                log("""
+def add_identifier(name, ofp_name, ofp_group, value, version, all_idents, idents_by_group):
+    assert(isinstance(value, int))
+    if name in all_idents:
+        all_idents[name]["values_by_version"][version] = value
+        if ((all_idents[name]["ofp_name"] != ofp_name or
+            all_idents[name]["ofp_group"] != ofp_group) and
+            ofp_name.find("OFPP_") != 0):
+            log("""
 NOTE: Identifier %s has different ofp name or group in version %s
 From ofp name %s, group %s to name %s, group %s.
 This could indicate a name collision in LOXI identifier translation.
 """ % (name, str(version), all_idents[name]["ofp_name"],
-       all_idents[name]["ofp_group"], info.ofp_name, info.ofp_group))
-                # Update stuff assuming newer versions processed later
-                all_idents[name]["ofp_name"] = info.ofp_name
-                all_idents[name]["ofp_group"] = info.ofp_group
+    all_idents[name]["ofp_group"], ofp_name, ofp_group))
+            # Update stuff assuming newer versions processed later
+            all_idents[name]["ofp_name"] = ofp_name
+            all_idents[name]["ofp_group"] = ofp_group
 
-        else: # New name
-            all_idents[name] = dict(
-                values_by_version = {version:info.value},
-                common_value = info["value"],
-                ofp_name = info["ofp_name"],
-                ofp_group = info["ofp_group"]
-                )
-            if info["ofp_group"] not in idents_by_group:
-                idents_by_group[info["ofp_group"]] = []
-            if name not in idents_by_group[info["ofp_group"]]:
-                idents_by_group[info["ofp_group"]].append(name)
+    else: # New name
+        all_idents[name] = dict(
+            values_by_version = {version:value},
+            common_value = value,
+            ofp_name = ofp_name,
+            ofp_group = ofp_group
+            )
+        if ofp_group not in idents_by_group:
+            idents_by_group[ofp_group] = []
+        if name not in idents_by_group[ofp_group]:
+            idents_by_group[ofp_group].append(name)
 
 def all_versions_agree(all_idents, version_list, name):
     val_list = all_idents[name]["values_by_version"]
diff --git a/loxi_front_end/of_h_utils.py b/loxi_front_end/of_h_utils.py
deleted file mode 100644
index 26dbac1..0000000
--- a/loxi_front_end/of_h_utils.py
+++ /dev/null
@@ -1,157 +0,0 @@
-# Copyright 2013, Big Switch Networks, Inc.
-#
-# LoxiGen is licensed under the Eclipse Public License, version 1.0 (EPL), with
-# the following special exception:
-#
-# LOXI Exception
-#
-# As a special exception to the terms of the EPL, you may distribute libraries
-# generated by LoxiGen (LoxiGen Libraries) under the terms of your choice, provided
-# that copyright and licensing notices generated by LoxiGen are not altered or removed
-# from the LoxiGen Libraries and the notice provided below is (i) included in
-# the LoxiGen Libraries, if distributed in source code form and (ii) included in any
-# documentation for the LoxiGen Libraries, if distributed in binary form.
-#
-# Notice: "Copyright 2013, Big Switch Networks, Inc. This library was generated by the LoxiGen Compiler."
-#
-# You may not use this file except in compliance with the EPL or LOXI Exception. You may obtain
-# a copy of the EPL at:
-#
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# EPL for the specific language governing permissions and limitations
-# under the EPL.
-
-##
-# @brief Utilities related to processing OF header files
-#
-
-import re
-import sys
-import os
-import c_parse_utils
-import loxi_utils.py_utils as py_utils
-import translation
-from generic_utils import *
-import copy
-
-# Silently ignore idents matching any of these
-ignore_idents = [
-    "OFPXMT_OFB_", "OFPFMF_", "OXM_OF_", "OFPXMT_",
-    "OPENFLOW_OPENFLOW_H", "OFP_ASSERT", "OFP_PACKED", "OFP_VERSION"
-    ]
-
-def warn_unmapped_ident(ident, t_name="enum"):
-    for ignore_ident in ignore_idents:
-        if re.match(ignore_ident, ident):
-            return
-    log("Skipping ident %s. Did not map %s identifier to LOXI" %
-              (ident, t_name))
-
-def fixup_values(ident, value, version, ident_list):
-    """
-    Fix up values for LOXI reasons
-
-    Translate defintions that refer to other identifiers
-    This is really just needed for the special case of OFPFW in 1.0 and 1.1.
-
-    Also, LOXI is aware of the change in type of port numbers, so 
-    translate those here.
-    """
-    value_string = str(value).strip()
-    if ident.find("OFPP_") == 0 and version == of_g.VERSION_1_0:
-        value_string = "0x%x" % (int(value, 0) + 0xffff0000)
-
-    if ident == 'OFP_VLAN_NONE' and version > of_g.VERSION_1_0:
-        value_string = '0'
-
-    # Otherwise, if no reference to a wildcard value, all done
-    if value_string.find("OFPFW") < 0:
-        return value_string
-    for ident, id_value in ident_list.items():
-        id_value_string = "(" + str(id_value).strip() + ")"
-        # If the identifier has (, etc., ignore it; not handling params
-        if ident.find("(") >= 0:
-            continue
-        value_string = re.sub(ident, id_value_string, value_string)
-    return value_string
-
-def get_enum_dict(version, contents):
-    """
-    Given openflow.h input, create a dict for its enums
-    @param contents The raw contents of the C file
-
-    The dict returned is indexed by LOXI identifier.  Each entry is a
-    DotDict with three keys, value, ofp_name and ofp_group.  The value is an 
-    int value when possible, otherwise a string.  The ofp_name is the original
-    name from the openflow header file.  The ofp_group is the enum type.
-    """
-    rv_list = {}
-
-    version_ref = of_g.short_version_names[version]
-    enum_list = c_parse_utils.extract_enums(contents)
-    defines_list = c_parse_utils.extract_defines(contents)
-
-    # First generate a list of all original idents and values for translation
-    full_ident_list = {}
-
-    for enum in enum_list:
-        (name, values) = c_parse_utils.extract_enum_vals(enum)
-        for (ident, value) in values:
-            full_ident_list[ident] = str(value).strip()
-    for ident, value in defines_list:
-        full_ident_list[ident] = str(value).strip()
-
-    # Process enum idents
-    for enum in enum_list:
-        (name, values) = c_parse_utils.extract_enum_vals(enum)
-        for (ident, value) in values:
-            loxi_name = translation.loxi_name(ident)
-            if not loxi_name:
-                warn_unmapped_ident(ident)
-                continue
-            if loxi_name in rv_list:
-                sys.stderr.write("\nError: %s in ident list already\n" % 
-                                 loxi_name)
-                sys.exit(1)
-
-            value_str = fixup_values(ident, value, version, full_ident_list)
-            log("Adding LOXI identifier %s from name %s" % (loxi_name, ident))
-            rv_list[loxi_name] = py_utils.DotDict(dict(
-                ofp_name = ident,
-                ofp_group = name,
-                value = value_str))
-
-    for ident, value in defines_list:
-        loxi_name = translation.loxi_name(ident)
-        if not loxi_name:
-            warn_unmapped_ident(ident, "macro defn")
-            continue
-
-        value_str = fixup_values(ident, value, version, full_ident_list)
-        if loxi_name in rv_list:
-            if value_str != rv_list[loxi_name].value:
-                sys.stderr.write("""
-ERROR: IDENT COLLISION.  Version %s, LOXI Ident %s.
-New ofp_name %s, value %s.
-Previous ofp_name %s, value %s,
-""" % (version_ref, loxi_name, ident, value_str,
-       rv_list[loxi_name].ofp_name),  rv_list[loxi_name].value)
-                sys.exit(1)
-            else:
-                log("Ignoring redundant entry %s, mapping to %s" %
-                          (ident, loxi_name))
-
-        rv_list[loxi_name] = py_utils.DotDict(dict(
-                ofp_name = ident,
-                ofp_group = "macro_definitions",
-                value = value_str))
-
-    return rv_list
-
-
-
-
diff --git a/loxi_front_end/parser.py b/loxi_front_end/parser.py
index 6b0e1eb..d79dd3c 100644
--- a/loxi_front_end/parser.py
+++ b/loxi_front_end/parser.py
@@ -36,6 +36,10 @@
 tag = lambda name: P.Empty().setParseAction(P.replaceWith(name))
 
 word = P.Word(P.alphanums + '_')
+integer = (
+            P.Combine('0x' - P.Word('0123456789abcdefABCDEF') |
+            P.Word('0123456789'))
+          ).setParseAction(lambda x: int(x[0], 0))
 
 identifier = word.copy().setName("identifier")
 
@@ -51,11 +55,19 @@
          P.Group(P.ZeroOrMore(struct_member)) + \
          s('}') - s(';')
 
+# Enums
+enum_member = P.Group(identifier + s('=') + integer)
+enum_list = P.Forward()
+enum_list << enum_member + P.Optional(s(',') + P.Optional(enum_list))
+enum = kw('enum') - identifier - s('{') + \
+         P.Group(P.Optional(enum_list)) + \
+         s('}') - s(';')
+
 # Metadata
 metadata_key = P.Or(kw("version")).setName("metadata key")
 metadata = tag('metadata') + s('#') - metadata_key - word
 
-grammar = P.ZeroOrMore(P.Group(struct) | P.Group(metadata))
+grammar = P.ZeroOrMore(P.Group(struct) | P.Group(enum) | P.Group(metadata))
 grammar.ignore(P.cppStyleComment)
 
 def parse(src):
diff --git a/loxi_front_end/translation.py b/loxi_front_end/translation.py
index 84a9a35..c889a5f 100644
--- a/loxi_front_end/translation.py
+++ b/loxi_front_end/translation.py
@@ -117,6 +117,7 @@
         dict(OFPMPF_ = "OF_MULTIPART_FLAG_"),
         dict(OFPTFPT_ = "OF_TABLE_FEATURE_"),
         dict(OFPHET = "OF_HELLO_ELEM_TYPE_"),
+        dict(NX_ROLE_ = "OF_NICIRA_CONTROLLER_ROLE_"),
         ]
 
     for entry in rules:
diff --git a/loxigen.py b/loxigen.py
index d72e9e2..84afe76 100755
--- a/loxigen.py
+++ b/loxigen.py
@@ -80,11 +80,11 @@
 import loxi_front_end.oxm as oxm
 import loxi_front_end.type_maps as type_maps
 import loxi_utils.loxi_utils as loxi_utils
-import loxi_front_end.of_h_utils as of_h_utils
 import loxi_front_end.c_parse_utils as c_parse_utils
 import loxi_front_end.identifiers as identifiers
 import pyparsing
 import loxi_front_end.parser as parser
+import loxi_front_end.translation as translation
 
 from generic_utils import *
 
@@ -319,8 +319,6 @@
     @returns (wire_version, classes), where wire_version is the integer wire
     protocol number and classes is the dict of all classes processed from the
     file.
-
-    @todo Add support for parsing enums like we do structs
     """
 
     # Parse the input file
@@ -343,6 +341,10 @@
                 # Clone class into header class and add to list
                 ofinput.classes[name + "_header"] = members[:]
                 ofinput.ordered_classes.append(name + "_header")
+        if s[0] == 'enum':
+            name = s[1]
+            members = s[2]
+            ofinput.enums[name] = [(x[0], x[1]) for x in members]
         elif s[0] == 'metadata':
             if s[1] == 'version':
                 log("Found version: wire version " + s[2])
@@ -414,21 +416,6 @@
         of_g.unified[cls]["object_id"] = of_g.object_id
         of_g.object_id += 1
 
-def process_canonical_file(version, filename):
-    """
-    Read in contents of openflow.h file filename and process it
-    @param version The wire version number
-    @param filename The name of the openflow header file for this version
-
-    Updates of_g.identifiers dictionary.  See of_g.py
-    """
-    log("Processing canonical file %s, version %d" % (filename, version))
-    f = open(filename, 'r')
-    all_lines = f.readlines()
-    contents = " ".join(all_lines)
-    identifiers.add_identifiers(of_g.identifiers, of_g.identifiers_by_group,
-                                version, contents)
-
 
 def initialize_versions():
     """
@@ -464,6 +451,13 @@
             versions[version_name]['classes'].update(copy.deepcopy(ofinput.classes))
             of_g.ordered_classes[wire_version].extend(ofinput.ordered_classes)
 
+            for enum_name, members in ofinput.enums.items():
+                for member_name, value in members:
+                    identifiers.add_identifier(
+                        translation.loxi_name(member_name),
+                        member_name, enum_name, value, wire_version,
+                        of_g.identifiers, of_g.identifiers_by_group)
+
 def add_extra_classes():
     """
     Add classes that are generated by Python code instead of from the
@@ -584,12 +578,6 @@
 
     log("\nGenerating files for target language %s\n" % of_g.options.lang)
 
-    # Generate identifier code
-    for version in of_g.target_version_list:
-        version_tag = of_g.param_version_names[version]
-        filename = "%s/canonical/openflow.h-%s" % (root_dir, version_tag)
-        process_canonical_file(version, filename)
-
     initialize_versions()
     read_input()
     add_extra_classes()
diff --git a/of_g.py b/of_g.py
index 87da1c9..6c8144f 100644
--- a/of_g.py
+++ b/of_g.py
@@ -522,3 +522,4 @@
         self.wire_versions = set()
         self.classes = {}
         self.ordered_classes = []
+        self.enums = {}
diff --git a/openflow_input/nicira_role b/openflow_input/nicira_role
index 06d7c7f..caa2c1a 100644
--- a/openflow_input/nicira_role
+++ b/openflow_input/nicira_role
@@ -27,6 +27,12 @@
 
 #version 1
 
+enum ofp_nicira_controller_role {
+   NX_ROLE_OTHER = 0,
+   NX_ROLE_MASTER = 1,
+   NX_ROLE_SLAVE = 2,
+};
+
 struct ofp_nicira_controller_role_request {
     uint8_t version;
     uint8_t type;
diff --git a/openflow_input/standard-1.0 b/openflow_input/standard-1.0
index 943d840..c191b89 100644
--- a/openflow_input/standard-1.0
+++ b/openflow_input/standard-1.0
@@ -24,9 +24,278 @@
 // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 // EPL for the specific language governing permissions and limitations
 // under the EPL.
+//
+// Also derived from the OpenFlow header files which have these copyrights:
+// Copyright (c) 2008 The Board of Trustees of The Leland Stanford Junior University
+// Copyright (c) 2011, 2012 Open Networking Foundation
 
 #version 1
 
+enum macro_definitions {
+    OFP_MAX_TABLE_NAME_LEN = 32,
+    OFP_MAX_PORT_NAME_LEN = 16,
+
+    OFP_TCP_PORT = 6633,
+    OFP_SSL_PORT = 6633,
+
+    OFP_ETH_ALEN = 6,
+
+    OFP_DEFAULT_MISS_SEND_LEN = 128,
+
+    OFP_VLAN_NONE = 0xffff,
+
+    OFPFW_ICMP_TYPE = 0x40,
+    OFPFW_ICMP_CODE = 0x80,
+
+    OFP_DL_TYPE_ETH2_CUTOFF = 0x600,
+    OFP_DL_TYPE_NOT_ETH_TYPE = 0x5ff,
+
+    OFP_FLOW_PERMANENT = 0,
+
+    OFP_DEFAULT_PRIORITY = 0x8000,
+
+    DESC_STR_LEN = 256,
+    SERIAL_NUM_LEN = 32,
+
+    OFPQ_ALL = 0xffffffff,
+    OFPQ_MIN_RATE_UNCFG = 0xffff,
+};
+
+enum ofp_type {
+    OFPT_HELLO = 0,
+    OFPT_ERROR = 1,
+    OFPT_ECHO_REQUEST = 2,
+    OFPT_ECHO_REPLY = 3,
+    OFPT_VENDOR = 4,
+    OFPT_FEATURES_REQUEST = 5,
+    OFPT_FEATURES_REPLY = 6,
+    OFPT_GET_CONFIG_REQUEST = 7,
+    OFPT_GET_CONFIG_REPLY = 8,
+    OFPT_SET_CONFIG = 9,
+    OFPT_PACKET_IN = 10,
+    OFPT_FLOW_REMOVED = 11,
+    OFPT_PORT_STATUS = 12,
+    OFPT_PACKET_OUT = 13,
+    OFPT_FLOW_MOD = 14,
+    OFPT_PORT_MOD = 15,
+    OFPT_STATS_REQUEST = 16,
+    OFPT_STATS_REPLY = 17,
+    OFPT_BARRIER_REQUEST = 18,
+    OFPT_BARRIER_REPLY = 19,
+    OFPT_QUEUE_GET_CONFIG_REQUEST = 20,
+    OFPT_QUEUE_GET_CONFIG_REPLY = 21,
+};
+
+enum ofp_port_config {
+    OFPPC_PORT_DOWN = 0x1,
+    OFPPC_NO_STP = 0x2,
+    OFPPC_NO_RECV = 0x4,
+    OFPPC_NO_RECV_STP = 0x8,
+    OFPPC_NO_FLOOD = 0x10,
+    OFPPC_NO_FWD = 0x20,
+    OFPPC_NO_PACKET_IN = 0x40,
+};
+
+enum ofp_port_state {
+    OFPPS_STP_LISTEN = 0,
+    OFPPS_LINK_DOWN = 1,
+    OFPPS_STP_LEARN = 0x100,
+    OFPPS_STP_FORWARD = 0x200,
+    OFPPS_STP_BLOCK = 0x300,
+    OFPPS_STP_MASK = 0x300,
+};
+
+enum ofp_port {
+    OFPP_MAX = 0xffffff00,
+    OFPP_IN_PORT = 0xfffffff8,
+    OFPP_TABLE = 0xfffffff9,
+    OFPP_NORMAL = 0xfffffffa,
+    OFPP_FLOOD = 0xfffffffb,
+    OFPP_ALL = 0xfffffffc,
+    OFPP_CONTROLLER = 0xfffffffd,
+    OFPP_LOCAL = 0xfffffffe,
+    OFPP_NONE = 0xffffffff,
+};
+
+enum ofp_port_features {
+    OFPPF_10MB_HD = 0x1,
+    OFPPF_10MB_FD = 0x2,
+    OFPPF_100MB_HD = 0x4,
+    OFPPF_100MB_FD = 0x8,
+    OFPPF_1GB_HD = 0x10,
+    OFPPF_1GB_FD = 0x20,
+    OFPPF_10GB_FD = 0x40,
+    OFPPF_COPPER = 0x80,
+    OFPPF_FIBER = 0x100,
+    OFPPF_AUTONEG = 0x200,
+    OFPPF_PAUSE = 0x400,
+    OFPPF_PAUSE_ASYM = 0x800,
+};
+
+enum ofp_queue_properties {
+    OFPQT_NONE = 0,
+    OFPQT_MIN_RATE = 1,
+};
+
+enum ofp_flow_wildcards {
+    OFPFW_IN_PORT = 0x1,
+    OFPFW_DL_VLAN = 0x2,
+    OFPFW_DL_SRC = 0x4,
+    OFPFW_NW_DST_BITS = 0x6,
+    OFPFW_NW_SRC_BITS = 0x6,
+    OFPFW_NW_SRC_SHIFT = 0x8,
+    OFPFW_DL_DST = 0x8,
+    OFPFW_NW_DST_SHIFT = 0xe,
+    OFPFW_DL_TYPE = 0x10,
+    OFPFW_NW_PROTO = 0x20,
+    OFPFW_TP_SRC = 0x40,
+    OFPFW_TP_DST = 0x80,
+    OFPFW_NW_SRC_ALL = 0x2000,
+    OFPFW_NW_SRC_MASK = 0x3f00,
+    OFPFW_NW_DST_ALL = 0x80000,
+    OFPFW_NW_DST_MASK = 0xfc000,
+    OFPFW_DL_VLAN_PCP = 0x100000,
+    OFPFW_NW_TOS = 0x200000,
+    OFPFW_ALL = 0x3fffff,
+};
+
+enum ofp_action_type {
+    OFPAT_OUTPUT = 0,
+    OFPAT_SET_VLAN_VID = 1,
+    OFPAT_SET_VLAN_PCP = 2,
+    OFPAT_STRIP_VLAN = 3,
+    OFPAT_SET_DL_SRC = 4,
+    OFPAT_SET_DL_DST = 5,
+    OFPAT_SET_NW_SRC = 6,
+    OFPAT_SET_NW_DST = 7,
+    OFPAT_SET_NW_TOS = 8,
+    OFPAT_SET_TP_SRC = 9,
+    OFPAT_SET_TP_DST = 10,
+    OFPAT_ENQUEUE = 11,
+    OFPAT_VENDOR = 0xffff,
+};
+
+enum ofp_capabilities {
+    OFPC_FLOW_STATS = 0x1,
+    OFPC_TABLE_STATS = 0x2,
+    OFPC_PORT_STATS = 0x4,
+    OFPC_STP = 0x8,
+    OFPC_RESERVED = 0x10,
+    OFPC_IP_REASM = 0x20,
+    OFPC_QUEUE_STATS = 0x40,
+    OFPC_ARP_MATCH_IP = 0x80,
+};
+
+enum ofp_config_flags {
+    OFPC_FRAG_NORMAL = 0x0,
+    OFPC_FRAG_DROP = 0x1,
+    OFPC_FRAG_REASM = 0x2,
+    OFPC_FRAG_MASK = 0x3,
+};
+
+enum ofp_flow_mod_command {
+    OFPFC_ADD = 0,
+    OFPFC_MODIFY = 1,
+    OFPFC_MODIFY_STRICT = 2,
+    OFPFC_DELETE = 3,
+    OFPFC_DELETE_STRICT = 4,
+};
+
+enum ofp_flow_mod_flags {
+    OFPFF_SEND_FLOW_REM = 0x1,
+    OFPFF_CHECK_OVERLAP = 0x2,
+    OFPFF_EMERG = 0x4,
+};
+
+enum ofp_stats_reply_flags {
+    OFPSF_REPLY_MORE = 0x1,
+};
+
+enum ofp_stats_types {
+    OFPST_DESC = 0,
+    OFPST_FLOW = 1,
+    OFPST_AGGREGATE = 2,
+    OFPST_TABLE = 3,
+    OFPST_PORT = 4,
+    OFPST_QUEUE = 5,
+    OFPST_VENDOR = 0xffff,
+};
+
+enum ofp_packet_in_reason {
+    OFPR_NO_MATCH = 0,
+    OFPR_ACTION = 1,
+};
+
+enum ofp_flow_removed_reason {
+    OFPRR_IDLE_TIMEOUT = 0,
+    OFPRR_HARD_TIMEOUT = 1,
+    OFPRR_DELETE = 2,
+};
+
+enum ofp_port_reason {
+    OFPPR_ADD = 0,
+    OFPPR_DELETE = 1,
+    OFPPR_MODIFY = 2,
+};
+
+enum ofp_error_type {
+    OFPET_HELLO_FAILED = 0,
+    OFPET_BAD_REQUEST = 1,
+    OFPET_BAD_ACTION = 2,
+    OFPET_FLOW_MOD_FAILED = 3,
+    OFPET_PORT_MOD_FAILED = 4,
+    OFPET_QUEUE_OP_FAILED = 5,
+};
+
+enum ofp_hello_failed_code {
+    OFPHFC_INCOMPATIBLE = 0,
+    OFPHFC_EPERM = 1,
+};
+
+enum ofp_bad_request_code {
+    OFPBRC_BAD_VERSION = 0,
+    OFPBRC_BAD_TYPE = 1,
+    OFPBRC_BAD_STAT = 2,
+    OFPBRC_BAD_VENDOR = 3,
+    OFPBRC_BAD_SUBTYPE = 4,
+    OFPBRC_EPERM = 5,
+    OFPBRC_BAD_LEN = 6,
+    OFPBRC_BUFFER_EMPTY = 7,
+    OFPBRC_BUFFER_UNKNOWN = 8,
+};
+
+enum ofp_bad_action_code {
+    OFPBAC_BAD_TYPE = 0,
+    OFPBAC_BAD_LEN = 1,
+    OFPBAC_BAD_VENDOR = 2,
+    OFPBAC_BAD_VENDOR_TYPE = 3,
+    OFPBAC_BAD_OUT_PORT = 4,
+    OFPBAC_BAD_ARGUMENT = 5,
+    OFPBAC_EPERM = 6,
+    OFPBAC_TOO_MANY = 7,
+    OFPBAC_BAD_QUEUE = 8,
+};
+
+enum ofp_flow_mod_failed_code {
+    OFPFMFC_ALL_TABLES_FULL = 0,
+    OFPFMFC_OVERLAP = 1,
+    OFPFMFC_EPERM = 2,
+    OFPFMFC_BAD_EMERG_TIMEOUT = 3,
+    OFPFMFC_BAD_COMMAND = 4,
+    OFPFMFC_UNSUPPORTED = 5,
+};
+
+enum ofp_port_mod_failed_code {
+    OFPPMFC_BAD_PORT = 0,
+    OFPPMFC_BAD_HW_ADDR = 1,
+};
+
+enum ofp_queue_op_failed_code {
+    OFPQOFC_BAD_PORT = 0,
+    OFPQOFC_BAD_QUEUE = 1,
+    OFPQOFC_EPERM = 2,
+};
+
 struct ofp_header {
     uint8_t version;
     uint8_t type;
diff --git a/openflow_input/standard-1.1 b/openflow_input/standard-1.1
index 66a4425..1c551d2 100644
--- a/openflow_input/standard-1.1
+++ b/openflow_input/standard-1.1
@@ -24,9 +24,389 @@
 // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 // EPL for the specific language governing permissions and limitations
 // under the EPL.
+//
+// Also derived from the OpenFlow header files which have these copyrights:
+// Copyright (c) 2008 The Board of Trustees of The Leland Stanford Junior University
+// Copyright (c) 2011, 2012 Open Networking Foundation
 
 #version 2
 
+enum macro_definitions {
+    OFP_MAX_TABLE_NAME_LEN = 32,
+    OFP_MAX_PORT_NAME_LEN = 16,
+
+    OFP_TCP_PORT = 6633,
+    OFP_SSL_PORT = 6633,
+
+    OFP_ETH_ALEN = 6,
+
+    OFP_DEFAULT_MISS_SEND_LEN = 128,
+
+    OFPFW_ICMP_TYPE = 0x40,
+    OFPFW_ICMP_CODE = 0x80,
+
+    OFP_DL_TYPE_ETH2_CUTOFF = 0x600,
+    OFP_DL_TYPE_NOT_ETH_TYPE = 0x5ff,
+
+    OFP_VLAN_NONE = 0,
+
+    OFPMT_STANDARD_LENGTH = 88,
+
+    OFP_FLOW_PERMANENT = 0,
+
+    OFP_DEFAULT_PRIORITY = 0x8000,
+
+    DESC_STR_LEN = 256,
+    SERIAL_NUM_LEN = 32,
+
+    OFPQ_ALL = 0xffffffff,
+    OFPQ_MIN_RATE_UNCFG = 0xffff,
+};
+
+enum ofp_port {
+    OFPP_MAX = 0xffffff00,
+    OFPP_IN_PORT = 0xfffffff8,
+    OFPP_TABLE = 0xfffffff9,
+    OFPP_NORMAL = 0xfffffffa,
+    OFPP_FLOOD = 0xfffffffb,
+    OFPP_ALL = 0xfffffffc,
+    OFPP_CONTROLLER = 0xfffffffd,
+    OFPP_LOCAL = 0xfffffffe,
+};
+
+enum ofp_port_no {
+    OFPP_ANY = 0xffffffff,
+};
+
+enum ofp_type {
+    OFPT_HELLO = 0,
+    OFPT_ERROR = 1,
+    OFPT_ECHO_REQUEST = 2,
+    OFPT_ECHO_REPLY = 3,
+    OFPT_EXPERIMENTER = 4,
+    OFPT_FEATURES_REQUEST = 5,
+    OFPT_FEATURES_REPLY = 6,
+    OFPT_GET_CONFIG_REQUEST = 7,
+    OFPT_GET_CONFIG_REPLY = 8,
+    OFPT_SET_CONFIG = 9,
+    OFPT_PACKET_IN = 10,
+    OFPT_FLOW_REMOVED = 11,
+    OFPT_PORT_STATUS = 12,
+    OFPT_PACKET_OUT = 13,
+    OFPT_FLOW_MOD = 14,
+    OFPT_GROUP_MOD = 15,
+    OFPT_PORT_MOD = 16,
+    OFPT_TABLE_MOD = 17,
+    OFPT_STATS_REQUEST = 18,
+    OFPT_STATS_REPLY = 19,
+    OFPT_BARRIER_REQUEST = 20,
+    OFPT_BARRIER_REPLY = 21,
+    OFPT_QUEUE_GET_CONFIG_REQUEST = 22,
+    OFPT_QUEUE_GET_CONFIG_REPLY = 23,
+};
+
+enum ofp_config_flags {
+    OFPC_FRAG_NORMAL = 0,
+    OFPC_FRAG_DROP = 1,
+    OFPC_FRAG_REASM = 2,
+    OFPC_FRAG_MASK = 3,
+    OFPC_INVALID_TTL_TO_CONTROLLER = 4,
+};
+
+enum ofp_table_config {
+    OFPTC_TABLE_MISS_CONTROLLER = 0,
+    OFPTC_TABLE_MISS_CONTINUE = 1,
+    OFPTC_TABLE_MISS_DROP = 2,
+    OFPTC_TABLE_MISS_MASK = 3,
+};
+
+enum ofp_capabilities {
+    OFPC_FLOW_STATS = 0x1,
+    OFPC_TABLE_STATS = 0x2,
+    OFPC_PORT_STATS = 0x4,
+    OFPC_GROUP_STATS = 0x8,
+    OFPC_IP_REASM = 0x20,
+    OFPC_QUEUE_STATS = 0x40,
+    OFPC_ARP_MATCH_IP = 0x80,
+};
+
+enum ofp_port_config {
+    OFPPC_PORT_DOWN = 0x1,
+    OFPPC_NO_RECV = 0x4,
+    OFPPC_NO_FWD = 0x20,
+    OFPPC_NO_PACKET_IN = 0x40,
+};
+
+enum ofp_port_state {
+    OFPPS_LINK_DOWN = 0x1,
+    OFPPS_BLOCKED = 0x2,
+    OFPPS_LIVE = 0x4,
+};
+
+enum ofp_port_features {
+    OFPPF_10MB_HD = 0x1,
+    OFPPF_10MB_FD = 0x2,
+    OFPPF_100MB_HD = 0x4,
+    OFPPF_100MB_FD = 0x8,
+    OFPPF_1GB_HD = 0x10,
+    OFPPF_1GB_FD = 0x20,
+    OFPPF_10GB_FD = 0x40,
+    OFPPF_40GB_FD = 0x80,
+    OFPPF_100GB_FD = 0x100,
+    OFPPF_1TB_FD = 0x200,
+    OFPPF_OTHER = 0x400,
+    OFPPF_COPPER = 0x800,
+    OFPPF_FIBER = 0x1000,
+    OFPPF_AUTONEG = 0x2000,
+    OFPPF_PAUSE = 0x4000,
+    OFPPF_PAUSE_ASYM = 0x8000,
+};
+
+enum ofp_port_reason {
+    OFPPR_ADD = 0,
+    OFPPR_DELETE = 1,
+    OFPPR_MODIFY = 2,
+};
+
+enum ofp_packet_in_reason {
+    OFPR_NO_MATCH = 0,
+    OFPR_ACTION = 1,
+};
+
+enum ofp_action_type {
+    OFPAT_OUTPUT = 0,
+    OFPAT_SET_VLAN_VID = 1,
+    OFPAT_SET_VLAN_PCP = 2,
+    OFPAT_SET_DL_SRC = 3,
+    OFPAT_SET_DL_DST = 4,
+    OFPAT_SET_NW_SRC = 5,
+    OFPAT_SET_NW_DST = 6,
+    OFPAT_SET_NW_TOS = 7,
+    OFPAT_SET_NW_ECN = 8,
+    OFPAT_SET_TP_SRC = 9,
+    OFPAT_SET_TP_DST = 10,
+    OFPAT_COPY_TTL_OUT = 11,
+    OFPAT_COPY_TTL_IN = 12,
+    OFPAT_SET_MPLS_LABEL = 13,
+    OFPAT_SET_MPLS_TC = 14,
+    OFPAT_SET_MPLS_TTL = 15,
+    OFPAT_DEC_MPLS_TTL = 16,
+    OFPAT_PUSH_VLAN = 17,
+    OFPAT_POP_VLAN = 18,
+    OFPAT_PUSH_MPLS = 19,
+    OFPAT_POP_MPLS = 20,
+    OFPAT_SET_QUEUE = 21,
+    OFPAT_GROUP = 22,
+    OFPAT_SET_NW_TTL = 23,
+    OFPAT_DEC_NW_TTL = 24,
+    OFPAT_EXPERIMENTER = 0xffff,
+};
+
+enum ofp_flow_mod_command {
+    OFPFC_ADD = 0,
+    OFPFC_MODIFY = 1,
+    OFPFC_MODIFY_STRICT = 2,
+    OFPFC_DELETE = 3,
+    OFPFC_DELETE_STRICT = 4,
+};
+
+enum ofp_group_mod_command {
+    OFPGC_ADD = 0,
+    OFPGC_MODIFY = 1,
+    OFPGC_DELETE = 2,
+};
+
+enum ofp_flow_wildcards {
+    OFPFW_IN_PORT = 0x1,
+    OFPFW_DL_VLAN = 0x2,
+    OFPFW_DL_VLAN_PCP = 0x4,
+    OFPFW_DL_TYPE = 0x8,
+    OFPFW_NW_TOS = 0x10,
+    OFPFW_NW_PROTO = 0x20,
+    OFPFW_TP_SRC = 0x40,
+    OFPFW_TP_DST = 0x80,
+    OFPFW_MPLS_LABEL = 0x100,
+    OFPFW_MPLS_TC = 0x200,
+    OFPFW_ALL = 0x3ff,
+};
+
+enum ofp_vlan_id {
+    OFPVID_ANY = 0xfffe,
+    OFPVID_NONE = 0xffff,
+};
+
+enum ofp_match_type {
+    OFPMT_STANDARD = 0,
+};
+
+enum ofp_instruction_type {
+    OFPIT_GOTO_TABLE = 0x1,
+    OFPIT_WRITE_METADATA = 0x2,
+    OFPIT_WRITE_ACTIONS = 0x3,
+    OFPIT_APPLY_ACTIONS = 0x4,
+    OFPIT_CLEAR_ACTIONS = 0x5,
+    OFPIT_EXPERIMENTER = 0xffff,
+};
+
+enum ofp_flow_mod_flags {
+    OFPFF_SEND_FLOW_REM = 0x1,
+    OFPFF_CHECK_OVERLAP = 0x2,
+};
+
+enum ofp_group {
+    OFPG_MAX = 0xffffff00,
+    OFPG_ALL = 0xfffffffc,
+    OFPG_ANY = 0xffffffff,
+};
+
+enum ofp_group_type {
+    OFPGT_ALL = 0,
+    OFPGT_SELECT = 1,
+    OFPGT_INDIRECT = 2,
+    OFPGT_FF = 3,
+};
+
+enum ofp_flow_removed_reason {
+    OFPRR_IDLE_TIMEOUT = 0,
+    OFPRR_HARD_TIMEOUT = 1,
+    OFPRR_DELETE = 2,
+    OFPRR_GROUP_DELETE = 3,
+};
+
+enum ofp_error_type {
+    OFPET_HELLO_FAILED = 0,
+    OFPET_BAD_REQUEST = 1,
+    OFPET_BAD_ACTION = 2,
+    OFPET_BAD_INSTRUCTION = 3,
+    OFPET_BAD_MATCH = 4,
+    OFPET_FLOW_MOD_FAILED = 5,
+    OFPET_GROUP_MOD_FAILED = 6,
+    OFPET_PORT_MOD_FAILED = 7,
+    OFPET_TABLE_MOD_FAILED = 8,
+    OFPET_QUEUE_OP_FAILED = 9,
+    OFPET_SWITCH_CONFIG_FAILED = 10,
+};
+
+enum ofp_hello_failed_code {
+    OFPHFC_INCOMPATIBLE = 0,
+    OFPHFC_EPERM = 1,
+};
+
+enum ofp_bad_request_code {
+    OFPBRC_BAD_VERSION = 0,
+    OFPBRC_BAD_TYPE = 1,
+    OFPBRC_BAD_STAT = 2,
+    OFPBRC_BAD_EXPERIMENTER = 3,
+    OFPBRC_BAD_SUBTYPE = 4,
+    OFPBRC_EPERM = 5,
+    OFPBRC_BAD_LEN = 6,
+    OFPBRC_BUFFER_EMPTY = 7,
+    OFPBRC_BUFFER_UNKNOWN = 8,
+    OFPBRC_BAD_TABLE_ID = 9,
+};
+
+enum ofp_bad_action_code {
+    OFPBAC_BAD_TYPE = 0,
+    OFPBAC_BAD_LEN = 1,
+    OFPBAC_BAD_EXPERIMENTER = 2,
+    OFPBAC_BAD_EXPERIMENTER_TYPE = 3,
+    OFPBAC_BAD_OUT_PORT = 4,
+    OFPBAC_BAD_ARGUMENT = 5,
+    OFPBAC_EPERM = 6,
+    OFPBAC_TOO_MANY = 7,
+    OFPBAC_BAD_QUEUE = 8,
+    OFPBAC_BAD_OUT_GROUP = 9,
+    OFPBAC_MATCH_INCONSISTENT = 10,
+    OFPBAC_UNSUPPORTED_ORDER = 11,
+    OFPBAC_BAD_TAG = 12,
+};
+
+enum ofp_bad_instruction_code {
+    OFPBIC_UNKNOWN_INST = 0,
+    OFPBIC_UNSUP_INST = 1,
+    OFPBIC_BAD_TABLE_ID = 2,
+    OFPBIC_UNSUP_METADATA = 3,
+    OFPBIC_UNSUP_METADATA_MASK = 4,
+    OFPBIC_UNSUP_EXP_INST = 5,
+};
+
+enum ofp_bad_match_code {
+    OFPBMC_BAD_TYPE = 0,
+    OFPBMC_BAD_LEN = 1,
+    OFPBMC_BAD_TAG = 2,
+    OFPBMC_BAD_DL_ADDR_MASK = 3,
+    OFPBMC_BAD_NW_ADDR_MASK = 4,
+    OFPBMC_BAD_WILDCARDS = 5,
+    OFPBMC_BAD_FIELD = 6,
+    OFPBMC_BAD_VALUE = 7,
+};
+
+enum ofp_flow_mod_failed_code {
+    OFPFMFC_UNKNOWN = 0,
+    OFPFMFC_TABLE_FULL = 1,
+    OFPFMFC_BAD_TABLE_ID = 2,
+    OFPFMFC_OVERLAP = 3,
+    OFPFMFC_EPERM = 4,
+    OFPFMFC_BAD_TIMEOUT = 5,
+    OFPFMFC_BAD_COMMAND = 6,
+};
+
+enum ofp_group_mod_failed_code {
+    OFPGMFC_GROUP_EXISTS = 0,
+    OFPGMFC_INVALID_GROUP = 1,
+    OFPGMFC_WEIGHT_UNSUPPORTED = 2,
+    OFPGMFC_OUT_OF_GROUPS = 3,
+    OFPGMFC_OUT_OF_BUCKETS = 4,
+    OFPGMFC_CHAINING_UNSUPPORTED = 5,
+    OFPGMFC_WATCH_UNSUPPORTED = 6,
+    OFPGMFC_LOOP = 7,
+    OFPGMFC_UNKNOWN_GROUP = 8,
+};
+
+enum ofp_port_mod_failed_code {
+    OFPPMFC_BAD_PORT = 0,
+    OFPPMFC_BAD_HW_ADDR = 1,
+    OFPPMFC_BAD_CONFIG = 2,
+    OFPPMFC_BAD_ADVERTISE = 3,
+};
+
+enum ofp_table_mod_failed_code {
+    OFPTMFC_BAD_TABLE = 0,
+    OFPTMFC_BAD_CONFIG = 1,
+};
+
+enum ofp_queue_op_failed_code {
+    OFPQOFC_BAD_PORT = 0,
+    OFPQOFC_BAD_QUEUE = 1,
+    OFPQOFC_EPERM = 2,
+};
+
+enum ofp_switch_config_failed_code {
+    OFPSCFC_BAD_FLAGS = 0,
+    OFPSCFC_BAD_LEN = 1,
+};
+
+enum ofp_stats_types {
+    OFPST_DESC = 0,
+    OFPST_FLOW = 1,
+    OFPST_AGGREGATE = 2,
+    OFPST_TABLE = 3,
+    OFPST_PORT = 4,
+    OFPST_QUEUE = 5,
+    OFPST_GROUP = 6,
+    OFPST_GROUP_DESC = 7,
+    OFPST_EXPERIMENTER = 0xffff,
+};
+
+enum ofp_stats_reply_flags {
+    OFPSF_REPLY_MORE = 0x1,
+};
+
+enum ofp_queue_properties {
+    OFPQT_NONE = 0,
+    OFPQT_MIN_RATE = 1,
+};
+
 struct ofp_header {
     uint8_t version;
     uint8_t type;
diff --git a/openflow_input/standard-1.2 b/openflow_input/standard-1.2
index 0961abd..0d48c43 100644
--- a/openflow_input/standard-1.2
+++ b/openflow_input/standard-1.2
@@ -24,9 +24,429 @@
 // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 // EPL for the specific language governing permissions and limitations
 // under the EPL.
+//
+// Also derived from the OpenFlow header files which have these copyrights:
+// Copyright (c) 2008 The Board of Trustees of The Leland Stanford Junior University
+// Copyright (c) 2011, 2012 Open Networking Foundation
 
 #version 3
 
+enum macro_definitions {
+    OFP_MAX_TABLE_NAME_LEN = 32,
+    OFP_MAX_PORT_NAME_LEN = 16,
+
+    OFP_TCP_PORT = 6633,
+    OFP_SSL_PORT = 6633,
+
+    OFP_ETH_ALEN = 6,
+
+    OFP_DEFAULT_MISS_SEND_LEN = 128,
+
+    OFP_VLAN_NONE = 0,
+
+    OFP_FLOW_PERMANENT = 0,
+
+    OFP_DEFAULT_PRIORITY = 0x8000,
+
+    OFP_NO_BUFFER = 0xffffffff,
+
+    DESC_STR_LEN = 256,
+    SERIAL_NUM_LEN = 32,
+
+    OFPQ_ALL = 0xffffffff,
+
+    OFPQ_MIN_RATE_UNCFG = 0xffff,
+    OFPQ_MAX_RATE_UNCFG = 0xffff,
+};
+
+enum ofp_port {
+    OFPP_MAX = 0xffffff00,
+    OFPP_IN_PORT = 0xfffffff8,
+    OFPP_TABLE = 0xfffffff9,
+    OFPP_NORMAL = 0xfffffffa,
+    OFPP_FLOOD = 0xfffffffb,
+    OFPP_ALL = 0xfffffffc,
+    OFPP_CONTROLLER = 0xfffffffd,
+    OFPP_LOCAL = 0xfffffffe,
+};
+
+enum ofp_port_no {
+    OFPP_ANY = 0xffffffff,
+};
+
+enum ofp_type {
+    OFPT_HELLO = 0,
+    OFPT_ERROR = 1,
+    OFPT_ECHO_REQUEST = 2,
+    OFPT_ECHO_REPLY = 3,
+    OFPT_EXPERIMENTER = 4,
+    OFPT_FEATURES_REQUEST = 5,
+    OFPT_FEATURES_REPLY = 6,
+    OFPT_GET_CONFIG_REQUEST = 7,
+    OFPT_GET_CONFIG_REPLY = 8,
+    OFPT_SET_CONFIG = 9,
+    OFPT_PACKET_IN = 10,
+    OFPT_FLOW_REMOVED = 11,
+    OFPT_PORT_STATUS = 12,
+    OFPT_PACKET_OUT = 13,
+    OFPT_FLOW_MOD = 14,
+    OFPT_GROUP_MOD = 15,
+    OFPT_PORT_MOD = 16,
+    OFPT_TABLE_MOD = 17,
+    OFPT_STATS_REQUEST = 18,
+    OFPT_STATS_REPLY = 19,
+    OFPT_BARRIER_REQUEST = 20,
+    OFPT_BARRIER_REPLY = 21,
+    OFPT_QUEUE_GET_CONFIG_REQUEST = 22,
+    OFPT_QUEUE_GET_CONFIG_REPLY = 23,
+    OFPT_ROLE_REQUEST = 24,
+    OFPT_ROLE_REPLY = 25,
+};
+
+enum ofp_config_flags {
+    OFPC_FRAG_NORMAL = 0,
+    OFPC_FRAG_DROP = 1,
+    OFPC_FRAG_REASM = 2,
+    OFPC_FRAG_MASK = 3,
+    OFPC_INVALID_TTL_TO_CONTROLLER = 4,
+};
+
+enum ofp_table_config {
+    OFPTC_TABLE_MISS_CONTROLLER = 0,
+    OFPTC_TABLE_MISS_CONTINUE = 1,
+    OFPTC_TABLE_MISS_DROP = 2,
+    OFPTC_TABLE_MISS_MASK = 3,
+};
+
+enum ofp_table {
+    OFPTT_MAX = 0xfe,
+    OFPTT_ALL = 0xff,
+};
+
+enum ofp_capabilities {
+    OFPC_FLOW_STATS = 0x1,
+    OFPC_TABLE_STATS = 0x2,
+    OFPC_PORT_STATS = 0x4,
+    OFPC_GROUP_STATS = 0x8,
+    OFPC_IP_REASM = 0x20,
+    OFPC_QUEUE_STATS = 0x40,
+    OFPC_PORT_BLOCKED = 0x100,
+};
+
+enum ofp_port_config {
+    OFPPC_PORT_DOWN = 0x1,
+    OFPPC_NO_RECV = 0x4,
+    OFPPC_NO_FWD = 0x20,
+    OFPPC_NO_PACKET_IN = 0x40,
+};
+
+enum ofp_port_state {
+    OFPPS_LINK_DOWN = 0x1,
+    OFPPS_BLOCKED = 0x2,
+    OFPPS_LIVE = 0x4,
+};
+
+enum ofp_port_features {
+    OFPPF_10MB_HD = 0x1,
+    OFPPF_10MB_FD = 0x2,
+    OFPPF_100MB_HD = 0x4,
+    OFPPF_100MB_FD = 0x8,
+    OFPPF_1GB_HD = 0x10,
+    OFPPF_1GB_FD = 0x20,
+    OFPPF_10GB_FD = 0x40,
+    OFPPF_40GB_FD = 0x80,
+    OFPPF_100GB_FD = 0x100,
+    OFPPF_1TB_FD = 0x200,
+    OFPPF_OTHER = 0x400,
+    OFPPF_COPPER = 0x800,
+    OFPPF_FIBER = 0x1000,
+    OFPPF_AUTONEG = 0x2000,
+    OFPPF_PAUSE = 0x4000,
+    OFPPF_PAUSE_ASYM = 0x8000,
+};
+
+enum ofp_port_reason {
+    OFPPR_ADD = 0,
+    OFPPR_DELETE = 1,
+    OFPPR_MODIFY = 2,
+};
+
+enum ofp_match_type {
+    OFPMT_STANDARD = 0,
+    OFPMT_OXM = 1,
+};
+
+enum ofp_oxm_class {
+    OFPXMC_NXM_0 = 0,
+    OFPXMC_NXM_1 = 1,
+    OFPXMC_OPENFLOW_BASIC = 0x8000,
+    OFPXMC_EXPERIMENTER = 0xffff,
+};
+
+enum ofp_vlan_id {
+    OFPVID_NONE = 0,
+    OFPVID_PRESENT = 0x1000,
+};
+
+enum ofp_action_type {
+    OFPAT_OUTPUT = 0,
+    OFPAT_COPY_TTL_OUT = 0xb,
+    OFPAT_COPY_TTL_IN = 0xc,
+    OFPAT_SET_MPLS_TTL = 0xf,
+    OFPAT_DEC_MPLS_TTL = 0x10,
+    OFPAT_PUSH_VLAN = 0x11,
+    OFPAT_POP_VLAN = 0x12,
+    OFPAT_PUSH_MPLS = 0x13,
+    OFPAT_POP_MPLS = 0x14,
+    OFPAT_SET_QUEUE = 0x15,
+    OFPAT_GROUP = 0x16,
+    OFPAT_SET_NW_TTL = 0x17,
+    OFPAT_DEC_NW_TTL = 0x18,
+    OFPAT_SET_FIELD = 0x19,
+    OFPAT_EXPERIMENTER = 0xffff,
+};
+
+enum ofp_controller_max_len {
+    OFPCML_MAX = 0xffe5,
+    OFPCML_NO_BUFFER = 0xffff,
+};
+
+enum ofp_instruction_type {
+    OFPIT_GOTO_TABLE = 0x1,
+    OFPIT_WRITE_METADATA = 0x2,
+    OFPIT_WRITE_ACTIONS = 0x3,
+    OFPIT_APPLY_ACTIONS = 0x4,
+    OFPIT_CLEAR_ACTIONS = 0x5,
+    OFPIT_EXPERIMENTER = 0xffff,
+};
+
+enum ofp_flow_mod_command {
+    OFPFC_ADD = 0,
+    OFPFC_MODIFY = 1,
+    OFPFC_MODIFY_STRICT = 2,
+    OFPFC_DELETE = 3,
+    OFPFC_DELETE_STRICT = 4,
+};
+
+enum ofp_flow_mod_flags {
+    OFPFF_SEND_FLOW_REM = 0x1,
+    OFPFF_CHECK_OVERLAP = 0x2,
+    OFPFF_RESET_COUNTS = 0x4,
+};
+
+enum ofp_group {
+    OFPG_MAX = 0xffffff00,
+    OFPG_ALL = 0xfffffffc,
+    OFPG_ANY = 0xffffffff,
+};
+
+enum ofp_group_mod_command {
+    OFPGC_ADD = 0,
+    OFPGC_MODIFY = 1,
+    OFPGC_DELETE = 2,
+};
+
+enum ofp_group_type {
+    OFPGT_ALL = 0,
+    OFPGT_SELECT = 1,
+    OFPGT_INDIRECT = 2,
+    OFPGT_FF = 3,
+};
+
+enum ofp_packet_in_reason {
+    OFPR_NO_MATCH = 0,
+    OFPR_ACTION = 1,
+    OFPR_INVALID_TTL = 2,
+};
+
+enum ofp_flow_removed_reason {
+    OFPRR_IDLE_TIMEOUT = 0,
+    OFPRR_HARD_TIMEOUT = 1,
+    OFPRR_DELETE = 2,
+    OFPRR_GROUP_DELETE = 3,
+};
+
+enum ofp_error_type {
+    OFPET_HELLO_FAILED = 0,
+    OFPET_BAD_REQUEST = 1,
+    OFPET_BAD_ACTION = 2,
+    OFPET_BAD_INSTRUCTION = 3,
+    OFPET_BAD_MATCH = 4,
+    OFPET_FLOW_MOD_FAILED = 5,
+    OFPET_GROUP_MOD_FAILED = 6,
+    OFPET_PORT_MOD_FAILED = 7,
+    OFPET_TABLE_MOD_FAILED = 8,
+    OFPET_QUEUE_OP_FAILED = 9,
+    OFPET_SWITCH_CONFIG_FAILED = 10,
+    OFPET_ROLE_REQUEST_FAILED = 11,
+    OFPET_EXPERIMENTER = 0xffff,
+};
+
+enum ofp_hello_failed_code {
+    OFPHFC_INCOMPATIBLE = 0,
+    OFPHFC_EPERM = 1,
+};
+
+enum ofp_bad_request_code {
+    OFPBRC_BAD_VERSION = 0,
+    OFPBRC_BAD_TYPE = 1,
+    OFPBRC_BAD_STAT = 2,
+    OFPBRC_BAD_EXPERIMENTER = 3,
+    OFPBRC_BAD_EXP_TYPE = 4,
+    OFPBRC_EPERM = 5,
+    OFPBRC_BAD_LEN = 6,
+    OFPBRC_BUFFER_EMPTY = 7,
+    OFPBRC_BUFFER_UNKNOWN = 8,
+    OFPBRC_BAD_TABLE_ID = 9,
+    OFPBRC_IS_SLAVE = 10,
+    OFPBRC_BAD_PORT = 11,
+    OFPBRC_BAD_PACKET = 12,
+};
+
+enum ofp_bad_action_code {
+    OFPBAC_BAD_TYPE = 0,
+    OFPBAC_BAD_LEN = 1,
+    OFPBAC_BAD_EXPERIMENTER = 2,
+    OFPBAC_BAD_EXP_TYPE = 3,
+    OFPBAC_BAD_OUT_PORT = 4,
+    OFPBAC_BAD_ARGUMENT = 5,
+    OFPBAC_EPERM = 6,
+    OFPBAC_TOO_MANY = 7,
+    OFPBAC_BAD_QUEUE = 8,
+    OFPBAC_BAD_OUT_GROUP = 9,
+    OFPBAC_MATCH_INCONSISTENT = 10,
+    OFPBAC_UNSUPPORTED_ORDER = 11,
+    OFPBAC_BAD_TAG = 12,
+    OFPBAC_BAD_SET_TYPE = 13,
+    OFPBAC_BAD_SET_LEN = 14,
+    OFPBAC_BAD_SET_ARGUMENT = 15,
+};
+
+enum ofp_bad_instruction_code {
+    OFPBIC_UNKNOWN_INST = 0,
+    OFPBIC_UNSUP_INST = 1,
+    OFPBIC_BAD_TABLE_ID = 2,
+    OFPBIC_UNSUP_METADATA = 3,
+    OFPBIC_UNSUP_METADATA_MASK = 4,
+    OFPBIC_BAD_EXPERIMENTER = 5,
+    OFPBIC_BAD_EXP_TYPE = 6,
+    OFPBIC_BAD_LEN = 7,
+    OFPBIC_EPERM = 8,
+};
+
+enum ofp_bad_match_code {
+    OFPBMC_BAD_TYPE = 0,
+    OFPBMC_BAD_LEN = 1,
+    OFPBMC_BAD_TAG = 2,
+    OFPBMC_BAD_DL_ADDR_MASK = 3,
+    OFPBMC_BAD_NW_ADDR_MASK = 4,
+    OFPBMC_BAD_WILDCARDS = 5,
+    OFPBMC_BAD_FIELD = 6,
+    OFPBMC_BAD_VALUE = 7,
+    OFPBMC_BAD_MASK = 8,
+    OFPBMC_BAD_PREREQ = 9,
+    OFPBMC_DUP_FIELD = 10,
+    OFPBMC_EPERM = 11,
+};
+
+enum ofp_flow_mod_failed_code {
+    OFPFMFC_UNKNOWN = 0,
+    OFPFMFC_TABLE_FULL = 1,
+    OFPFMFC_BAD_TABLE_ID = 2,
+    OFPFMFC_OVERLAP = 3,
+    OFPFMFC_EPERM = 4,
+    OFPFMFC_BAD_TIMEOUT = 5,
+    OFPFMFC_BAD_COMMAND = 6,
+    OFPFMFC_BAD_FLAGS = 7,
+};
+
+enum ofp_group_mod_failed_code {
+    OFPGMFC_GROUP_EXISTS = 0,
+    OFPGMFC_INVALID_GROUP = 1,
+    OFPGMFC_WEIGHT_UNSUPPORTED = 2,
+    OFPGMFC_OUT_OF_GROUPS = 3,
+    OFPGMFC_OUT_OF_BUCKETS = 4,
+    OFPGMFC_CHAINING_UNSUPPORTED = 5,
+    OFPGMFC_WATCH_UNSUPPORTED = 6,
+    OFPGMFC_LOOP = 7,
+    OFPGMFC_UNKNOWN_GROUP = 8,
+    OFPGMFC_CHAINED_GROUP = 9,
+    OFPGMFC_BAD_TYPE = 10,
+    OFPGMFC_BAD_COMMAND = 11,
+    OFPGMFC_BAD_BUCKET = 12,
+    OFPGMFC_BAD_WATCH = 13,
+    OFPGMFC_EPERM = 14,
+};
+
+enum ofp_port_mod_failed_code {
+    OFPPMFC_BAD_PORT = 0,
+    OFPPMFC_BAD_HW_ADDR = 1,
+    OFPPMFC_BAD_CONFIG = 2,
+    OFPPMFC_BAD_ADVERTISE = 3,
+    OFPPMFC_EPERM = 4,
+};
+
+enum ofp_table_mod_failed_code {
+    OFPTMFC_BAD_TABLE = 0,
+    OFPTMFC_BAD_CONFIG = 1,
+    OFPTMFC_EPERM = 2,
+};
+
+enum ofp_queue_op_failed_code {
+    OFPQOFC_BAD_PORT = 0,
+    OFPQOFC_BAD_QUEUE = 1,
+    OFPQOFC_EPERM = 2,
+};
+
+enum ofp_switch_config_failed_code {
+    OFPSCFC_BAD_FLAGS = 0,
+    OFPSCFC_BAD_LEN = 1,
+    OFPSCFC_EPERM = 2,
+};
+
+enum ofp_role_request_failed_code {
+    OFPRRFC_STALE = 0,
+    OFPRRFC_UNSUP = 1,
+    OFPRRFC_BAD_ROLE = 2,
+};
+
+enum ofp_stats_types {
+    OFPST_DESC = 0,
+    OFPST_FLOW = 1,
+    OFPST_AGGREGATE = 2,
+    OFPST_TABLE = 3,
+    OFPST_PORT = 4,
+    OFPST_QUEUE = 5,
+    OFPST_GROUP = 6,
+    OFPST_GROUP_DESC = 7,
+    OFPST_GROUP_FEATURES = 8,
+    OFPST_EXPERIMENTER = 0xffff,
+};
+
+enum ofp_stats_reply_flags {
+    OFPSF_REPLY_MORE = 0x1,
+};
+
+enum ofp_group_capabilities {
+    OFPGFC_SELECT_WEIGHT = 0x1,
+    OFPGFC_SELECT_LIVENESS = 0x2,
+    OFPGFC_CHAINING = 0x4,
+    OFPGFC_CHAINING_CHECKS = 0x8,
+};
+
+enum ofp_queue_properties {
+    OFPQT_MIN_RATE = 0x1,
+    OFPQT_MAX_RATE = 0x2,
+    OFPQT_EXPERIMENTER = 0xffff,
+};
+
+enum ofp_controller_role {
+    OFPCR_ROLE_NOCHANGE = 0,
+    OFPCR_ROLE_EQUAL = 1,
+    OFPCR_ROLE_MASTER = 2,
+    OFPCR_ROLE_SLAVE = 3,
+};
+
 struct ofp_header {
     uint8_t version;
     uint8_t type;
diff --git a/openflow_input/standard-1.3 b/openflow_input/standard-1.3
index 258ec01..591e254 100644
--- a/openflow_input/standard-1.3
+++ b/openflow_input/standard-1.3
@@ -24,9 +24,530 @@
 // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 // EPL for the specific language governing permissions and limitations
 // under the EPL.
+//
+// Also derived from the OpenFlow header files which have these copyrights:
+// Copyright (c) 2008 The Board of Trustees of The Leland Stanford Junior University
+// Copyright (c) 2011, 2012 Open Networking Foundation
 
 #version 4
 
+enum macro_definitions {
+    OFP_MAX_TABLE_NAME_LEN = 32,
+    OFP_MAX_PORT_NAME_LEN = 16,
+
+    OFP_TCP_PORT = 6633,
+    OFP_SSL_PORT = 6633,
+
+    OFP_ETH_ALEN = 6,
+
+    OFP_DEFAULT_MISS_SEND_LEN = 128,
+
+    OFP_VLAN_NONE = 0,
+
+    OFP_FLOW_PERMANENT = 0,
+
+    OFP_DEFAULT_PRIORITY = 0x8000,
+
+    OFP_NO_BUFFER = 0xffffffff,
+
+    DESC_STR_LEN = 256,
+    SERIAL_NUM_LEN = 32,
+
+    OFPQ_ALL = 0xffffffff,
+    OFPQ_MAX_RATE_UNCFG = 0xffff,
+    OFPQ_MIN_RATE_UNCFG = 0xffff,
+};
+
+enum ofp_port_no {
+    OFPP_ANY = 0xffffffff,
+};
+
+enum ofp_port {
+    OFPP_MAX = 0xffffff00,
+    OFPP_IN_PORT = 0xfffffff8,
+    OFPP_TABLE = 0xfffffff9,
+    OFPP_NORMAL = 0xfffffffa,
+    OFPP_FLOOD = 0xfffffffb,
+    OFPP_ALL = 0xfffffffc,
+    OFPP_CONTROLLER = 0xfffffffd,
+    OFPP_LOCAL = 0xfffffffe,
+};
+
+enum ofp_type {
+    OFPT_HELLO = 0,
+    OFPT_ERROR = 1,
+    OFPT_ECHO_REQUEST = 2,
+    OFPT_ECHO_REPLY = 3,
+    OFPT_EXPERIMENTER = 4,
+    OFPT_FEATURES_REQUEST = 5,
+    OFPT_FEATURES_REPLY = 6,
+    OFPT_GET_CONFIG_REQUEST = 7,
+    OFPT_GET_CONFIG_REPLY = 8,
+    OFPT_SET_CONFIG = 9,
+    OFPT_PACKET_IN = 10,
+    OFPT_FLOW_REMOVED = 11,
+    OFPT_PORT_STATUS = 12,
+    OFPT_PACKET_OUT = 13,
+    OFPT_FLOW_MOD = 14,
+    OFPT_GROUP_MOD = 15,
+    OFPT_PORT_MOD = 16,
+    OFPT_TABLE_MOD = 17,
+    OFPT_MULTIPART_REQUEST = 18,
+    OFPT_MULTIPART_REPLY = 19,
+    OFPT_BARRIER_REQUEST = 20,
+    OFPT_BARRIER_REPLY = 21,
+    OFPT_QUEUE_GET_CONFIG_REQUEST = 22,
+    OFPT_QUEUE_GET_CONFIG_REPLY = 23,
+    OFPT_ROLE_REQUEST = 24,
+    OFPT_ROLE_REPLY = 25,
+    OFPT_GET_ASYNC_REQUEST = 26,
+    OFPT_GET_ASYNC_REPLY = 27,
+    OFPT_SET_ASYNC = 28,
+    OFPT_METER_MOD = 29,
+};
+
+enum ofp_config_flags {
+    OFPC_FRAG_NORMAL = 0,
+    OFPC_FRAG_DROP = 1,
+    OFPC_FRAG_REASM = 2,
+    OFPC_FRAG_MASK = 3,
+};
+
+enum ofp_table_config {
+    OFPTC_DEPRECATED_MASK = 0x3,
+};
+
+enum ofp_table {
+    OFPTT_MAX = 0xfe,
+    OFPTT_ALL = 0xff,
+};
+
+enum ofp_capabilities {
+    OFPC_FLOW_STATS = 0x1,
+    OFPC_TABLE_STATS = 0x2,
+    OFPC_PORT_STATS = 0x4,
+    OFPC_GROUP_STATS = 0x8,
+    OFPC_IP_REASM = 0x20,
+    OFPC_QUEUE_STATS = 0x40,
+    OFPC_PORT_BLOCKED = 0x100,
+};
+
+enum ofp_port_config {
+    OFPPC_PORT_DOWN = 0x1,
+    OFPPC_NO_RECV = 0x4,
+    OFPPC_NO_FWD = 0x20,
+    OFPPC_NO_PACKET_IN = 0x40,
+};
+
+enum ofp_port_state {
+    OFPPS_LINK_DOWN = 0x1,
+    OFPPS_BLOCKED = 0x2,
+    OFPPS_LIVE = 0x4,
+};
+
+enum ofp_port_features {
+    OFPPF_10MB_HD = 0x1,
+    OFPPF_10MB_FD = 0x2,
+    OFPPF_100MB_HD = 0x4,
+    OFPPF_100MB_FD = 0x8,
+    OFPPF_1GB_HD = 0x10,
+    OFPPF_1GB_FD = 0x20,
+    OFPPF_10GB_FD = 0x40,
+    OFPPF_40GB_FD = 0x80,
+    OFPPF_100GB_FD = 0x100,
+    OFPPF_1TB_FD = 0x200,
+    OFPPF_OTHER = 0x400,
+    OFPPF_COPPER = 0x800,
+    OFPPF_FIBER = 0x1000,
+    OFPPF_AUTONEG = 0x2000,
+    OFPPF_PAUSE = 0x4000,
+    OFPPF_PAUSE_ASYM = 0x8000,
+};
+
+enum ofp_port_reason {
+    OFPPR_ADD = 0,
+    OFPPR_DELETE = 1,
+    OFPPR_MODIFY = 2,
+};
+
+enum ofp_match_type {
+    OFPMT_STANDARD = 0,
+    OFPMT_OXM = 1,
+};
+
+enum ofp_oxm_class {
+    OFPXMC_NXM_0 = 0,
+    OFPXMC_NXM_1 = 1,
+    OFPXMC_OPENFLOW_BASIC = 0x8000,
+    OFPXMC_EXPERIMENTER = 0xffff,
+};
+
+enum ofp_vlan_id {
+    OFPVID_NONE = 0,
+    OFPVID_PRESENT = 0x1000,
+};
+
+enum ofp_ipv6exthdr_flags {
+    OFPIEH_NONEXT = 0x1,
+    OFPIEH_ESP = 0x2,
+    OFPIEH_AUTH = 0x4,
+    OFPIEH_DEST = 0x8,
+    OFPIEH_FRAG = 0x10,
+    OFPIEH_ROUTER = 0x20,
+    OFPIEH_HOP = 0x40,
+    OFPIEH_UNREP = 0x80,
+    OFPIEH_UNSEQ = 0x100,
+};
+
+enum ofp_action_type {
+    OFPAT_OUTPUT = 0,
+    OFPAT_COPY_TTL_OUT = 0xb,
+    OFPAT_COPY_TTL_IN = 0xc,
+    OFPAT_SET_MPLS_TTL = 0xf,
+    OFPAT_DEC_MPLS_TTL = 0x10,
+    OFPAT_PUSH_VLAN = 0x11,
+    OFPAT_POP_VLAN = 0x12,
+    OFPAT_PUSH_MPLS = 0x13,
+    OFPAT_POP_MPLS = 0x14,
+    OFPAT_SET_QUEUE = 0x15,
+    OFPAT_GROUP = 0x16,
+    OFPAT_SET_NW_TTL = 0x17,
+    OFPAT_DEC_NW_TTL = 0x18,
+    OFPAT_SET_FIELD = 0x19,
+    OFPAT_PUSH_PBB = 0x1a,
+    OFPAT_POP_PBB = 0x1b,
+    OFPAT_EXPERIMENTER = 0xffff,
+};
+
+enum ofp_controller_max_len {
+    OFPCML_MAX = 0xffe5,
+    OFPCML_NO_BUFFER = 0xffff,
+};
+
+enum ofp_instruction_type {
+    OFPIT_GOTO_TABLE = 0x1,
+    OFPIT_WRITE_METADATA = 0x2,
+    OFPIT_WRITE_ACTIONS = 0x3,
+    OFPIT_APPLY_ACTIONS = 0x4,
+    OFPIT_CLEAR_ACTIONS = 0x5,
+    OFPIT_METER = 0x6,
+    OFPIT_EXPERIMENTER = 0xffff,
+};
+
+enum ofp_flow_mod_command {
+    OFPFC_ADD = 0,
+    OFPFC_MODIFY = 1,
+    OFPFC_MODIFY_STRICT = 2,
+    OFPFC_DELETE = 3,
+    OFPFC_DELETE_STRICT = 4,
+};
+
+enum ofp_flow_mod_flags {
+    OFPFF_SEND_FLOW_REM = 0x1,
+    OFPFF_CHECK_OVERLAP = 0x2,
+    OFPFF_RESET_COUNTS = 0x4,
+    OFPFF_NO_PKT_COUNTS = 0x8,
+    OFPFF_NO_BYT_COUNTS = 0x10,
+};
+
+enum ofp_group {
+    OFPG_MAX = 0xffffff00,
+    OFPG_ALL = 0xfffffffc,
+    OFPG_ANY = 0xffffffff,
+};
+
+enum ofp_group_mod_command {
+    OFPGC_ADD = 0,
+    OFPGC_MODIFY = 1,
+    OFPGC_DELETE = 2,
+};
+
+enum ofp_group_type {
+    OFPGT_ALL = 0,
+    OFPGT_SELECT = 1,
+    OFPGT_INDIRECT = 2,
+    OFPGT_FF = 3,
+};
+
+enum ofp_packet_in_reason {
+    OFPR_NO_MATCH = 0,
+    OFPR_ACTION = 1,
+    OFPR_INVALID_TTL = 2,
+};
+
+enum ofp_flow_removed_reason {
+    OFPRR_IDLE_TIMEOUT = 0,
+    OFPRR_HARD_TIMEOUT = 1,
+    OFPRR_DELETE = 2,
+    OFPRR_GROUP_DELETE = 3,
+};
+
+enum ofp_meter {
+    OFPM_MAX = 0xffff0000,
+    OFPM_SLOWPATH = 0xfffffffd,
+    OFPM_CONTROLLER = 0xfffffffe,
+    OFPM_ALL = 0xffffffff,
+};
+
+enum ofp_meter_band_type {
+    OFPMBT_DROP = 0x1,
+    OFPMBT_DSCP_REMARK = 0x2,
+    OFPMBT_EXPERIMENTER = 0xffff,
+};
+
+enum ofp_meter_mod_command {
+    OFPMC_ADD = 0,
+    OFPMC_MODIFY = 1,
+    OFPMC_DELETE = 2,
+};
+
+enum ofp_meter_flags {
+    OFPMF_KBPS = 0x1,
+    OFPMF_PKTPS = 0x2,
+    OFPMF_BURST = 0x4,
+    OFPMF_STATS = 0x8,
+};
+
+enum ofp_error_type {
+    OFPET_HELLO_FAILED = 0,
+    OFPET_BAD_REQUEST = 1,
+    OFPET_BAD_ACTION = 2,
+    OFPET_BAD_INSTRUCTION = 3,
+    OFPET_BAD_MATCH = 4,
+    OFPET_FLOW_MOD_FAILED = 5,
+    OFPET_GROUP_MOD_FAILED = 6,
+    OFPET_PORT_MOD_FAILED = 7,
+    OFPET_TABLE_MOD_FAILED = 8,
+    OFPET_QUEUE_OP_FAILED = 9,
+    OFPET_SWITCH_CONFIG_FAILED = 10,
+    OFPET_ROLE_REQUEST_FAILED = 11,
+    OFPET_METER_MOD_FAILED = 12,
+    OFPET_TABLE_FEATURES_FAILED = 13,
+    OFPET_EXPERIMENTER = 0xffff,
+};
+
+enum ofp_hello_failed_code {
+    OFPHFC_INCOMPATIBLE = 0,
+    OFPHFC_EPERM = 1,
+};
+
+enum ofp_bad_request_code {
+    OFPBRC_BAD_VERSION = 0,
+    OFPBRC_BAD_TYPE = 1,
+    OFPBRC_BAD_MULTIPART = 2,
+    OFPBRC_BAD_EXPERIMENTER = 3,
+    OFPBRC_BAD_EXP_TYPE = 4,
+    OFPBRC_EPERM = 5,
+    OFPBRC_BAD_LEN = 6,
+    OFPBRC_BUFFER_EMPTY = 7,
+    OFPBRC_BUFFER_UNKNOWN = 8,
+    OFPBRC_BAD_TABLE_ID = 9,
+    OFPBRC_IS_SLAVE = 10,
+    OFPBRC_BAD_PORT = 11,
+    OFPBRC_BAD_PACKET = 12,
+    OFPBRC_MULTIPART_BUFFER_OVERFLOW = 13,
+};
+
+enum ofp_bad_action_code {
+    OFPBAC_BAD_TYPE = 0,
+    OFPBAC_BAD_LEN = 1,
+    OFPBAC_BAD_EXPERIMENTER = 2,
+    OFPBAC_BAD_EXP_TYPE = 3,
+    OFPBAC_BAD_OUT_PORT = 4,
+    OFPBAC_BAD_ARGUMENT = 5,
+    OFPBAC_EPERM = 6,
+    OFPBAC_TOO_MANY = 7,
+    OFPBAC_BAD_QUEUE = 8,
+    OFPBAC_BAD_OUT_GROUP = 9,
+    OFPBAC_MATCH_INCONSISTENT = 10,
+    OFPBAC_UNSUPPORTED_ORDER = 11,
+    OFPBAC_BAD_TAG = 12,
+    OFPBAC_BAD_SET_TYPE = 13,
+    OFPBAC_BAD_SET_LEN = 14,
+    OFPBAC_BAD_SET_ARGUMENT = 15,
+};
+
+enum ofp_bad_instruction_code {
+    OFPBIC_UNKNOWN_INST = 0,
+    OFPBIC_UNSUP_INST = 1,
+    OFPBIC_BAD_TABLE_ID = 2,
+    OFPBIC_UNSUP_METADATA = 3,
+    OFPBIC_UNSUP_METADATA_MASK = 4,
+    OFPBIC_BAD_EXPERIMENTER = 5,
+    OFPBIC_BAD_EXP_TYPE = 6,
+    OFPBIC_BAD_LEN = 7,
+    OFPBIC_EPERM = 8,
+};
+
+enum ofp_bad_match_code {
+    OFPBMC_BAD_TYPE = 0,
+    OFPBMC_BAD_LEN = 1,
+    OFPBMC_BAD_TAG = 2,
+    OFPBMC_BAD_DL_ADDR_MASK = 3,
+    OFPBMC_BAD_NW_ADDR_MASK = 4,
+    OFPBMC_BAD_WILDCARDS = 5,
+    OFPBMC_BAD_FIELD = 6,
+    OFPBMC_BAD_VALUE = 7,
+    OFPBMC_BAD_MASK = 8,
+    OFPBMC_BAD_PREREQ = 9,
+    OFPBMC_DUP_FIELD = 10,
+    OFPBMC_EPERM = 11,
+};
+
+enum ofp_flow_mod_failed_code {
+    OFPFMFC_UNKNOWN = 0,
+    OFPFMFC_TABLE_FULL = 1,
+    OFPFMFC_BAD_TABLE_ID = 2,
+    OFPFMFC_OVERLAP = 3,
+    OFPFMFC_EPERM = 4,
+    OFPFMFC_BAD_TIMEOUT = 5,
+    OFPFMFC_BAD_COMMAND = 6,
+    OFPFMFC_BAD_FLAGS = 7,
+};
+
+enum ofp_group_mod_failed_code {
+    OFPGMFC_GROUP_EXISTS = 0,
+    OFPGMFC_INVALID_GROUP = 1,
+    OFPGMFC_WEIGHT_UNSUPPORTED = 2,
+    OFPGMFC_OUT_OF_GROUPS = 3,
+    OFPGMFC_OUT_OF_BUCKETS = 4,
+    OFPGMFC_CHAINING_UNSUPPORTED = 5,
+    OFPGMFC_WATCH_UNSUPPORTED = 6,
+    OFPGMFC_LOOP = 7,
+    OFPGMFC_UNKNOWN_GROUP = 8,
+    OFPGMFC_CHAINED_GROUP = 9,
+    OFPGMFC_BAD_TYPE = 10,
+    OFPGMFC_BAD_COMMAND = 11,
+    OFPGMFC_BAD_BUCKET = 12,
+    OFPGMFC_BAD_WATCH = 13,
+    OFPGMFC_EPERM = 14,
+};
+
+enum ofp_port_mod_failed_code {
+    OFPPMFC_BAD_PORT = 0,
+    OFPPMFC_BAD_HW_ADDR = 1,
+    OFPPMFC_BAD_CONFIG = 2,
+    OFPPMFC_BAD_ADVERTISE = 3,
+    OFPPMFC_EPERM = 4,
+};
+
+enum ofp_table_mod_failed_code {
+    OFPTMFC_BAD_TABLE = 0,
+    OFPTMFC_BAD_CONFIG = 1,
+    OFPTMFC_EPERM = 2,
+};
+
+enum ofp_queue_op_failed_code {
+    OFPQOFC_BAD_PORT = 0,
+    OFPQOFC_BAD_QUEUE = 1,
+    OFPQOFC_EPERM = 2,
+};
+
+enum ofp_switch_config_failed_code {
+    OFPSCFC_BAD_FLAGS = 0,
+    OFPSCFC_BAD_LEN = 1,
+    OFPSCFC_EPERM = 2,
+};
+
+enum ofp_role_request_failed_code {
+    OFPRRFC_STALE = 0,
+    OFPRRFC_UNSUP = 1,
+    OFPRRFC_BAD_ROLE = 2,
+};
+
+enum ofp_meter_mod_failed_code {
+    OFPMMFC_UNKNOWN = 0,
+    OFPMMFC_METER_EXISTS = 1,
+    OFPMMFC_INVALID_METER = 2,
+    OFPMMFC_UNKNOWN_METER = 3,
+    OFPMMFC_BAD_COMMAND = 4,
+    OFPMMFC_BAD_FLAGS = 5,
+    OFPMMFC_BAD_RATE = 6,
+    OFPMMFC_BAD_BURST = 7,
+    OFPMMFC_BAD_BAND = 8,
+    OFPMMFC_BAD_BAND_VALUE = 9,
+    OFPMMFC_OUT_OF_METERS = 10,
+    OFPMMFC_OUT_OF_BANDS = 11,
+};
+
+enum ofp_table_features_failed_code {
+    OFPTFFC_BAD_TABLE = 0,
+    OFPTFFC_BAD_METADATA = 1,
+    OFPTFFC_BAD_TYPE = 2,
+    OFPTFFC_BAD_LEN = 3,
+    OFPTFFC_BAD_ARGUMENT = 4,
+    OFPTFFC_EPERM = 5,
+};
+
+enum ofp_multipart_types {
+    OFPMP_DESC = 0,
+    OFPMP_FLOW = 1,
+    OFPMP_AGGREGATE = 2,
+    OFPMP_TABLE = 3,
+    OFPMP_PORT_STATS = 4,
+    OFPMP_QUEUE = 5,
+    OFPMP_GROUP = 6,
+    OFPMP_GROUP_DESC = 7,
+    OFPMP_GROUP_FEATURES = 8,
+    OFPMP_METER = 9,
+    OFPMP_METER_CONFIG = 10,
+    OFPMP_METER_FEATURES = 11,
+    OFPMP_TABLE_FEATURES = 12,
+    OFPMP_PORT_DESC = 13,
+    OFPMP_EXPERIMENTER = 0xffff,
+};
+
+enum ofp_multipart_request_flags {
+    OFPMPF_REQ_MORE = 0x1,
+};
+
+enum ofp_multipart_reply_flags {
+    OFPMPF_REPLY_MORE = 0x1,
+};
+
+enum ofp_table_feature_prop_type {
+    OFPTFPT_INSTRUCTIONS = 0,
+    OFPTFPT_INSTRUCTIONS_MISS = 1,
+    OFPTFPT_NEXT_TABLES = 2,
+    OFPTFPT_NEXT_TABLES_MISS = 3,
+    OFPTFPT_WRITE_ACTIONS = 4,
+    OFPTFPT_WRITE_ACTIONS_MISS = 5,
+    OFPTFPT_APPLY_ACTIONS = 6,
+    OFPTFPT_APPLY_ACTIONS_MISS = 7,
+    OFPTFPT_MATCH = 8,
+    OFPTFPT_WILDCARDS = 0xa,
+    OFPTFPT_WRITE_SETFIELD = 0xc,
+    OFPTFPT_WRITE_SETFIELD_MISS = 0xd,
+    OFPTFPT_APPLY_SETFIELD = 0xe,
+    OFPTFPT_APPLY_SETFIELD_MISS = 0xf,
+    OFPTFPT_EXPERIMENTER = 0xfffe,
+    OFPTFPT_EXPERIMENTER_MISS = 0xffff,
+};
+
+enum ofp_group_capabilities {
+    OFPGFC_SELECT_WEIGHT = 0x1,
+    OFPGFC_SELECT_LIVENESS = 0x2,
+    OFPGFC_CHAINING = 0x4,
+    OFPGFC_CHAINING_CHECKS = 0x8,
+};
+
+enum ofp_queue_properties {
+    OFPQT_MIN_RATE = 0x1,
+    OFPQT_MAX_RATE = 0x2,
+    OFPQT_EXPERIMENTER = 0xffff,
+};
+
+enum ofp_controller_role {
+    OFPCR_ROLE_NOCHANGE = 0,
+    OFPCR_ROLE_EQUAL = 1,
+    OFPCR_ROLE_MASTER = 2,
+    OFPCR_ROLE_SLAVE = 3,
+};
+
+enum ofp_hello_elem_type {
+    OFPHET_VERSIONBITMAP = 1,
+};
+
 struct ofp_header {
     uint8_t version;
     uint8_t type;
diff --git a/py_gen/templates/const.py b/py_gen/templates/const.py
index 93418a1..ef09585 100644
--- a/py_gen/templates/const.py
+++ b/py_gen/templates/const.py
@@ -37,12 +37,12 @@
 OFP_VERSION = ${version}
 
 :: for (group, idents) in sorted(groups.items()):
-::    idents.sort(key=lambda (ident, value): eval(value) if value != 'OFPVID_NONE' else 0)
+::    idents.sort(key=lambda (ident, value): value)
 # Identifiers from group ${group}
 ::    for (ident, value) in idents:
 ::        if version == 1 and ident.startswith('OFPP_'):
 ::        # HACK loxi converts these to 32-bit
-${ident} = ${"%#x" % (int(value, 16) & 0xffff)}
+${ident} = ${"%#x" % (value & 0xffff)}
 ::        else:
 ${ident} = ${value}
 ::        #endif
@@ -55,7 +55,7 @@
 ::                pass
 ::            elif version == 1 and ident.startswith('OFPP_'):
 ::                # HACK loxi converts these to 32-bit
-    ${"%#x" % (int(value, 16) & 0xffff)}: ${repr(ident)},
+    ${"%#x" % (value & 0xffff)}: ${repr(ident)},
 ::        else:
     ${value}: ${repr(ident)},
 ::            #endif
diff --git a/py_gen/util.py b/py_gen/util.py
index fbb2825..068a234 100644
--- a/py_gen/util.py
+++ b/py_gen/util.py
@@ -76,4 +76,4 @@
 def constant_for_value(version, group, value):
     return (["const." + v["ofp_name"] for k, v in of_g.identifiers.items()
              if k in of_g.identifiers_by_group[group] and
-                eval(v["values_by_version"].get(version, "None")) == value] or [value])[0]
+                v["values_by_version"].get(version, None) == value] or [value])[0]
diff --git a/utest/c_utils_test.py b/utest/c_utils_test.py
deleted file mode 100755
index 5b28e57..0000000
--- a/utest/c_utils_test.py
+++ /dev/null
@@ -1,66 +0,0 @@
-#!/usr/bin/python
-# Copyright 2013, Big Switch Networks, Inc.
-#
-# LoxiGen is licensed under the Eclipse Public License, version 1.0 (EPL), with
-# the following special exception:
-#
-# LOXI Exception
-#
-# As a special exception to the terms of the EPL, you may distribute libraries
-# generated by LoxiGen (LoxiGen Libraries) under the terms of your choice, provided
-# that copyright and licensing notices generated by LoxiGen are not altered or removed
-# from the LoxiGen Libraries and the notice provided below is (i) included in
-# the LoxiGen Libraries, if distributed in source code form and (ii) included in any
-# documentation for the LoxiGen Libraries, if distributed in binary form.
-#
-# Notice: "Copyright 2013, Big Switch Networks, Inc. This library was generated by the LoxiGen Compiler."
-#
-# You may not use this file except in compliance with the EPL or LOXI Exception. You may obtain
-# a copy of the EPL at:
-#
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# EPL for the specific language governing permissions and limitations
-# under the EPL.
-
-#
-# Some test code for c_utils.py
-#
-
-import sys
-sys.path.append("../loxi_front_end")
-sys.path.append("..")
-
-from c_parse_utils import *
-
-for filename in [
-    '../canonical/openflow.h-1.0',
-    '../canonical/openflow.h-1.1',
-    '../canonical/openflow.h-1.2']:
-
-    f = open(filename, 'r')
-    all_lines = f.readlines()
-    contents = " ".join(all_lines)
-
-    print "clean_up"
-    print clean_up_input(contents)
-
-#print "structs"
-#for x in extract_structs(c):
-#    print x
-
-    all_enums = extract_enums(contents)
-    print "Got %d enums for %s" % (len(all_enums), filename)
-    for x in all_enums:
-        name, entries =  extract_enum_vals(x)
-        print "Enum name %s has %d entries" % (name, len(entries))
-        for item in entries:
-            print "  key=%s, value=%s" % (item[0], str(item[1]))
-
-    all_defs = extract_defines(contents)
-    print "Got %d defines for %s" % (len(all_defs), filename)
-    for x in all_defs:
-        print "  name=%s, value=%s" % (x[0], str(x[1]))
diff --git a/utest/identifiers_test.py b/utest/identifiers_test.py
deleted file mode 100755
index e8ff2cd..0000000
--- a/utest/identifiers_test.py
+++ /dev/null
@@ -1,78 +0,0 @@
-#!/usr/bin/python
-# Copyright 2013, Big Switch Networks, Inc.
-#
-# LoxiGen is licensed under the Eclipse Public License, version 1.0 (EPL), with
-# the following special exception:
-#
-# LOXI Exception
-#
-# As a special exception to the terms of the EPL, you may distribute libraries
-# generated by LoxiGen (LoxiGen Libraries) under the terms of your choice, provided
-# that copyright and licensing notices generated by LoxiGen are not altered or removed
-# from the LoxiGen Libraries and the notice provided below is (i) included in
-# the LoxiGen Libraries, if distributed in source code form and (ii) included in any
-# documentation for the LoxiGen Libraries, if distributed in binary form.
-#
-# Notice: "Copyright 2013, Big Switch Networks, Inc. This library was generated by the LoxiGen Compiler."
-#
-# You may not use this file except in compliance with the EPL or LOXI Exception. You may obtain
-# a copy of the EPL at:
-#
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# EPL for the specific language governing permissions and limitations
-# under the EPL.
-
-#
-# Some test code for identifiers.py
-#
-
-import sys
-sys.path.append("..")
-sys.path.append("../loxi_front_end")
-sys.path.append("../loxi_utils")
-
-from identifiers import *
-
-test_dict = {}
-group_dict = {}
-
-for ver, filename in [
-    (1, '../canonical/openflow.h-1.0'),
-    (2, '../canonical/openflow.h-1.1'),
-    (3, '../canonical/openflow.h-1.2'),
-    (4, '../canonical/openflow.h-1.3')]:
-
-    f = open(filename, 'r')
-    all_lines = f.readlines()
-    contents = " ".join(all_lines)
-
-    add_identifiers(test_dict, group_dict, ver, contents)
-
-version_list = [1,2,3,4]
-print "Merged %d entries from files" % len(test_dict)
-
-for ident, info in test_dict.items():
-    print """
-Name %s:
-  common %s
-  num vals %d
-  all agree %s
-  defined agree %s
-  ofp name %s
-  group %s""" % (ident, str(info["common_value"]), 
-                  len(info["values_by_version"]),
-                  all_versions_agree(test_dict, version_list, ident),
-                  defined_versions_agree(test_dict, version_list, ident),
-                  info["ofp_name"], info["ofp_group"])
-
-    for version, value in info["values_by_version"].items():
-        print "  version %d value %s" % (version, value)
-
-for ident, loxi_list in group_dict.items():
-    print "Group %s:" % ident
-    for loxi_name in loxi_list:
-        print "   %s" % loxi_name
diff --git a/utest/of_h_utils_test.py b/utest/of_h_utils_test.py
deleted file mode 100755
index 0a4a6f9..0000000
--- a/utest/of_h_utils_test.py
+++ /dev/null
@@ -1,54 +0,0 @@
-#!/usr/bin/python
-# Copyright 2013, Big Switch Networks, Inc.
-#
-# LoxiGen is licensed under the Eclipse Public License, version 1.0 (EPL), with
-# the following special exception:
-#
-# LOXI Exception
-#
-# As a special exception to the terms of the EPL, you may distribute libraries
-# generated by LoxiGen (LoxiGen Libraries) under the terms of your choice, provided
-# that copyright and licensing notices generated by LoxiGen are not altered or removed
-# from the LoxiGen Libraries and the notice provided below is (i) included in
-# the LoxiGen Libraries, if distributed in source code form and (ii) included in any
-# documentation for the LoxiGen Libraries, if distributed in binary form.
-#
-# Notice: "Copyright 2013, Big Switch Networks, Inc. This library was generated by the LoxiGen Compiler."
-#
-# You may not use this file except in compliance with the EPL or LOXI Exception. You may obtain
-# a copy of the EPL at:
-#
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# EPL for the specific language governing permissions and limitations
-# under the EPL.
-
-#
-# Some test code for of_h_utils.py
-#
-
-import sys
-sys.path.append("..")
-sys.path.append("../loxi_front_end")
-sys.path.append("../loxi_utils")
-
-from of_h_utils import *
-
-for filename, version in [
-    ('../canonical/openflow.h-1.0', 1),
-    ('../canonical/openflow.h-1.1', 2),
-    ('../canonical/openflow.h-1.2', 3),
-    ('../canonical/openflow.h-1.3', 4)]:
-
-    f = open(filename, 'r')
-    all_lines = f.readlines()
-    contents = " ".join(all_lines)
-
-    enum_dict = get_enum_dict(version, contents)
-    print "Got %d LOXI entries %s" % (len(enum_dict), filename)
-    for name, entry in enum_dict.items():
-        print "Enum %s:\n  ofp_name: %s.\n  ofp_group: %s.\n  value: %s" % (
-            name, entry.ofp_name, entry.ofp_group, str(entry.value))
diff --git a/utest/test_parser.py b/utest/test_parser.py
index 75e0c5d..33ba545 100755
--- a/utest/test_parser.py
+++ b/utest/test_parser.py
@@ -83,6 +83,46 @@
         self.assertEquals(ast.asList(),
             [['struct', 'foo', [['list(of_action_t)', 'bar']]]])
 
+class EnumTests(unittest.TestCase):
+    def test_empty(self):
+        src = """\
+enum foo {
+};
+"""
+        ast = parser.parse(src)
+        self.assertEquals(ast.asList(), [['enum', 'foo', []]])
+
+    def test_one(self):
+        src = """\
+enum foo {
+    BAR = 1
+};
+"""
+        ast = parser.parse(src)
+        self.assertEquals(ast.asList(), [['enum', 'foo', [['BAR', 1]]]])
+
+    def test_multiple(self):
+        src = """\
+enum foo {
+    OFP_A = 1,
+    OFP_B = 2,
+    OFP_C = 3
+};
+"""
+        ast = parser.parse(src)
+        self.assertEquals(ast.asList(), [['enum', 'foo', [['OFP_A', 1], ['OFP_B', 2], ['OFP_C', 3]]]])
+
+    def test_trailing_comma(self):
+        src = """\
+enum foo {
+    OFP_A = 1,
+    OFP_B = 2,
+    OFP_C = 3,
+};
+"""
+        ast = parser.parse(src)
+        self.assertEquals(ast.asList(), [['enum', 'foo', [['OFP_A', 1], ['OFP_B', 2], ['OFP_C', 3]]]])
+
 class TestMetadata(unittest.TestCase):
     def test_version(self):
         src = """\
