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