--- openflow-2012-02-29-3.h	2015-07-23 09:54:17.084479359 -0700
+++ openflow-2012-02-29-4.h	2015-07-23 09:54:17.092479360 -0700
@@ -130,9 +130,9 @@
     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 */
+    /* 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 */
@@ -1415,10 +1415,11 @@
 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_MULTIPART    = 2,  /* ofp_multipart_request.type not supported. */
     OFPBRC_BAD_EXPERIMENTER = 3,  /* Experimenter id not supported
                                    * (in ofp_experimenter_header or
-                                   * ofp_stats_request or ofp_stats_reply). */
+                                   * 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. */
@@ -1635,66 +1636,66 @@
 };
 OFP_ASSERT(sizeof(struct ofp_error_experimenter_msg) == 16);
 
-enum ofp_stats_types {
+enum ofp_multipart_types {
     /* Description of this OpenFlow switch.
      * The request body is empty.
-     * The reply body is struct ofp_desc_stats. */
-    OFPST_DESC = 0,
+     * 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. */
-    OFPST_FLOW = 1,
+    OFPMP_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,
+    OFPMP_AGGREGATE = 2,
 
     /* Flow table statistics.
      * The request body is empty.
      * The reply body is an array of struct ofp_table_stats. */
-    OFPST_TABLE = 3,
+    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. */
-    OFPST_PORT = 4,
+    OFPMP_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,
+    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. */
-    OFPST_GROUP = 6,
+    OFPMP_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,
+    OFPMP_GROUP_DESC = 7,
 
     /* Group features.
      * The request body is empty.
-     * The reply body is struct ofp_group_features_stats. */
-    OFPST_GROUP_FEATURES = 8,
+     * The reply body is struct ofp_group_features. */
+    OFPMP_GROUP_FEATURES = 8,
 
     /* Meter statistics.
      * The request body is struct ofp_meter_stats_requests.
      * The reply body is struct ofp_meter_stats. */
-    OFPST_METER,
+    OFPMP_METER = 9,
 
     /* Meter configuration.
      * The request body is struct ofp_meter_stats_requests.
      * The reply body is struct ofp_meter_config_stats. */
-    OFPST_METER_CONFIG,
+    OFPMP_METER_CONFIG = 10,
 
     /* Meter features.
      * The request body is empty.
      * The reply body is struct ofp_meter_features_stats. */
-    OFPST_METER_FEATURES,
+    OFPMP_METER_FEATURES = 11,
 
     /* Table features.
      * The request body is either empty or contains an array of
@@ -1702,51 +1703,51 @@
      * 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. */
-    OFPST_TABLE_FEATURES = 12,
+    OFPMP_TABLE_FEATURES = 12,
 
     /* Experimenter extension.
      * The request and reply bodies begin with
-     * struct ofp_experimenter_stats_header.
+     * struct ofp_experimenter_multipart_header.
      * The request and reply bodies are otherwise experimenter-defined. */
-    OFPST_EXPERIMENTER = 0xffff
+    OFPMP_EXPERIMENTER = 0xffff
 };
 
-struct ofp_stats_request {
+struct ofp_multipart_request {
     struct ofp_header header;
-    uint16_t type;              /* One of the OFPST_* constants. */
-    uint16_t flags;             /* OFPSF_REQ_* flags (none yet defined). */
+    uint16_t type;              /* One of the OFPMP_* constants. */
+    uint16_t flags;             /* OFPMPF_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);
+OFP_ASSERT(sizeof(struct ofp_multipart_request) == 16);
 
-enum ofp_stats_reply_flags {
-    OFPSF_REPLY_MORE  = 1 << 0  /* More replies to follow. */
+enum ofp_multipart_reply_flags {
+    OFPMPF_REPLY_MORE  = 1 << 0  /* More replies to follow. */
 };
 
-struct ofp_stats_reply {
+struct ofp_multipart_reply {
     struct ofp_header header;
-    uint16_t type;              /* One of the OFPST_* constants. */
-    uint16_t flags;             /* OFPSF_REPLY_* flags. */
+    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_stats_reply) == 16);
+OFP_ASSERT(sizeof(struct ofp_multipart_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
+/* Body of reply to OFPMP_DESC request.  Each entry is a NULL-terminated
  * ASCII string. */
-struct ofp_desc_stats {
+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_stats) == 1056);
+OFP_ASSERT(sizeof(struct ofp_desc) == 1056);
 
-/* Body for ofp_stats_request of type OFPST_FLOW. */
+/* 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. */
@@ -1767,7 +1768,7 @@
 };
 OFP_ASSERT(sizeof(struct ofp_flow_stats_request) == 40);
 
-/* Body of reply to OFPST_FLOW request. */
+/* 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. */
@@ -1788,7 +1789,7 @@
 };
 OFP_ASSERT(sizeof(struct ofp_flow_stats) == 56);
 
-/* Body for ofp_stats_request of type OFPST_AGGREGATE. */
+/* 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. */
@@ -1809,7 +1810,7 @@
 };
 OFP_ASSERT(sizeof(struct ofp_aggregate_stats_request) == 40);
 
-/* Body of reply to OFPST_AGGREGATE request. */
+/* 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. */
@@ -1897,7 +1898,7 @@
 };
 OFP_ASSERT(sizeof(struct ofp_table_features) == 88);
 
-/* Body of reply to OFPST_TABLE request. */
+/* Body of reply to OFPMP_TABLE request. */
 struct ofp_table_stats {
     uint8_t table_id;        /* Identifier of table.  Lower numbered tables
                                 are consulted first. */
@@ -1908,9 +1909,9 @@
 };
 OFP_ASSERT(sizeof(struct ofp_table_stats) == 24);
 
-/* Body for ofp_stats_request of type OFPST_PORT. */
+/* Body for ofp_multipart_request of type OFPMP_PORT. */
 struct ofp_port_stats_request {
-    uint32_t port_no;        /* OFPST_PORT message must request statistics
+    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). */
@@ -1918,7 +1919,7 @@
 };
 OFP_ASSERT(sizeof(struct ofp_port_stats_request) == 8);
 
-/* Body of reply to OFPST_PORT request. If a counter is unsupported, set
+/* 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;
@@ -1947,7 +1948,7 @@
 };
 OFP_ASSERT(sizeof(struct ofp_port_stats) == 112);
 
-/* Body of OFPST_GROUP request. */
+/* 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. */
@@ -1961,7 +1962,7 @@
 };
 OFP_ASSERT(sizeof(struct ofp_bucket_counter) == 16);
 
-/* Body of reply to OFPST_GROUP request. */
+/* 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. */
@@ -1978,7 +1979,7 @@
 };
 OFP_ASSERT(sizeof(struct ofp_group_stats) == 40);
 
-/* Body of reply to OFPST_GROUP_DESC request. */
+/* 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_*. */
@@ -1996,14 +1997,14 @@
     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 {
+/* 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_stats) == 40);
+OFP_ASSERT(sizeof(struct ofp_group_features) == 40);
 
 /* Body of OFPST_METER request. */
 struct ofp_meter_stats_request {
@@ -2056,14 +2057,14 @@
 };
 OFP_ASSERT(sizeof(struct ofp_meter_features_stats) == 16);
 
-/* Body for ofp_stats_request/reply of type OFPST_EXPERIMENTER. */
-struct ofp_experimenter_stats_header {
+/* 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_stats_header) == 8);
+OFP_ASSERT(sizeof(struct ofp_experimenter_multipart_header) == 8);
 
 /* Experimenter extension. */
 struct ofp_experimenter_header {
