version_map = {"1.0": 0x01,
"1.1": 0x02,
"1.2": 0x03,
- "1.3": 0x04}
+ "1.3": 0x04,
+ "1.4": 0x05,
+ "1.5": 0x06}
version_reverse_map = dict((v, k) for (k, v) in version_map.iteritems())
token = None
fatal("%s: duplicate vendor id for vendors %s and %s"
% (id_, vendor_reverse_map[id_], name))
vendor_reverse_map[id_] = name
-
+
def extract_ofp_errors(fn):
error_types = {}
% (version1_name, version2_name,
version2_name, version1_name))
- if vendor == vendor_map['NX']:
+ if vendor == vendor_map['OF']:
+ # All standard OpenFlow errors have a type and a code.
+ if code is None:
+ fatal("%s: %s domain requires code" % (dst, vendor_name))
+ elif vendor == vendor_map['NX']:
+ # Before OpenFlow 1.2, OVS used a Nicira extension to
+ # define errors that included a type and a code.
+ #
+ # In OpenFlow 1.2 and later, Nicira extension errors
+ # are defined using the OpenFlow experimenter error
+ # mechanism that includes a type but not a code.
+ if v1 < version_map['1.2'] or v2 < version_map['1.2']:
+ if code is None:
+ fatal("%s: NX1.0 and NX1.1 domains require code"
+ % (dst, vendor_name))
if v1 >= version_map['1.2'] or v2 >= version_map['1.2']:
if code is not None:
fatal("%s: NX1.2+ domains do not have codes" % dst)
- code = 0
- elif vendor != vendor_map['OF']:
+ else:
+ # Experimenter extension error for OF1.2+ only.
+ if v1 < version_map['1.2']:
+ fatal("%s: %s domain not supported before OF1.2"
+ % (dst, vendor_name))
if code is not None:
- fatal("%s: %s domains do not have codes" % vendor_name)
+ fatal("%s: %s domains do not have codes"
+ % (dst, vendor_name))
+ if code is None:
+ code = 0
for version in range(v1, v2 + 1):
domain[version].setdefault(vendor, {})
if enum not in map:
continue
vendor, type_, code = map[enum]
- if code is None:
- continue
value = (vendor << 32) | (type_ << 16) | code
if value in found:
continue