This is the 2nd patch of a series of 4 patches:

1/4: OpenFlow 1.2 bug fixes
2/4: Initial OpenFlow 1.3 support
3/4: OF13 TUNNEL_ID support (also on OF12 protocol)
4/4: NXPIF_OPENFLOW13 to allow OF13 packet_in to be used over OF12 (adds 
support for the matching flow cookie)

    Initial OpenFlow 1.3 support with new OXM definitions and ofp13_packet_in 
encoding and decoding.
    None of the other messages that differ from 1.2 are yet implemented.

 include/openflow/automake.mk       |    1 +
 include/openflow/openflow-1.3.h    |   49 ++++++++++++++++++++++++++
 include/openflow/openflow-common.h |    1 +
 include/openflow/openflow.h        |    1 +
 lib/ofp-errors.c                   |    3 +-
 lib/ofp-msgs.h                     |    3 ++
 lib/ofp-util.c                     |  129 
+++++++++++++++++++++++++++++++++++++++++++++++++++++--------------
 lib/ofp-util.h                     |   12 ++++---
 8 files changed, 167 insertions(+), 32 deletions(-)
 create mode 100644 include/openflow/openflow-1.3.h

diff --git a/include/openflow/automake.mk b/include/openflow/automake.mk
index 38e8eef..f891086 100644
--- a/include/openflow/automake.mk
+++ b/include/openflow/automake.mk
@@ -3,6 +3,7 @@ noinst_HEADERS += \
        include/openflow/openflow-1.0.h \
        include/openflow/openflow-1.1.h \
        include/openflow/openflow-1.2.h \
+       include/openflow/openflow-1.3.h \
        include/openflow/openflow-common.h \
        include/openflow/openflow.h
 
diff --git a/include/openflow/openflow-1.3.h b/include/openflow/openflow-1.3.h
new file mode 100644
index 0000000..345a5da
--- /dev/null
+++ b/include/openflow/openflow-1.3.h
@@ -0,0 +1,49 @@
+/* OpenFlow: protocol between controller and datapath. */
+
+#ifndef OPENFLOW_13_H
+#define OPENFLOW_13_H 1
+
+#include "openflow/openflow-1.2.h"
+
+/* OXM Flow match field types for OpenFlow basic class. */
+enum oxm13_ofb_match_fields {
+    OFPXMT13_OFB_MPLS_BOS      = 36, /* MPLS BoS bit. */
+    OFPXMT13_OFB_PBB_ISID      = 37, /* PBB I-SID. */
+    OFPXMT13_OFB_TUNNEL_ID     = 38, /* Logical Port Metadata */
+    OFPXMT13_OFB_IPV6_EXTHDR   = 39, /* IPv6 Extension Header pseudo-field */
+
+    /* End Marker */
+    OFPXMT13_OFB_MAX,
+};
+
+#define OFPXMT13_MASK ((1ULL << OFPXMT13_OFB_MAX) - 1)
+
+#define OXM_OF_MPLS_BOS              OXM_HEADER   (OFPXMT13_OFB_MPLS_BOS, 1)
+#define OXM_OF_PBB_ISID              OXM_HEADER   (OFPXMT13_OFB_PBB_ISID, 4)
+#define OXM_OF_PBB_ISID_W     OXM_HEADER_W (OFPXMT13_OFB_PBB_ISID, 4)
+#define OXM_OF_TUNNEL_ID      OXM_HEADER   (OFPXMT13_OFB_TUNNEL_ID, 8)
+#define OXM_OF_TUNNEL_ID_W    OXM_HEADER_W (OFPXMT13_OFB_TUNNEL_ID, 8)
+#define OXM_OF_IPV6_EXTHDR    OXM_HEADER   (OFPXMT13_OFB_IPV6_EXTHDR, 2)
+#define OXM_OF_IPV6_EXTHDR_W  OXM_HEADER_W (OFPXMT13_OFB_IPV6_EXTHDR, 2)
+
+/* Packet received on port (datapath -> controller). */
+struct ofp13_packet_in {
+    ovs_be32 buffer_id;     /* ID assigned by datapath. */
+    ovs_be16 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 */
+    ovs_be64 cookie;       /* Cookie of the flow entry that was looked up */
+    /* Followed by:
+     *   - Match
+     *   - 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.
+     */
+    /* struct ofp12_match match; */
+    /* uint8_t pad[2];         Align to 64 bit + 16 bit */
+    /* uint8_t data[0];        Ethernet frame */
+};
+OFP_ASSERT(sizeof(struct ofp13_packet_in) == 16);
+
+#endif /* openflow/openflow-1.3.h */
diff --git a/include/openflow/openflow-common.h 
b/include/openflow/openflow-common.h
index 462b2fc..7314445 100644
--- a/include/openflow/openflow-common.h
+++ b/include/openflow/openflow-common.h
@@ -75,6 +75,7 @@ enum ofp_version {
     OFP10_VERSION = 0x01,
     OFP11_VERSION = 0x02,
     OFP12_VERSION = 0x03,
+    OFP13_VERSION = 0x04,
 };
 
 #define OFP_MAX_TABLE_NAME_LEN 32
