This allows OF1.5 prototyping to take place in a natural way.
Signed-off-by: Ben Pfaff <blp@nicira.com>
A: The following table lists the versions of OpenFlow supported by
each version of Open vSwitch:
- Open vSwitch OF1.0 OF1.1 OF1.2 OF1.3 OF1.4
- =============== ===== ===== ===== ===== =====
- 1.9 and earlier yes --- --- --- ---
- 1.10 yes --- [*] [*] ---
- 1.11 yes --- [*] [*] ---
- 2.0 yes [*] [*] [*] ---
- 2.1 yes [*] [*] [*] ---
- 2.2 yes [*] [*] [*] [%]
- 2.3 yes yes yes yes [*]
+ Open vSwitch OF1.0 OF1.1 OF1.2 OF1.3 OF1.4 OF1.5
+ =============== ===== ===== ===== ===== ===== =====
+ 1.9 and earlier yes --- --- --- --- ---
+ 1.10 yes --- [*] [*] --- ---
+ 1.11 yes --- [*] [*] --- ---
+ 2.0 yes [*] [*] [*] --- ---
+ 2.1 yes [*] [*] [*] --- ---
+ 2.2 yes [*] [*] [*] [%] [*]
+ 2.3 yes yes yes yes [*] [*]
[*] Supported, with one or more missing features.
[%] Experimental, unsafe implementation.
Open vSwitch 2.3 enables OpenFlow 1.0, 1.1, 1.2, and 1.3 by default
in ovs-vswitchd. In Open vSwitch 1.10 through 2.2, OpenFlow 1.1,
1.2, and 1.3 must be enabled manually in ovs-vswitchd. OpenFlow
- 1.4 is also supported, with missing features, in Open vSwitch 2.3
- and later, but not enabled by default. In any case, the user may
- override the default:
+ 1.4 and 1.5 are also supported, with missing features, in Open
+ vSwitch 2.3 and later, but not enabled by default. In any case,
+ the user may override the default:
- To enable OpenFlow 1.0, 1.1, 1.2, and 1.3 on bridge br0:
ovs-vsctl set bridge br0 protocols=OpenFlow10,OpenFlow11,OpenFlow12,OpenFlow13
- - To enable OpenFlow 1.0, 1.1, 1.2, 1.3, and 1.4 on bridge br0:
+ - To enable OpenFlow 1.0, 1.1, 1.2, 1.3, 1.4, and 1.5 on bridge br0:
- ovs-vsctl set bridge br0 protocols=OpenFlow10,OpenFlow11,OpenFlow12,OpenFlow13,OpenFlow14
+ ovs-vsctl set bridge br0 protocols=OpenFlow10,OpenFlow11,OpenFlow12,OpenFlow13,OpenFlow14,OpenFlow15
- To enable only OpenFlow 1.0 on bridge br0:
1.4 that could cause crashes. We don't recommend enabling it.)
OPENFLOW-1.1+ in the Open vSwitch source tree tracks support for
- OpenFlow 1.1 and later features. When support for OpenFlow 1.4 is
- solidly implemented, Open vSwitch will enable that version by
- default.
+ OpenFlow 1.1 and later features. When support for OpenFlow 1.4 and
+ 1.5 is solidly implemented, Open vSwitch will enable those version
+ by default. Also, the OpenFlow 1.5 specification is still under
+ development and thus subject to change.
Q: Does Open vSwitch support MPLS?
"1.1": 0x02,
"1.2": 0x03,
"1.3": 0x04,
- "1.4": 0x05}
+ "1.4": 0x05,
+ "1.5": 0x06}
version_reverse_map = dict((v, k) for (k, v) in version_map.iteritems())
token = None
line = ""
-OFP10_VERSION = 0x01
-OFP11_VERSION = 0x02
-OFP12_VERSION = 0x03
-OFP13_VERSION = 0x04
-OFP14_VERSION = 0x05
+# Maps from user-friendly version number to its protocol encoding.
+VERSION = {"1.0": 0x01,
+ "1.1": 0x02,
+ "1.2": 0x03,
+ "1.3": 0x04,
+ "1.4": 0x05,
+ "1.5": 0x06}
NX_VENDOR_ID = 0x00002320
OFPT11_STATS_REPLY = 19
OFPST_VENDOR = 0xffff
-version_map = {"1.0": (OFP10_VERSION, OFP10_VERSION),
- "1.1": (OFP11_VERSION, OFP11_VERSION),
- "1.2": (OFP12_VERSION, OFP12_VERSION),
- "1.3": (OFP13_VERSION, OFP13_VERSION),
- "1.4": (OFP14_VERSION, OFP14_VERSION),
- "1.0+": (OFP10_VERSION, OFP14_VERSION),
- "1.1+": (OFP11_VERSION, OFP14_VERSION),
- "1.2+": (OFP12_VERSION, OFP14_VERSION),
- "1.3+": (OFP13_VERSION, OFP14_VERSION),
- "1.4+": (OFP14_VERSION, OFP14_VERSION),
- "1.0-1.1": (OFP10_VERSION, OFP11_VERSION),
- "1.0-1.2": (OFP10_VERSION, OFP12_VERSION),
- "1.1-1.2": (OFP11_VERSION, OFP12_VERSION),
- "1.1-1.3": (OFP11_VERSION, OFP13_VERSION),
- "<all>": (0x01, 0xff)}
+def decode_version_range(range):
+ if range in VERSION:
+ return (VERSION[range], VERSION[range])
+ elif range.endswith('+'):
+ return (VERSION[range[:-1]], max(VERSION.values()))
+ elif range == '<all>':
+ return (0x01, 0xff)
+ else:
+ a, b = re.match(r'^([^-]+)-([^-]+)$', range).groups()
+ return (VERSION[a], VERSION[b])
def get_line():
global line
vinfix, name = m.groups()
rawname = 'OFPRAW_%s%s_%s' % (type_, vinfix, name)
- min_version, max_version = version_map[versions]
+ min_version, max_version = decode_version_range(versions)
human_name = '%s_%s' % (type_, name)
if type_.endswith('ST'):
if number == OFPT_VENDOR:
fatal("OFPT (%d) is used for vendor extensions"
% number)
- elif (version == OFP10_VERSION
+ elif (version == VERSION["1.0"]
and (number == OFPT10_STATS_REQUEST
or number == OFPT10_STATS_REPLY)):
fatal("OFPT 1.0 (%d) is used for stats messages"
% number)
- elif (version != OFP10_VERSION
+ elif (version != VERSION["1.0"]
and (number == OFPT11_STATS_REQUEST
or number == OFPT11_STATS_REPLY)):
fatal("OFPT 1.1+ (%d) is used for stats messages"
% number)
hdrs = (version, number, 0, 0, 0)
elif type_ == 'OFPST' and name.endswith('_REQUEST'):
- if version == OFP10_VERSION:
+ if version == VERSION["1.0"]:
hdrs = (version, OFPT10_STATS_REQUEST, number, 0, 0)
else:
hdrs = (version, OFPT11_STATS_REQUEST, number, 0, 0)
elif type_ == 'OFPST' and name.endswith('_REPLY'):
- if version == OFP10_VERSION:
+ if version == VERSION["1.0"]:
hdrs = (version, OFPT10_STATS_REPLY, number, 0, 0)
else:
hdrs = (version, OFPT11_STATS_REPLY, number, 0, 0)
elif type_ == 'NXT':
hdrs = (version, OFPT_VENDOR, 0, NX_VENDOR_ID, number)
elif type_ == 'NXST' and name.endswith('_REQUEST'):
- if version == OFP10_VERSION:
+ if version == VERSION["1.0"]:
hdrs = (version, OFPT10_STATS_REQUEST, OFPST_VENDOR,
NX_VENDOR_ID, number)
else:
hdrs = (version, OFPT11_STATS_REQUEST, OFPST_VENDOR,
NX_VENDOR_ID, number)
elif type_ == 'NXST' and name.endswith('_REPLY'):
- if version == OFP10_VERSION:
+ if version == VERSION["1.0"]:
hdrs = (version, OFPT10_STATS_REPLY, OFPST_VENDOR,
NX_VENDOR_ID, number)
else:
if r['type'].endswith("ST"):
for hdrs in r['hdrs']:
op_hdrs = list(hdrs)
- if hdrs[0] == OFP10_VERSION:
+ if hdrs[0] == VERSION["1.0"]:
if hdrs[1] == OFPT10_STATS_REQUEST:
op_hdrs[1] = OFPT10_STATS_REPLY
elif hdrs[1] == OFPT10_STATS_REPLY:
OFP11_VERSION = 0x02,
OFP12_VERSION = 0x03,
OFP13_VERSION = 0x04,
- OFP14_VERSION = 0x05
-
- /* When we add real support for these versions, add them to the enum so
- * that we get compiler warnings everywhere we might forget to provide
- * support. Until then, keep them as macros to avoid those warnings. */
-#define OFP15_VERSION 0x06
+ OFP14_VERSION = 0x05,
+ OFP15_VERSION = 0x06
};
/* Vendor (aka experimenter) IDs.
return &ofperr_of13;
case OFP14_VERSION:
return &ofperr_of14;
+ case OFP15_VERSION:
+ return &ofperr_of15;
default:
return NULL;
}
/*
- * Copyright (c) 2012, 2013 Nicira, Inc.
+ * Copyright (c) 2012, 2013, 2014 Nicira, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
case OFP12_VERSION:
case OFP13_VERSION:
case OFP14_VERSION:
+ case OFP15_VERSION:
return type == OFPT11_STATS_REQUEST;
}
case OFP12_VERSION:
case OFP13_VERSION:
case OFP14_VERSION:
+ case OFP15_VERSION:
return type == OFPT11_STATS_REPLY;
}
case OFP12_VERSION:
case OFP13_VERSION:
case OFP14_VERSION:
+ case OFP15_VERSION:
if (hdrs->type == OFPT11_STATS_REQUEST ||
hdrs->type == OFPT11_STATS_REPLY) {
return (hdrs->stat == OFPST_VENDOR
case OFP12_VERSION:
case OFP13_VERSION:
case OFP14_VERSION:
+ case OFP15_VERSION:
ovs_assert(hdrs.type == OFPT11_STATS_REQUEST);
hdrs.type = OFPT11_STATS_REPLY;
break;
case OFP12_VERSION:
case OFP13_VERSION:
case OFP14_VERSION:
+ case OFP15_VERSION:
return &((struct ofp11_stats_msg *) oh)->flags;
default:
OVS_NOT_REACHED();
break;
case OFP13_VERSION:
case OFP14_VERSION:
+ case OFP15_VERSION:
return; /* no ports in ofp13_switch_features */
default:
OVS_NOT_REACHED();
int verbosity)
{
switch ((enum ofp_version)oh->version) {
+ case OFP15_VERSION:
case OFP14_VERSION:
case OFP13_VERSION:
ofp_print_ofpst_table_reply13(string, oh, verbosity);
case OFP14_VERSION:
ds_put_cstr(string, " (OF1.4)");
break;
+ case OFP15_VERSION:
+ ds_put_cstr(string, " (OF1.5)");
+ break;
default:
ds_put_format(string, " (OF 0x%02"PRIx8")", oh->version);
break;
case OFPUTIL_P_OF12_OXM:
case OFPUTIL_P_OF13_OXM:
case OFPUTIL_P_OF14_OXM:
+ case OFPUTIL_P_OF15_OXM:
return NXM_TYPICAL_LEN;
default:
case OFPUTIL_P_OF12_OXM:
case OFPUTIL_P_OF13_OXM:
case OFPUTIL_P_OF14_OXM:
+ case OFPUTIL_P_OF15_OXM:
return oxm_put_match(b, match);
}
#define N_PROTO_ABBREVS ARRAY_SIZE(proto_abbrevs)
enum ofputil_protocol ofputil_flow_dump_protocols[] = {
+ OFPUTIL_P_OF15_OXM,
OFPUTIL_P_OF14_OXM,
OFPUTIL_P_OF13_OXM,
OFPUTIL_P_OF12_OXM,
return OFPUTIL_P_OF13_OXM;
case OFP14_VERSION:
return OFPUTIL_P_OF14_OXM;
+ case OFP15_VERSION:
+ return OFPUTIL_P_OF15_OXM;
default:
return 0;
}
return OFP13_VERSION;
case OFPUTIL_P_OF14_OXM:
return OFP14_VERSION;
+ case OFPUTIL_P_OF15_OXM:
+ return OFP15_VERSION;
}
OVS_NOT_REACHED();
case OFPUTIL_P_OF14_OXM:
return OFPUTIL_P_OF14_OXM;
+ case OFPUTIL_P_OF15_OXM:
+ return OFPUTIL_P_OF15_OXM;
+
default:
OVS_NOT_REACHED();
}
case OFPUTIL_P_OF14_OXM:
return ofputil_protocol_set_tid(OFPUTIL_P_OF14_OXM, tid);
+ case OFPUTIL_P_OF15_OXM:
+ return ofputil_protocol_set_tid(OFPUTIL_P_OF15_OXM, tid);
+
default:
OVS_NOT_REACHED();
}
case OFPUTIL_P_OF14_OXM:
return "OXM-OpenFlow14";
+
+ case OFPUTIL_P_OF15_OXM:
+ return "OXM-OpenFlow15";
}
/* Check abbreviations. */
if (!strcasecmp(s, "OpenFlow14")) {
return OFP14_VERSION;
}
+ if (!strcasecmp(s, "OpenFlow15")) {
+ return OFP15_VERSION;
+ }
return 0;
}
return "OpenFlow13";
case OFP14_VERSION:
return "OpenFlow14";
+ case OFP15_VERSION:
+ return "OpenFlow15";
default:
OVS_NOT_REACHED();
}
case OFPUTIL_P_OF12_OXM:
case OFPUTIL_P_OF13_OXM:
case OFPUTIL_P_OF14_OXM:
+ case OFPUTIL_P_OF15_OXM:
/* There is only one variant of each OpenFlow 1.1+ protocol, and we
* verified above that we're not trying to change versions. */
OVS_NOT_REACHED();
case OFPUTIL_P_OF11_STD:
case OFPUTIL_P_OF12_OXM:
case OFPUTIL_P_OF13_OXM:
- case OFPUTIL_P_OF14_OXM: {
+ case OFPUTIL_P_OF14_OXM:
+ case OFPUTIL_P_OF15_OXM: {
struct ofp11_flow_mod *ofm;
int tailroom;
case OFPUTIL_P_OF11_STD:
case OFPUTIL_P_OF12_OXM:
case OFPUTIL_P_OF13_OXM:
- case OFPUTIL_P_OF14_OXM: {
+ case OFPUTIL_P_OF14_OXM:
+ case OFPUTIL_P_OF15_OXM: {
struct ofp11_flow_stats_request *ofsr;
raw = (fsr->aggregate
case OFPUTIL_P_OF11_STD:
case OFPUTIL_P_OF12_OXM:
case OFPUTIL_P_OF13_OXM:
- case OFPUTIL_P_OF14_OXM: {
+ case OFPUTIL_P_OF14_OXM:
+ case OFPUTIL_P_OF15_OXM: {
struct ofp12_flow_removed *ofr;
msg = ofpraw_alloc_xid(OFPRAW_OFPT11_FLOW_REMOVED,
case OFPUTIL_P_OF12_OXM:
case OFPUTIL_P_OF13_OXM:
case OFPUTIL_P_OF14_OXM:
+ case OFPUTIL_P_OF15_OXM:
packet = ofputil_encode_ofp12_packet_in(pin, protocol);
break;
}
case OFP14_VERSION:
+ case OFP15_VERSION:
ofputil_put_ofp14_port(pp, b);
break;
case OFP12_VERSION:
case OFP13_VERSION:
case OFP14_VERSION:
+ case OFP15_VERSION:
return OFPC_COMMON | OFPC12_PORT_BLOCKED;
default:
/* Caller needs to check osf->header.version itself */
break;
case OFP13_VERSION:
case OFP14_VERSION:
+ case OFP15_VERSION:
raw = OFPRAW_OFPT13_FEATURES_REPLY;
break;
default:
break;
case OFP13_VERSION:
case OFP14_VERSION:
+ case OFP15_VERSION:
osf->auxiliary_id = features->auxiliary_id;
/* fall through */
case OFP11_VERSION:
break;
case OFP14_VERSION:
+ case OFP15_VERSION:
raw = OFPRAW_OFPT14_PORT_STATUS;
break;
opm->advertise = netdev_port_features_to_ofp11(pm->advertise);
break;
}
- case OFP14_VERSION: {
+ case OFP14_VERSION:
+ case OFP15_VERSION: {
struct ofp14_port_mod_prop_ethernet *eth;
struct ofp14_port_mod *opm;
"(\'-O OpenFlow13\')");
case OFP13_VERSION:
case OFP14_VERSION:
+ case OFP15_VERSION:
request = ofpraw_alloc(OFPRAW_OFPST13_TABLE_FEATURES_REQUEST,
ofp_version, 0);
break;
otm->config = htonl(pm->config);
break;
}
- case OFP14_VERSION: {
+ case OFP14_VERSION:
+ case OFP15_VERSION: {
struct ofp14_table_mod *otm;
b = ofpraw_alloc(OFPRAW_OFPT14_TABLE_MOD, ofp_version, 0);
case OFP13_VERSION:
case OFP14_VERSION:
+ case OFP15_VERSION:
ofputil_put_ofp13_table_stats(&stats[i], reply);
break;
case OFP11_VERSION:
case OFP12_VERSION:
case OFP13_VERSION:
- case OFP14_VERSION:{
+ case OFP14_VERSION:
+ case OFP15_VERSION: {
struct ofp11_packet_out *opo;
size_t len;
enum ofpraw type;
switch (ofp_version) {
+ case OFP15_VERSION:
case OFP14_VERSION:
case OFP13_VERSION:
case OFP12_VERSION:
return op ? ofputil_decode_ofp11_port(pp, op) : EOF;
}
case OFP14_VERSION:
+ case OFP15_VERSION:
return ofpbuf_size(b) ? ofputil_pull_ofp14_port(pp, b) : EOF;
default:
OVS_NOT_REACHED();
case OFP11_VERSION:
case OFP12_VERSION:
case OFP13_VERSION:
- case OFP14_VERSION:{
+ case OFP14_VERSION:
+ case OFP15_VERSION: {
struct ofp11_port_stats_request *req;
request = ofpraw_alloc(OFPRAW_OFPST11_PORT_REQUEST, ofp_version, 0);
req = ofpbuf_put_zeros(request, sizeof *req);
}
case OFP14_VERSION:
+ case OFP15_VERSION:
ofputil_append_ofp14_port_stats(ops, replies);
break;
ofp_port_t *ofp10_port)
{
switch ((enum ofp_version)request->version) {
+ case OFP15_VERSION:
case OFP14_VERSION:
case OFP13_VERSION:
case OFP12_VERSION:
case OFP11_VERSION:
case OFP12_VERSION:
case OFP13_VERSION:
- case OFP14_VERSION: {
+ case OFP14_VERSION:
+ case OFP15_VERSION: {
struct ofp11_group_stats_request *req;
request = ofpraw_alloc(OFPRAW_OFPST11_GROUP_REQUEST, ofp_version, 0);
req = ofpbuf_put_zeros(request, sizeof *req);
case OFP12_VERSION:
case OFP13_VERSION:
case OFP14_VERSION:
+ case OFP15_VERSION:
request = ofpraw_alloc(OFPRAW_OFPST11_GROUP_DESC_REQUEST, ofp_version, 0);
break;
default:
}
case OFP13_VERSION:
- case OFP14_VERSION:{
+ case OFP14_VERSION:
+ case OFP15_VERSION: {
struct ofp13_group_stats *gs13;
length = sizeof *gs13 + bucket_counter_size;
case OFP12_VERSION:
case OFP13_VERSION:
case OFP14_VERSION:
+ case OFP15_VERSION:
request = ofpraw_alloc(OFPRAW_OFPST12_GROUP_FEATURES_REQUEST,
ofp_version, 0);
break;
case OFP12_VERSION:
case OFP13_VERSION:
case OFP14_VERSION:
+ case OFP15_VERSION:
b = ofpraw_alloc(OFPRAW_OFPT11_GROUP_MOD, ofp_version, 0);
start_ogm = ofpbuf_size(b);
ofpbuf_put_zeros(b, sizeof *ogm);
struct ofputil_queue_stats_request *oqsr)
{
switch ((enum ofp_version)request->version) {
+ case OFP15_VERSION:
case OFP14_VERSION:
case OFP13_VERSION:
case OFP12_VERSION:
case OFP11_VERSION:
case OFP12_VERSION:
case OFP13_VERSION:
- case OFP14_VERSION: {
+ case OFP14_VERSION:
+ case OFP15_VERSION: {
struct ofp11_queue_stats_request *req;
request = ofpraw_alloc(OFPRAW_OFPST11_QUEUE_REQUEST, ofp_version, 0);
req = ofpbuf_put_zeros(request, sizeof *req);
break;
}
- case OFP14_VERSION: {
+ case OFP14_VERSION:
+ case OFP15_VERSION: {
struct ofp14_queue_stats *reply = ofpmp_append(replies, sizeof *reply);
ofputil_queue_stats_to_ofp14(oqs, reply);
break;
OFPUTIL_P_OF12_OXM = 1 << 5,
OFPUTIL_P_OF13_OXM = 1 << 6,
OFPUTIL_P_OF14_OXM = 1 << 7,
-#define OFPUTIL_P_ANY_OXM (OFPUTIL_P_OF12_OXM | OFPUTIL_P_OF13_OXM | OFPUTIL_P_OF14_OXM)
+ OFPUTIL_P_OF15_OXM = 1 << 8,
+#define OFPUTIL_P_ANY_OXM (OFPUTIL_P_OF12_OXM | \
+ OFPUTIL_P_OF13_OXM | \
+ OFPUTIL_P_OF14_OXM | \
+ OFPUTIL_P_OF15_OXM)
#define OFPUTIL_P_NXM_OF11_UP (OFPUTIL_P_OF10_NXM_ANY | OFPUTIL_P_OF11_STD | \
OFPUTIL_P_ANY_OXM)
#define OFPUTIL_P_OF12_UP (OFPUTIL_P_OF12_OXM | OFPUTIL_P_OF13_UP)
#define OFPUTIL_P_OF13_UP (OFPUTIL_P_OF13_OXM | OFPUTIL_P_OF14_UP)
-#define OFPUTIL_P_OF14_UP OFPUTIL_P_OF14_OXM
+#define OFPUTIL_P_OF14_UP (OFPUTIL_P_OF14_OXM | OFPUTIL_P_OF15_UP)
+#define OFPUTIL_P_OF15_UP OFPUTIL_P_OF15_OXM
/* All protocols. */
-#define OFPUTIL_P_ANY ((1 << 8) - 1)
+#define OFPUTIL_P_ANY ((1 << 9) - 1)
/* Protocols in which a specific table may be specified in flow_mods. */
#define OFPUTIL_P_TID (OFPUTIL_P_OF10_STD_TID | \
OpenFlow 1.2: vendor 0, type 3, code 5
OpenFlow 1.3: vendor 0, type 3, code 5
OpenFlow 1.4: vendor 0, type 3, code 5
+OpenFlow 1.5: vendor 0, type 3, code 5
])
AT_CHECK([ovs-ofctl print-error OFPBIC_BAD_EXP_TYPE], [0], [dnl
OpenFlow 1.1: vendor 0, type 3, code 5
OpenFlow 1.2: vendor 0, type 3, code 6
OpenFlow 1.3: vendor 0, type 3, code 6
OpenFlow 1.4: vendor 0, type 3, code 6
+OpenFlow 1.5: vendor 0, type 3, code 6
])
AT_CLEANUP
/ofproto|INFO|datapath ID changed to fedcba9876543210/d']])
dnl Add bridges, ports, etc.
- AT_CHECK([ovs-vsctl -- add-br br0 -- set bridge br0 datapath-type=dummy other-config:datapath-id=fedcba9876543210 other-config:hwaddr=aa:55:aa:55:00:00 protocols=[[OpenFlow10,OpenFlow11,OpenFlow12,OpenFlow13,OpenFlow14]] fail-mode=secure -- $1 m4_if([$2], [], [], [| ${PERL} $srcdir/uuidfilt.pl])], [0], [$2])
+ AT_CHECK([ovs-vsctl -- add-br br0 -- set bridge br0 datapath-type=dummy other-config:datapath-id=fedcba9876543210 other-config:hwaddr=aa:55:aa:55:00:00 protocols=[[OpenFlow10,OpenFlow11,OpenFlow12,OpenFlow13,OpenFlow14,OpenFlow15]] fail-mode=secure -- $1 m4_if([$2], [], [], [| ${PERL} $srcdir/uuidfilt.pl])], [0], [$2])
])
m4_divert_push([PREPARE_TESTS])
case OFP12_VERSION:
case OFP13_VERSION:
case OFP14_VERSION:
+ case OFP15_VERSION:
break;
default:
OVS_NOT_REACHED();
{"name": "Open_vSwitch",
- "version": "7.5.0",
- "cksum": "1448369194 20560",
+ "version": "7.6.0",
+ "cksum": "1731605290 20602",
"tables": {
"Open_vSwitch": {
"columns": {
"OpenFlow11",
"OpenFlow12",
"OpenFlow13",
- "OpenFlow14"]]},
+ "OpenFlow14",
+ "OpenFlow15"]]},
"min": 0, "max": "unlimited"}},
"fail_mode": {
"type": {"key": {"type": "string",
OpenFlow 1.4 is not enabled by default because its implementation is
missing features.
</p>
+
+ <p>
+ OpenFlow 1.5 has the same risks as OpenFlow 1.4, but it is even more
+ experimental because the OpenFlow 1.5 specification is still under
+ development and thus subject to change. Pass
+ <code>--enable-of15</code> to <code>ovs-vswitchd</code> to allow
+ OpenFlow 1.5 to be enabled.
+ </p>
</column>
</group>