diff --git a/include/openflow/openflow.h b/include/openflow/openflow.h
index b2516c0..d5a78fe 100644
--- a/include/openflow/openflow.h
+++ b/include/openflow/openflow.h
@@ -20,5 +20,6 @@
 #include "openflow/openflow-1.0.h"
 #include "openflow/openflow-1.1.h"
 #include "openflow/openflow-1.2.h"
+#include "openflow/openflow-1.3.h"
 
 #endif /* openflow/openflow.h */
diff --git a/lib/ofp-errors.c b/lib/ofp-errors.c
index 2c71312..a5a1d62 100644
--- a/lib/ofp-errors.c
+++ b/lib/ofp-errors.c
@@ -24,7 +24,7 @@ struct pair {
 static const struct ofperr_domain *
 ofperr_domain_from_version(enum ofp_version version)
 {
-    switch (version) {
+    switch (version) { /* FIXME: Need work for OFP13_VERSION */
     case OFP10_VERSION:
         return &ofperr_of10;
     case OFP11_VERSION:
@@ -257,6 +257,7 @@ ofperr_encode_hello(enum ofperr error, enum ofp_version 
ofp_version,
     case OFP10_VERSION:
     case OFP11_VERSION:
     case OFP12_VERSION:
+    case OFP13_VERSION:
         break;
 
     default:
diff --git a/lib/ofp-msgs.h b/lib/ofp-msgs.h
index 557524d..f9c860f 100644
--- a/lib/ofp-msgs.h
+++ b/lib/ofp-msgs.h
@@ -146,6 +146,8 @@ enum ofpraw {
     OFPRAW_OFPT11_PACKET_IN,
     /* OFPT 1.2 (10): struct ofp12_packet_in, uint8_t[]. */
     OFPRAW_OFPT12_PACKET_IN,
+    /* OFPT 1.3 (10): struct ofp13_packet_in, uint8_t[]. */
+    OFPRAW_OFPT13_PACKET_IN,
     /* NXT 1.0+ (17): struct nx_packet_in, uint8_t[]. */
     OFPRAW_NXT_PACKET_IN,
 
@@ -369,6 +371,7 @@ enum ofptype {
     OFPTYPE_PACKET_IN,           /* OFPRAW_OFPT10_PACKET_IN.
                                   * OFPRAW_OFPT11_PACKET_IN.
                                   * OFPRAW_OFPT12_PACKET_IN.
+                                  * OFPRAW_OFPT13_PACKET_IN.
                                   * OFPRAW_NXT_PACKET_IN. */
     OFPTYPE_FLOW_REMOVED,        /* OFPRAW_OFPT10_FLOW_REMOVED.
                                   * OFPRAW_OFPT11_FLOW_REMOVED.
diff --git a/lib/ofp-util.c b/lib/ofp-util.c
index 1071457..c5452e9 100644
--- a/lib/ofp-util.c
+++ b/lib/ofp-util.c
@@ -602,7 +602,7 @@ size_t ofputil_n_flow_dump_protocols = 
ARRAY_SIZE(ofputil_flow_dump_protocols);
 enum ofputil_protocol
 ofputil_protocol_from_ofp_version(enum ofp_version version)
 {
-    switch (version) {
+    switch (version) { /* FIXME: Need work for OFP13_VERSION */
     case OFP10_VERSION:
         return OFPUTIL_P_OF10_STD;
     case OFP12_VERSION:
@@ -614,7 +614,8 @@ ofputil_protocol_from_ofp_version(enum ofp_version version)
 }
 
 /* Returns the OpenFlow protocol version number (e.g. OFP10_VERSION,
- * OFP11_VERSION or OFP12_VERSION) that corresponds to 'protocol'. */
+ * OFP11_VERSION, OFP12_VERSION, or OFP13_VERSION) that corresponds
+ * to 'protocol'. */
 enum ofp_version
 ofputil_protocol_to_ofp_version(enum ofputil_protocol protocol)
 {
@@ -626,6 +627,8 @@ ofputil_protocol_to_ofp_version(enum ofputil_protocol 
protocol)
         return OFP10_VERSION;
     case OFPUTIL_P_OF12_OXM:
         return OFP12_VERSION;
+    case OFPUTIL_P_OF13_OXM:
+        return OFP13_VERSION;
     }
 
     NOT_REACHED();
@@ -664,6 +667,9 @@ ofputil_protocol_set_tid(enum ofputil_protocol protocol, 
bool enable)
     case OFPUTIL_P_OF12_OXM:
         return OFPUTIL_P_OF12_OXM;
 
+    case OFPUTIL_P_OF13_OXM:
+        return OFPUTIL_P_OF13_OXM;
+
     default:
         NOT_REACHED();
     }
@@ -698,6 +704,9 @@ ofputil_protocol_set_base(enum ofputil_protocol cur,
     case OFPUTIL_P_OF12_OXM:
         return ofputil_protocol_set_tid(OFPUTIL_P_OF12_OXM, tid);
 
+    case OFPUTIL_P_OF13_OXM:
+        return ofputil_protocol_set_tid(OFPUTIL_P_OF13_OXM, tid);
+
     default:
         NOT_REACHED();
     }
@@ -728,6 +737,9 @@ ofputil_protocol_to_string(enum ofputil_protocol protocol)
 
     case OFPUTIL_P_OF12_OXM:
         return "OXM";
+
+    case OFPUTIL_P_OF13_OXM:
+        return "OpenFlow13";
     }
 
     /* Check abbreviations. */
@@ -928,6 +940,8 @@ ofputil_version_to_string(enum ofp_version ofp_version)
         return "OpenFlow11";
     case OFP12_VERSION:
         return "OpenFlow12";
+    case OFP13_VERSION:
+        return "OpenFlow13";
     default:
         NOT_REACHED();
     }
@@ -1269,8 +1283,9 @@ ofputil_encode_set_protocol(enum ofputil_protocol current,
             return ofputil_encode_nx_set_flow_format(NXFF_OPENFLOW10);
 
         case OFPUTIL_P_OF12_OXM:
-            /* There's only one OpenFlow 1.2 protocol and we already verified
-             * above that we're not trying to change versions. */
+        case OFPUTIL_P_OF13_OXM:
+            /* There are only one of each OpenFlow 1.2+ protocols and we 
already
+             * verified above that we're not trying to change versions. */
             NOT_REACHED();
 
         case OFPUTIL_P_OF10_STD_TID:
@@ -1542,10 +1557,12 @@ ofputil_encode_flow_mod(const struct ofputil_flow_mod 
*fm,
     struct ofpbuf *msg;
 
     switch (protocol) {
-    case OFPUTIL_P_OF12_OXM: {
+    case OFPUTIL_P_OF12_OXM:
+    case OFPUTIL_P_OF13_OXM: {
         struct ofp11_flow_mod *ofm;
 
-        msg = ofpraw_alloc(OFPRAW_OFPT11_FLOW_MOD, OFP12_VERSION,
+        msg = ofpraw_alloc(OFPRAW_OFPT11_FLOW_MOD, 
+                           ofputil_protocol_to_ofp_version(protocol),
                            NXM_TYPICAL_LEN + fm->ofpacts_len);
         ofm = ofpbuf_put_zeros(msg, sizeof *ofm);
         if (fm->command == OFPFC_ADD) {
@@ -1762,13 +1779,15 @@ ofputil_encode_flow_stats_request(const struct 
ofputil_flow_stats_request *fsr,
     enum ofpraw raw;
 
     switch (protocol) {
-    case OFPUTIL_P_OF12_OXM: {
+    case OFPUTIL_P_OF12_OXM:
+    case OFPUTIL_P_OF13_OXM: {
         struct ofp11_flow_stats_request *ofsr;
 
         raw = (fsr->aggregate
                ? OFPRAW_OFPST11_AGGREGATE_REQUEST
                : OFPRAW_OFPST11_FLOW_REQUEST);
-        msg = ofpraw_alloc(raw, OFP12_VERSION, NXM_TYPICAL_LEN);
+        msg = ofpraw_alloc(raw, ofputil_protocol_to_ofp_version(protocol),
+                          NXM_TYPICAL_LEN);
         ofsr = ofpbuf_put_zeros(msg, sizeof *ofsr);
         ofsr->table_id = fsr->table_id;
         ofsr->out_port = ofputil_port_to_ofp11(fsr->out_port);
@@ -2245,7 +2264,8 @@ ofputil_encode_flow_removed(const struct 
ofputil_flow_removed *fr,
     struct ofpbuf *msg;
 
     switch (protocol) {
-    case OFPUTIL_P_OF12_OXM: {
+    case OFPUTIL_P_OF12_OXM:
+    case OFPUTIL_P_OF13_OXM: {
         struct ofp12_flow_removed *ofr;
 
         msg = ofpraw_alloc_xid(OFPRAW_OFPT11_FLOW_REMOVED,
@@ -2339,7 +2359,30 @@ ofputil_decode_packet_in(struct ofputil_packet_in *pin,
 
     ofpbuf_use_const(&b, oh, ntohs(oh->length));
     raw = ofpraw_pull_assert(&b);
-    if (raw == OFPRAW_OFPT12_PACKET_IN) {
+    if (raw == OFPRAW_OFPT13_PACKET_IN) {
+        const struct ofp13_packet_in *opi;
+        struct match match;
+        int error;
+
+        opi = ofpbuf_pull(&b, sizeof *opi);
+        error = oxm_pull_match_loose(&b, &match);
+        if (error) {
+            return error;
+        }
+
+        if (!ofpbuf_try_pull(&b, 2)) {
+            return OFPERR_OFPBRC_BAD_LEN;
+        }
+
+        pin->reason = opi->reason;
+        pin->table_id = opi->table_id;
+        pin->cookie = opi->cookie;
+
+        pin->buffer_id = ntohl(opi->buffer_id);
+        pin->total_len = ntohs(opi->total_len);
+
+        ofputil_decode_packet_in_finish(pin, &match, &b);
+    } else if (raw == OFPRAW_OFPT12_PACKET_IN) {
         const struct ofp12_packet_in *opi;
         struct match match;
         int error;
@@ -2438,14 +2481,14 @@ ofputil_encode_packet_in(const struct ofputil_packet_in 
*pin,
     struct ofpbuf *packet;
 
     /* Add OFPT_PACKET_IN. */
-    if (protocol == OFPUTIL_P_OF12_OXM) {
-        struct ofp12_packet_in *opi;
+    if (protocol == OFPUTIL_P_OF13_OXM) {
+        struct ofp13_packet_in *opi;
         struct match match;
 
         ofputil_packet_in_to_match(pin, &match);
 
         /* The final argument is just an estimate of the space required. */
-        packet = ofpraw_alloc_xid(OFPRAW_OFPT12_PACKET_IN, OFP12_VERSION,
+        packet = ofpraw_alloc_xid(OFPRAW_OFPT13_PACKET_IN, OFP13_VERSION,
                                   htonl(0), (sizeof(struct flow_metadata) * 2
                                              + 2 + send_len));
         ofpbuf_put_zeros(packet, sizeof *opi);
@@ -2458,6 +2501,27 @@ ofputil_encode_packet_in(const struct ofputil_packet_in 
*pin,
         opi->total_len = htons(pin->total_len);
         opi->reason = pin->reason;
         opi->table_id = pin->table_id;
+        opi->cookie = pin->cookie;        
+    } else if (protocol == OFPUTIL_P_OF12_OXM) {
+        struct ofp12_packet_in *opi;
+        struct match match;
+ 
+        ofputil_packet_in_to_match(pin, &match);
+ 
+        /* The final argument is just an estimate of the space required. */
+        packet = ofpraw_alloc_xid(OFPRAW_OFPT12_PACKET_IN, OFP12_VERSION,
+                                  htonl(0), (sizeof(struct flow_metadata) * 2
+                                             + 2 + send_len));
+        ofpbuf_put_zeros(packet, sizeof *opi);
+        oxm_put_match(packet, &match);
+        ofpbuf_put_zeros(packet, 2);
+        ofpbuf_put(packet, pin->packet, send_len);
+ 
+        opi = packet->l3;
+        opi->buffer_id = htonl(pin->buffer_id);
+        opi->total_len = htons(pin->total_len);
+        opi->reason = pin->reason;
+        opi->table_id = pin->table_id;
    } else if (packet_in_format == NXPIF_OPENFLOW10) {
         struct ofp_packet_in *opi;
 
@@ -2727,6 +2791,7 @@ ofputil_get_phy_port_size(enum ofp_version ofp_version)
         return sizeof(struct ofp10_phy_port);
     case OFP11_VERSION:
     case OFP12_VERSION:
+    case OFP13_VERSION:
         return sizeof(struct ofp11_port);
     default:
         NOT_REACHED();
@@ -2789,7 +2854,8 @@ ofputil_put_phy_port(enum ofp_version ofp_version,
     }
 
     case OFP11_VERSION:
-    case OFP12_VERSION: {
+    case OFP12_VERSION:
+    case OFP13_VERSION: {
         struct ofp11_port *op;
         if (b->size + sizeof *op <= UINT16_MAX) {
             op = ofpbuf_put_uninit(b, sizeof *op);
@@ -2818,7 +2884,8 @@ ofputil_append_port_desc_stats_reply(enum ofp_version 
ofp_version,
     }
 
     case OFP11_VERSION:
-    case OFP12_VERSION: {
+    case OFP12_VERSION:
+    case OFP13_VERSION: {
         struct ofp11_port *op;
 
         op = ofpmp_append(replies, sizeof *op);
@@ -2887,6 +2954,7 @@ ofputil_capabilities_mask(enum ofp_version ofp_version)
     case OFP11_VERSION:
         return OFPC_COMMON | OFPC_ARP_MATCH_IP;
     case OFP12_VERSION:
+    case OFP13_VERSION:
         return OFPC_COMMON | OFPC12_PORT_BLOCKED;
     default:
         /* Caller needs to check osf->header.version itself */
@@ -3000,7 +3068,7 @@ ofputil_encode_switch_features(const struct 
ofputil_switch_features *features,
     enum ofpraw raw;
 
     version = ofputil_protocol_to_ofp_version(protocol);
-    switch (version) {
+    switch (version) { /* FIXME: Need work for OFP13_VERSION */
     case OFP10_VERSION:
         raw = OFPRAW_OFPT10_FEATURES_REPLY;
         break;
@@ -3020,7 +3088,7 @@ ofputil_encode_switch_features(const struct 
ofputil_switch_features *features,
     osf->capabilities = htonl(features->capabilities & OFPC_COMMON);
     osf->capabilities = htonl(features->capabilities &
                               ofputil_capabilities_mask(version));
-    switch (version) {
+    switch (version) {  /* FIXME: Need work for OFP13_VERSION */
     case OFP10_VERSION:
         if (features->capabilities & OFPUTIL_C_STP) {
             osf->capabilities |= htonl(OFPC10_STP);
@@ -3100,6 +3168,7 @@ ofputil_encode_port_status(const struct 
ofputil_port_status *ps,
 
     case OFP11_VERSION:
     case OFP12_VERSION:
+    case OFP13_VERSION:
         raw = OFPRAW_OFPT11_PORT_STATUS;
         break;
 
@@ -3183,7 +3252,8 @@ ofputil_encode_port_mod(const struct ofputil_port_mod *pm,
     }
 
     case OFP11_VERSION:
-    case OFP12_VERSION: {
+    case OFP12_VERSION:
+    case OFP13_VERSION: {
         struct ofp11_port_mod *opm;
 
         b = ofpraw_alloc(OFPRAW_OFPT11_PORT_MOD, ofp_version, 0);
@@ -3316,7 +3386,7 @@ ofputil_encode_table_stats_reply(const struct 
ofp12_table_stats stats[], int n,
 
     reply = ofpraw_alloc_stats_reply(request, n * sizeof *stats);
 
-    switch ((enum ofp_version) request->version) {
+    switch ((enum ofp_version) request->version) {  /* FIXME: Need work for 
OFP13_VERSION */
     case OFP10_VERSION:
         for (i = 0; i < n; i++) {
             ofputil_put_ofp10_table_stats(&stats[i], reply);
@@ -3629,7 +3699,8 @@ ofputil_encode_packet_out(const struct ofputil_packet_out 
*po,
     }
 
     case OFP11_VERSION:
-    case OFP12_VERSION: {
+    case OFP12_VERSION:
+    case OFP13_VERSION: {
         struct ofp11_packet_out *opo;
         size_t len;
 
@@ -3687,6 +3758,7 @@ ofputil_encode_barrier_request(enum ofp_version 
ofp_version)
     enum ofpraw type;
 
     switch (ofp_version) {
+    case OFP13_VERSION:
     case OFP12_VERSION:
     case OFP11_VERSION:
         type = OFPRAW_OFPT11_BARRIER_REQUEST;
@@ -3913,7 +3985,8 @@ ofputil_pull_phy_port(enum ofp_version ofp_version, 
struct ofpbuf *b,
         return opp ? ofputil_decode_ofp10_phy_port(pp, opp) : EOF;
     }
     case OFP11_VERSION:
-    case OFP12_VERSION: {
+    case OFP12_VERSION:
+    case OFP13_VERSION: {
         const struct ofp11_port *op = ofpbuf_try_pull(b, sizeof *op);
         return op ? ofputil_decode_ofp11_port(pp, op) : EOF;
     }
@@ -4212,7 +4285,7 @@ ofputil_parse_key_value(char **stringp, char **keyp, char 
**valuep)
 }
 
 /* Encode a dump ports request for 'port', the encoded message
- * will be fore Open Flow version 'ofp_version'. Returns message
+ * will be for Open Flow version 'ofp_version'. Returns message
  * as a struct ofpbuf. Returns encoded message on success, NULL on error */
 struct ofpbuf *
 ofputil_encode_dump_ports_request(enum ofp_version ofp_version, int16_t port)
@@ -4228,7 +4301,8 @@ ofputil_encode_dump_ports_request(enum ofp_version 
ofp_version, int16_t port)
         break;
     }
     case OFP11_VERSION:
-    case OFP12_VERSION: {
+    case OFP12_VERSION:
+    case OFP13_VERSION: {
         struct ofp11_port_stats_request *req;
         request = ofpraw_alloc(OFPRAW_OFPST11_PORT_REQUEST, ofp_version, 0);
         req = ofpbuf_put_zeros(request, sizeof *req);
@@ -4290,7 +4364,7 @@ ofputil_append_port_stat(struct list *replies,
     struct ofpbuf *msg = ofpbuf_from_list(list_back(replies));
     struct ofp_header *oh = msg->data;
 
-    switch ((enum ofp_version)oh->version) {
+    switch ((enum ofp_version)oh->version) {  /* FIXME: Need work for 
OFP13_VERSION */
     case OFP12_VERSION:
     case OFP11_VERSION: {
         struct ofp11_port_stats *reply = ofpmp_append(replies, sizeof *reply);
@@ -4435,6 +4509,7 @@ ofputil_decode_port_stats_request(const struct ofp_header 
*request,
                                   uint16_t *ofp10_port)
 {
     switch ((enum ofp_version)request->version) {
+    case OFP13_VERSION:
     case OFP12_VERSION:
     case OFP11_VERSION: {
         const struct ofp11_port_stats_request *psr11 = ofpmsg_body(request);
@@ -4459,6 +4534,7 @@ ofputil_decode_queue_stats_request(const struct 
ofp_header *request,
                                    struct ofputil_queue_stats_request *oqsr)
 {
     switch ((enum ofp_version)request->version) {
+    case OFP13_VERSION:
     case OFP12_VERSION:
     case OFP11_VERSION: {
         const struct ofp11_queue_stats_request *qsr11 = ofpmsg_body(request);
@@ -4489,7 +4565,8 @@ ofputil_encode_queue_stats_request(enum ofp_version 
ofp_version,
 
     switch (ofp_version) {
     case OFP11_VERSION:
-    case OFP12_VERSION: {
+    case OFP12_VERSION:
+    case OFP13_VERSION: {
         struct ofp11_queue_stats_request *req;
         request = ofpraw_alloc(OFPRAW_OFPST11_QUEUE_REQUEST, ofp_version, 0);
         req = ofpbuf_put_zeros(request, sizeof *req);
@@ -4640,7 +4717,7 @@ ofputil_append_queue_stat(struct list *replies,
     struct ofpbuf *msg = ofpbuf_from_list(list_back(replies));
     struct ofp_header *oh = msg->data;
 
-    switch ((enum ofp_version)oh->version) {
+    switch ((enum ofp_version)oh->version) {  /* FIXME: Need work for 
OFP13_VERSION */
     case OFP12_VERSION:
     case OFP11_VERSION: {
         struct ofp11_queue_stats *reply = ofpmp_append(replies, sizeof 
*reply);;
diff --git a/lib/ofp-util.h b/lib/ofp-util.h
index 053cd84..88f849f 100644
--- a/lib/ofp-util.h
+++ b/lib/ofp-util.h
@@ -77,22 +77,24 @@ enum ofputil_protocol {
 #define OFPUTIL_P_OF10_STD_ANY (OFPUTIL_P_OF10_STD | OFPUTIL_P_OF10_STD_TID)
 #define OFPUTIL_P_OF10_NXM_ANY (OFPUTIL_P_OF10_NXM | OFPUTIL_P_OF10_NXM_TID)
 
-    /* OpenFlow 1.2 protocol (only one variant).
+    /* OpenFlow 1.2+ protocols (only one variant each).
      *
-     * This uses the standard OpenFlow Extensible Match (OXM) flow format.
+     * These use the standard OpenFlow Extensible Match (OXM) flow format.
      *
-     * OpenFlow 1.2 always operates with an equivalent of the
+     * OpenFlow 1.2+ always operates with an equivalent of the
      * nx_flow_mod_table_id Nicira extension enabled, so there is no "TID"
      * variant. */
     OFPUTIL_P_OF12_OXM      = 1 << 4,
+    OFPUTIL_P_OF13_OXM      = 1 << 5,
 
     /* All protocols. */
-#define OFPUTIL_P_ANY ((1 << 5) - 1)
+#define OFPUTIL_P_ANY ((1 << 6) - 1)
 
     /* Protocols in which a specific table may be specified in flow_mods. */
 #define OFPUTIL_P_TID (OFPUTIL_P_OF10_STD_TID | \
                        OFPUTIL_P_OF10_NXM_TID | \
-                       OFPUTIL_P_OF12_OXM)
+                       OFPUTIL_P_OF12_OXM | \
+                       OFPUTIL_P_OF13_OXM)
 };
 
 /* Protocols to use for flow dumps, from most to least preferred. */

_______________________________________________
dev mailing list
[email protected]
http://openvswitch.org/mailman/listinfo/dev

Reply via email to