Merge remote-tracking branch 'upstream/master' into java-bundle-improvements
diff --git a/c_gen/build_of_g.py b/c_gen/build_of_g.py
index ff2dfe8..ace386d 100755
--- a/c_gen/build_of_g.py
+++ b/c_gen/build_of_g.py
@@ -202,13 +202,7 @@
                 if type(m) == OFPadMember:
                     continue
                 else:
-                    # HACK the C backend does not yet support of_oxm_t
-                    if m.oftype == 'of_oxm_t':
-                        m_type = 'of_oxm_header_t'
-                    # HACK the C backend does not yet support of_bsn_vport_t
-                    elif m.oftype == 'of_bsn_vport_t':
-                        m_type = 'of_bsn_vport_header_t'
-                    elif m.oftype.find("list(") == 0:
+                    if m.oftype.find("list(") == 0:
                         (list_name, base_type) = loxi_utils.list_name_extract(m.oftype)
                         m_type = list_name + "_t"
                     else:
@@ -248,19 +242,6 @@
     Add information computed from the input, including offsets and
     lengths of struct members and the set of list and action_id types.
     """
-
-    # Generate header classes for inheritance parents
-    for wire_version, ordered_classes in of_g.ordered_classes.items():
-        classes = versions[of_g.of_version_wire2name[wire_version]]['classes']
-        for cls in ordered_classes:
-            if type_maps.class_is_inheritance_root(cls):
-                new_cls = cls + '_header'
-                of_g.ordered_classes[wire_version].append(new_cls)
-                classes[new_cls] = classes[cls]
-                of_g.base_length[(new_cls, wire_version)] = of_g.base_length[(cls, wire_version)]
-                if (cls, wire_version) in of_g.is_fixed_length:
-                    of_g.is_fixed_length.add((cls, wire_version))
-
     # Create lists
     for version, protocol in loxi_globals.ir.items():
         lists = set()
diff --git a/c_gen/c_code_gen.py b/c_gen/c_code_gen.py
index 239034a..968d939 100644
--- a/c_gen/c_code_gen.py
+++ b/c_gen/c_code_gen.py
@@ -753,7 +753,6 @@
  * Per-class static delete functions
  * Per-class, per-member accessor declarations
  * Per-class structure definitions
- * Generic union (inheritance) definitions
  * Pointer set function declarations
  * Some special case macros
  *
@@ -966,38 +965,14 @@
 #
 ################################################################
 
-def gen_generics(out):
-    for (cls, subclasses) in type_maps.inheritance_map.items():
-        out.write("""
-/**
- * Inheritance super class for %(cls)s
- *
- * This class is the union of %(cls)s classes.  You can refer
- * to it untyped by refering to the member 'header' whose structure
- * is common across all sub-classes.
- */
-
-union %(cls)s_u {
-    %(cls)s_header_t header; /* Generic instance */
-""" % dict(cls=cls))
-        for subcls in sorted(subclasses):
-            instance = loxi_utils.class_to_instance(subcls, cls)
-            out.write("    %s_%s_t %s;\n" % (cls, instance, instance))
-        out.write("};\n")
-
 def gen_struct_typedefs(out):
     """
     Generate typedefs for all struct objects
     @param out The file for output, already open
     """
 
-    out.write("\n/* LOCI inheritance parent typedefs */\n")
-    for cls in type_maps.inheritance_map:
-        out.write("typedef union %(cls)s_u %(cls)s_t;\n" % dict(cls=cls))
     out.write("\n/* LOCI object typedefs */\n")
     for cls in of_g.standard_class_order:
-        if type_maps.class_is_inheritance_root(cls):
-            continue
         template = "typedef of_object_t %(cls)s_t;\n"
         out.write(template % dict(cls=cls))
 
@@ -1036,7 +1011,7 @@
  ****************************************************************/
 """)
     for cls in of_g.standard_class_order:
-        if type_maps.class_is_inheritance_root(cls):
+        if type_maps.class_is_virtual(cls) and not loxi_utils.class_is_list(cls):
             continue
         out.write("\n/* Unified accessor functions for %s */\n" % cls)
         for m_name in of_g.ordered_members[cls]:
@@ -1076,13 +1051,13 @@
             e_type = loxi_utils.list_to_entry_type(cls)
             out.write("""
 extern int %(cls)s_first(
-    %(cls)s_t *list, of_list_iter_t iter);
+    %(cls)s_t *list, of_object_t *iter);
 extern int %(cls)s_next(
-    %(cls)s_t *list, of_list_iter_t iter);
+    %(cls)s_t *list, of_object_t *iter);
 extern int %(cls)s_append_bind(
-    %(cls)s_t *list, of_list_iter_t iter);
+    %(cls)s_t *list, of_object_t *iter);
 extern int %(cls)s_append(
-    %(cls)s_t *list, of_list_iter_t iter);
+    %(cls)s_t *list, of_object_t *iter);
 
 /**
  * Iteration macro for list of type %(cls)s
@@ -1224,7 +1199,7 @@
     LOCI_ASSERT(cur_len + abs_offset <= WBUF_CURRENT_BYTES(wbuf));
     OF_TRY(of_match_deserialize(ver, %(m_name)s, obj, offset, cur_len));
 """ % dict(m_name=m_name))
-    elif m_type == "of_oxm_header_t":
+    elif m_type == "of_oxm_t":
         out.write("""
     /* Initialize child */
     %(m_type)s_init(%(m_name)s, obj->version, 0, 1);
@@ -1232,7 +1207,7 @@
     of_object_attach(obj, %(m_name)s, offset, cur_len);
     of_object_wire_init(%(m_name)s, OF_OXM, 0);
 """ % dict(m_type=m_type[:-2], m_name=m_name))
-    elif m_type == "of_bsn_vport_header_t":
+    elif m_type == "of_bsn_vport_t":
         out.write("""
     /* Initialize child */
     %(m_type)s_init(%(m_name)s, obj->version, 0, 1);
@@ -1715,8 +1690,6 @@
  ****************************************************************/
 """)
     for cls in of_g.standard_class_order:
-#        if type_maps.class_is_inheritance_root(cls):
-#            continue
         out.write("""
 /**
  * Delete an object of type %(cls)s_t
@@ -1774,8 +1747,8 @@
     out.write("/* DOCUMENTATION ONLY */\n")
 
     for cls in of_g.standard_class_order:
-        if type_maps.class_is_inheritance_root(cls):
-            pass # Check this
+        if type_maps.class_is_virtual(cls):
+            pass
 
         out.write("""
 /**
diff --git a/c_gen/c_dump_gen.py b/c_gen/c_dump_gen.py
index a9074af..799dc09 100644
--- a/c_gen/c_dump_gen.py
+++ b/c_gen/c_dump_gen.py
@@ -90,7 +90,7 @@
         for cls in of_g.standard_class_order:
             if not loxi_utils.class_in_version(cls, version):
                 continue
-            if type_maps.class_is_inheritance_root(cls):
+            if type_maps.class_is_virtual(cls):
                 continue
             out.write("""\
 int %(cls)s_%(ver_name)s_dump(loci_writer_f writer, void* cookie, of_object_t *obj);
@@ -129,7 +129,7 @@
         for cls in of_g.standard_class_order:
             if not loxi_utils.class_in_version(cls, version):
                 continue
-            if type_maps.class_is_inheritance_root(cls):
+            if type_maps.class_is_virtual(cls):
                 continue
             out.write("""
 int
@@ -184,7 +184,7 @@
                     sub_cls = m_type[:-2] # Trim _t
                     out.write("""
     %(cls)s_%(m_name)s_bind(obj, &%(v_name)s);
-    out += %(sub_cls)s_%(ver_name)s_dump(writer, cookie, &%(v_name)s);
+    out += of_object_dump(writer, cookie, &%(v_name)s);
 """ % dict(cls=cls, sub_cls=sub_cls, m_name=m_name,
            v_name=var_name_map(m_type), ver_name=ver_name))
 
@@ -234,7 +234,7 @@
                 comma = ","
 
             if (not loxi_utils.class_in_version(cls, version) or
-                    type_maps.class_is_inheritance_root(cls)):
+                    type_maps.class_is_virtual(cls)):
                 out.write("    unknown_dump%s\n" % comma);
             else:
                 out.write("    %s_%s_dump%s\n" %
diff --git a/c_gen/c_show_gen.py b/c_gen/c_show_gen.py
index a25e366..d1cbbdb 100644
--- a/c_gen/c_show_gen.py
+++ b/c_gen/c_show_gen.py
@@ -89,7 +89,6 @@
     ('uint64_t', 'generation_id'),
     ('uint16_t', 'value_mask'),
     ('uint32_t', 'value_mask'),
-    ('uint32_t', 'oxm_header'),
     ('uint8_t', 'value_mask'),
     ('uint64_t', 'value_mask'),
     ('uint64_t', 'write_setfields'),
@@ -104,6 +103,7 @@
     ('uint32_t', 'flow_removed_mask_slave'),
     ('uint32_t', 'band_types'),
     ('uint16_t', 'bsn_tcp_flags'),
+    ('uint8_t', 'bsn_l2_cache_hit'),
 ])
 
 def gen_emitter(cls, m_name, m_type):
@@ -163,7 +163,7 @@
         for cls in of_g.standard_class_order:
             if not loxi_utils.class_in_version(cls, version):
                 continue
-            if type_maps.class_is_inheritance_root(cls):
+            if type_maps.class_is_virtual(cls):
                 continue
             out.write("""\
 int %(cls)s_%(ver_name)s_show(loci_writer_f writer, void* cookie, of_object_t *obj);
@@ -202,7 +202,7 @@
         for cls in of_g.standard_class_order:
             if not loxi_utils.class_in_version(cls, version):
                 continue
-            if type_maps.class_is_inheritance_root(cls):
+            if type_maps.class_is_virtual(cls):
                 continue
             out.write("""
 int
@@ -254,7 +254,7 @@
                     sub_cls = m_type[:-2] # Trim _t
                     out.write("""
     %(cls)s_%(m_name)s_bind(obj, &%(v_name)s);
-    out += %(sub_cls)s_%(ver_name)s_show(writer, cookie, &%(v_name)s);
+    out += of_object_show(writer, cookie, &%(v_name)s);
 """ % dict(cls=cls, sub_cls=sub_cls, m_name=m_name,
            v_name=var_name_map(m_type), ver_name=ver_name))
 
@@ -302,7 +302,7 @@
                 comma = ","
 
             if (not loxi_utils.class_in_version(cls, version) or
-                    type_maps.class_is_inheritance_root(cls)):
+                    type_maps.class_is_virtual(cls)):
                 out.write("    unknown_show%s\n" % comma);
             else:
                 out.write("    %s_%s_show%s\n" %
diff --git a/c_gen/c_test_gen.py b/c_gen/c_test_gen.py
index 5ddd4e9..109ab9b 100644
--- a/c_gen/c_test_gen.py
+++ b/c_gen/c_test_gen.py
@@ -99,8 +99,8 @@
         of_octets_t="octets",
         of_meter_features_t="features",
         of_match_t="match",
-        of_oxm_header_t="oxm",
-        of_bsn_vport_header_t="bsn_vport",
+        of_oxm_t="oxm",
+        of_bsn_vport_t="bsn_vport",
         of_table_desc_t="table_desc",
         # BSN extensions
         of_bsn_vport_q_in_q_t="vport",
@@ -128,8 +128,8 @@
 # When embedding an object inside of another object we have to pick a single
 # subclass to use, unlike lists where we use all subclasses.
 embedded_subclasses = {
-    'of_oxm_header_t': 'of_oxm_eth_type',
-    'of_bsn_vport_header_t': 'of_bsn_vport_q_in_q',
+    'of_oxm_t': 'of_oxm_eth_type',
+    'of_bsn_vport_t': 'of_bsn_vport_q_in_q',
 }
 
 def ignore_member(cls, version, m_name, m_type):
@@ -380,7 +380,7 @@
         for cls in of_g.standard_class_order:
             if not loxi_utils.class_in_version(cls, version):
                 continue
-            if type_maps.class_is_inheritance_root(cls):
+            if type_maps.class_is_virtual(cls) and not loxi_utils.class_is_list(cls):
                 continue
             out.write("""
 extern int %(cls)s_%(v_name)s_populate(
@@ -515,7 +515,7 @@
  */
 """ % v_name)
         for cls in of_g.standard_class_order:
-            if type_maps.class_is_inheritance_root(cls):
+            if type_maps.class_is_virtual(cls):
                 continue
             if version in of_g.unified[cls]:
                 message_scalar_test(out, version, cls)
@@ -528,7 +528,7 @@
     for version in of_g.of_version_range:
         v_name = loxi_utils.version_to_name(version)
         for cls in of_g.standard_class_order:
-            if type_maps.class_is_inheritance_root(cls):
+            if type_maps.class_is_virtual(cls):
                 continue
             if version in of_g.unified[cls]:
                 test_name = "%s_%s" % (cls, v_name)
@@ -701,7 +701,7 @@
     """
     for version in of_g.of_version_range:
         for cls in of_g.standard_class_order:
-            if type_maps.class_is_inheritance_root(cls):
+            if type_maps.class_is_virtual(cls):
                 continue
             (members, member_types) = scalar_member_types_get(cls, version)
             scalar_funs_instance(out, cls, version, members, member_types)
@@ -1588,11 +1588,9 @@
         for cls in of_g.standard_class_order:
             if not loxi_utils.class_in_version(cls, version):
                 continue
-            if type_maps.class_is_inheritance_root(cls):
-                continue
             elif loxi_utils.class_is_list(cls):
                 gen_list_setup_check(out, cls, version)
-            else:
+            elif not type_maps.class_is_virtual(cls):
                 gen_class_setup_check(out, cls, version)
 
 def gen_unified_accessor_tests(out, name):
@@ -1611,7 +1609,7 @@
         for cls in of_g.standard_class_order:
             if not loxi_utils.class_in_version(cls, version):
                 continue
-            if type_maps.class_is_inheritance_root(cls):
+            if type_maps.class_is_virtual(cls):
                 continue
             unified_accessor_test_case(out, cls, version)
 
@@ -1625,7 +1623,7 @@
         for cls in of_g.standard_class_order:
             if not loxi_utils.class_in_version(cls, version):
                 continue
-            if type_maps.class_is_inheritance_root(cls):
+            if type_maps.class_is_virtual(cls):
                 continue
             test_name = "%s_%s" % (cls, v_name)
             out.write("    RUN_TEST(%s);\n" % test_name)
@@ -1708,6 +1706,8 @@
     sub_classes = type_maps.sub_class_map(cls, version)
     for (_, sub_cls) in sub_classes:
         sub_enum = sub_cls.upper()
+        if type_maps.class_is_virtual(sub_cls):
+            continue
         out.write("""
     if (src->object_id == %(sub_enum)s) {
         return %(sub_cls)s_%(ver_name)s_dup(src);
@@ -1841,7 +1841,7 @@
                 gen_dup_inheritance(out, cls, version)
             elif loxi_utils.class_is_list(cls):
                 gen_dup_list(out, cls, version)
-            else:
+            elif not type_maps.class_is_virtual(cls):
                 gen_dup_cls(out, cls, version)
 
 def gen_dup(out=sys.stdout):
@@ -1859,7 +1859,12 @@
         for version in of_g.of_version_range:
             if not loxi_utils.class_in_version(cls, version):
                 continue
-
+            elif type_maps.class_is_inheritance_root(cls):
+                pass
+            elif loxi_utils.class_is_list(cls):
+                pass
+            elif type_maps.class_is_virtual(cls):
+                continue
             ver_name = loxi_utils.version_to_name(version)
             out.write("""
     if (src->version == %(ver_name)s) {
@@ -1928,6 +1933,12 @@
         for cls in of_g.standard_class_order:
             if not loxi_utils.class_in_version(cls, version):
                 continue
+            elif type_maps.class_is_inheritance_root(cls):
+                pass
+            elif loxi_utils.class_is_list(cls):
+                pass
+            elif type_maps.class_is_virtual(cls):
+                continue
             ver_name = loxi_utils.version_to_name(version)
             out.write("""
 extern of_object_t *
@@ -1962,7 +1973,7 @@
         for j, cls in enumerate(of_g.all_class_order):
             if not loxi_utils.class_in_version(cls, version):
                 continue
-            if type_maps.class_is_inheritance_root(cls):
+            if type_maps.class_is_virtual(cls):
                 continue
             if cls == "of_bsn_virtual_port_create_request": # test q_in_q
                 out.write("""
diff --git a/c_gen/codegen.py b/c_gen/codegen.py
index f480453..f052950 100644
--- a/c_gen/codegen.py
+++ b/c_gen/codegen.py
@@ -121,26 +121,12 @@
                 c_code_gen.gen_new_function_definitions(out, uclass.name)
                 c_code_gen.gen_accessor_definitions(out, uclass.name)
 
-# TODO remove header classes and use the corresponding class instead
-def generate_header_classes(install_dir):
-    for cls in of_g.standard_class_order:
-        if not cls.endswith("_header") or cls in ["of_header", "of_bsn_header", "of_nicira_header"]:
-            continue
-        with template_utils.open_output(install_dir, "loci/src/%s.c" % cls) as out:
-            util.render_template(out, "class.c",
-                push_wire_types_data=None,
-                parse_wire_types_data=None)
-            # Append legacy generated code
-            c_code_gen.gen_new_function_definitions(out, cls)
-            c_code_gen.gen_accessor_definitions(out, cls)
-
 def generate_classes_header(install_dir):
     # Collect legacy code
     tmp = StringIO()
     c_code_gen.gen_struct_typedefs(tmp)
     c_code_gen.gen_new_function_declarations(tmp)
     c_code_gen.gen_accessor_declarations(tmp)
-    c_code_gen.gen_generics(tmp)
 
     with template_utils.open_output(install_dir, "loci/inc/loci/loci_classes.h") as out:
         util.render_template(out, "loci_classes.h",
@@ -240,16 +226,6 @@
             wire_type_get=wire_type_get,
             wire_type_set=wire_type_set))
 
-        # If this is the root of an inheritance hierachy, add metadata
-        # for the corresponding header class
-        if uclass.name in type_maps.inheritance_map:
-            class_metadata.append(ClassMetadata(
-                name=uclass.name + '_header',
-                wire_length_get=wire_length_get,
-                wire_length_set=wire_length_set,
-                wire_type_get=wire_type_get,
-                wire_type_set=wire_type_set))
-
     for metadata in class_metadata:
         class_metadata_dict[metadata.name] = metadata
 
diff --git a/c_gen/match.py b/c_gen/match.py
index d6b43fa..c6459d4 100644
--- a/c_gen/match.py
+++ b/c_gen/match.py
@@ -197,8 +197,7 @@
     # Generate list of OXM names from the unified classes
     oxm_names = [x[7:] for x in of_g.unified.keys() if
                  x.startswith('of_oxm_') and
-                 x.find('masked') < 0 and
-                 x.find('header') < 0]
+                 x.find('masked') < 0]
 
     # Check that all OXMs are in the match members
     for key in oxm_names:
diff --git a/c_gen/templates/list.c b/c_gen/templates/list.c
index d39af9a..5eb45c6 100644
--- a/c_gen/templates/list.c
+++ b/c_gen/templates/list.c
@@ -42,10 +42,9 @@
  */
 
 int
-${cls}_first(${cls}_t *list, of_list_iter_t iter)
+${cls}_first(${cls}_t *list, of_object_t *obj)
 {
     int rv;
-    of_object_t *obj = iter.obj;
 
     ${e_cls}_init(obj, list->version, -1, 1);
 
@@ -73,10 +72,9 @@
  */
 
 int
-${cls}_next(${cls}_t *list, of_list_iter_t iter)
+${cls}_next(${cls}_t *list, of_object_t *obj)
 {
     int rv;
-    of_object_t *obj = iter.obj;
 
     if ((rv = of_list_next(list, obj)) < 0) {
         return rv;
@@ -105,9 +103,9 @@
  */
 
 int
-${cls}_append_bind(${cls}_t *list, of_list_iter_t iter)
+${cls}_append_bind(${cls}_t *list, of_object_t *obj)
 {
-    return of_list_append_bind(list, iter.obj);
+    return of_list_append_bind(list, obj);
 }
 
 /**
@@ -119,7 +117,7 @@
  */
 
 int
-${cls}_append(${cls}_t *list, of_list_iter_t iter)
+${cls}_append(${cls}_t *list, of_object_t *obj)
 {
-    return of_list_append(list, iter.obj);
+    return of_list_append(list, obj);
 }
diff --git a/c_gen/templates/loci_classes.h b/c_gen/templates/loci_classes.h
index 86fe36b..c5147cb 100644
--- a/c_gen/templates/loci_classes.h
+++ b/c_gen/templates/loci_classes.h
@@ -36,22 +36,6 @@
 void ${uclass.name}_push_wire_types(of_object_t *obj);
 :: #endfor
 
-/*
- * Transparent union used for list iteration
- *
- * This will be removed when all callers are converted to of_object_t.
- */
-union of_list_iter_u {
-    of_object_t *obj;
-:: for uclass in loxi_globals.unified.classes:
-:: if uclass.virtual and not uclass.superclass:
-    union ${uclass.name}_u *${uclass.name};
-:: #endif
-:: #endfor
-} __attribute__ ((__transparent_union__));
-
-typedef union of_list_iter_u of_list_iter_t;
-
 ${legacy_code}
 
 #endif
diff --git a/c_gen/type_maps.py b/c_gen/type_maps.py
index 3544d80..607814c 100644
--- a/c_gen/type_maps.py
+++ b/c_gen/type_maps.py
@@ -36,8 +36,6 @@
     """
     Returns True if cls is a virtual class
     """
-    if cls.endswith("header"):
-        return True
     if loxi_utils.class_is_list(cls):
         return True
     return loxi_globals.unified.class_by_name(cls).virtual
@@ -46,6 +44,10 @@
     return cls in inheritance_map
 
 def generate_maps():
+    for ofclass in loxi_globals.unified.classes:
+        if ofclass.virtual and not ofclass.superclass:
+            inheritance_map[ofclass.name] = set()
+
     for version, protocol in loxi_globals.ir.items():
         wire_version = version.wire_version
         for ofclass in protocol.classes:
@@ -53,8 +55,6 @@
             if not root or root == ofclass or root.name == "of_header":
                 continue
 
-            if root.name not in inheritance_map:
-                inheritance_map[root.name] = set()
             inheritance_map[root.name].add(ofclass.name)
 
 def sub_class_map(base_type, version):
diff --git a/java_gen/java_type.py b/java_gen/java_type.py
index a78c572..3f3a5f2 100644
--- a/java_gen/java_type.py
+++ b/java_gen/java_type.py
@@ -632,6 +632,10 @@
         'of_oxm_mpls_tc_masked' : { 'value' : u8obj, 'value_mask' : u8obj },
         'of_oxm_mpls_bos' : { 'value' : boolean_value },
         'of_oxm_mpls_bos_masked' : { 'value' : boolean_value, 'value_mask' : boolean_value },
+        'of_oxm_ipv6_exthdr' : { 'value' : u16obj },
+        'of_oxm_ipv6_exthdr_masked' : { 'value' : u16obj, 'value_mask' : u16obj },
+        'of_oxm_pbb_uca' : { 'value' : boolean_value },
+        'of_oxm_pbb_uca_masked' : { 'value' : boolean_value, 'value_mask' : boolean_value },
 
         'of_oxm_bsn_in_ports_128' : { 'value': port_bitmap },
         'of_oxm_bsn_in_ports_128_masked' : { 'value': port_bitmap, 'value_mask': port_bitmap },
@@ -687,6 +691,9 @@
         'of_oxm_bsn_vlan_xlate_port_group_id' : { 'value' : class_id },
         'of_oxm_bsn_vlan_xlate_port_group_id_masked' : { 'value' : class_id, 'value_mask' : class_id },
 
+        'of_oxm_bsn_l2_cache_hit' : { 'value' : boolean_value },
+        'of_oxm_bsn_l2_cache_hit_masked' : { 'value' : boolean_value, 'value_mask' : boolean_value },
+
         'of_table_stats_entry': { 'wildcards': table_stats_wildcards },
         'of_match_v1': { 'vlan_vid' : vlan_vid_match, 'vlan_pcp': vlan_pcp,
                 'eth_type': eth_type, 'ip_dscp': ip_dscp, 'ip_proto': ip_proto,
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/match/MatchField.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/match/MatchField.java
index 2fb58b7..39c15fd 100644
--- a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/match/MatchField.java
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/match/MatchField.java
@@ -185,6 +185,12 @@
     public final static MatchField<U64> TUNNEL_ID = 
             new MatchField<U64>("tunnel_id", MatchFields.TUNNEL_ID);
 
+    public final static MatchField<U16> IPV6_EXTHDR =
+            new MatchField<U16>("ipv6_exthdr", MatchFields.IPV6_EXTHDR);
+
+    public final static MatchField<OFBooleanValue> PBB_UCA =
+            new MatchField<OFBooleanValue>("pbb_uca", MatchFields.PBB_UCA);
+
     public final static MatchField<OFBitMask128> BSN_IN_PORTS_128 =
             new MatchField<OFBitMask128>("bsn_in_ports_128", MatchFields.BSN_IN_PORTS_128);
 
@@ -239,6 +245,9 @@
     public final static MatchField<ClassId> BSN_VLAN_XLATE_PORT_GROUP_ID =
             new MatchField<ClassId>("bsn_vlan_xlate_port_group_id", MatchFields.BSN_VLAN_XLATE_PORT_GROUP_ID);
 
+    public final static MatchField<OFBooleanValue> BSN_L2_CACHE_HIT =
+            new MatchField<OFBooleanValue>("bsn_l2_cache_hit", MatchFields.BSN_L2_CACHE_HIT);
+
     public String getName() {
         return name;
     }
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/match/MatchFields.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/match/MatchFields.java
index 77494cb..aaf3576 100644
--- a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/match/MatchFields.java
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/match/MatchFields.java
@@ -40,6 +40,8 @@
     MPLS_TC,
     MPLS_BOS,
     TUNNEL_ID,
+    IPV6_EXTHDR,
+    PBB_UCA,
     BSN_IN_PORTS_128,
     BSN_LAG_ID,
     BSN_VRF,
@@ -58,4 +60,5 @@
     BSN_UDF7,
     BSN_TCP_FLAGS,
     BSN_VLAN_XLATE_PORT_GROUP_ID,
+    BSN_L2_CACHE_HIT,
 }
diff --git a/lang_c.py b/lang_c.py
index c7b68f7..bec4a65 100644
--- a/lang_c.py
+++ b/lang_c.py
@@ -125,7 +125,6 @@
             fn(outfile, os.path.basename(name))
     c_gen.codegen.build_class_metadata()
     c_gen.codegen.generate_classes(install_dir)
-    c_gen.codegen.generate_header_classes(install_dir)
     c_gen.codegen.generate_classes_header(install_dir)
     c_gen.codegen.generate_lists(install_dir)
     c_gen.codegen.generate_strings(install_dir)
diff --git a/openflow_input/bsn-1.3 b/openflow_input/bsn-1.3
index f9340b4..5ad480c 100644
--- a/openflow_input/bsn-1.3
+++ b/openflow_input/bsn-1.3
@@ -26,6 +26,7 @@
 // under the EPL.
 
 #version 4
+#version 5
 
 // BSN extension instruction
 struct of_instruction_bsn : of_instruction_experimenter {
diff --git a/openflow_input/bsn_acl b/openflow_input/bsn_acl
index 4035904..bcca842 100644
--- a/openflow_input/bsn_acl
+++ b/openflow_input/bsn_acl
@@ -30,6 +30,7 @@
 // Copyright (c) 2011, 2012 Open Networking Foundation
 
 #version 4
+#version 5
 
 // Instructions to express control flow in ACL tables
 
diff --git a/openflow_input/bsn_arp_idle b/openflow_input/bsn_arp_idle
index 26cea92..16a1782 100644
--- a/openflow_input/bsn_arp_idle
+++ b/openflow_input/bsn_arp_idle
@@ -35,6 +35,7 @@
 // not remove the table entry on its own.
 
 #version 4
+#version 5
 
 struct of_bsn_arp_idle : of_bsn_header {
     uint8_t version;
diff --git a/openflow_input/bsn_arp_offload b/openflow_input/bsn_arp_offload
index 5a229b1..f13f6ac 100644
--- a/openflow_input/bsn_arp_offload
+++ b/openflow_input/bsn_arp_offload
@@ -30,6 +30,7 @@
 // Copyright (c) 2011, 2012 Open Networking Foundation
 
 #version 4
+#version 5
 
 struct of_instruction_bsn_arp_offload : of_instruction_bsn {
     uint16_t type == 65535;
diff --git a/openflow_input/bsn_aux_cxns b/openflow_input/bsn_aux_cxns
index 247f81b..8ceaa72 100644
--- a/openflow_input/bsn_aux_cxns
+++ b/openflow_input/bsn_aux_cxns
@@ -28,6 +28,8 @@
 // Request that the switch spawn and configure auxiliary OF connections.
 //
 #version 4
+#version 5
+
 // Set the number of desired aux connections num_aux=(0-16) accompanying this main connection
 // This message is only allowed on the main connection. 
 struct of_bsn_set_aux_cxns_request : of_bsn_header {
diff --git a/openflow_input/bsn_controller_connections b/openflow_input/bsn_controller_connections
index eae315e..845d3b8 100644
--- a/openflow_input/bsn_controller_connections
+++ b/openflow_input/bsn_controller_connections
@@ -37,6 +37,7 @@
 // The URIs are of the form tcp://1.2.3.4:6553
 
 #version 4
+#version 5
 
 enum ofp_bsn_controller_connection_state(wire_type=uint8_t) {
     OFP_BSN_CONTROLLER_CONNECTION_STATE_DISCONNECTED = 0,
diff --git a/openflow_input/bsn_debug_counter b/openflow_input/bsn_debug_counter
index 75cafcc..6c28b87 100644
--- a/openflow_input/bsn_debug_counter
+++ b/openflow_input/bsn_debug_counter
@@ -29,6 +29,7 @@
 // governing permissions and limitations under the EPL.
 
 #version 4
+#version 5
 
 // Switches have many non-dataplane counters that are mainly useful for
 // debugging. An example is the number of packet-ins dropped due to
diff --git a/openflow_input/bsn_dhcp_offload b/openflow_input/bsn_dhcp_offload
index b21b036..5352754 100644
--- a/openflow_input/bsn_dhcp_offload
+++ b/openflow_input/bsn_dhcp_offload
@@ -30,6 +30,7 @@
 // Copyright (c) 2011, 2012 Open Networking Foundation
 
 #version 4
+#version 5
 
 struct of_instruction_bsn_dhcp_offload : of_instruction_bsn {
     uint16_t type == 65535;
diff --git a/openflow_input/bsn_disable_src_mac_check b/openflow_input/bsn_disable_src_mac_check
index f75c237..6b095ca 100644
--- a/openflow_input/bsn_disable_src_mac_check
+++ b/openflow_input/bsn_disable_src_mac_check
@@ -30,6 +30,7 @@
 // Copyright (c) 2011, 2012 Open Networking Foundation
 
 #version 4
+#version 5
 
 struct of_instruction_bsn_disable_src_mac_check : of_instruction_bsn {
     uint16_t type == 65535;
diff --git a/openflow_input/bsn_disable_vlan_counters b/openflow_input/bsn_disable_vlan_counters
index 068db64..e586917 100644
--- a/openflow_input/bsn_disable_vlan_counters
+++ b/openflow_input/bsn_disable_vlan_counters
@@ -30,6 +30,7 @@
 // Copyright (c) 2011, 2012 Open Networking Foundation
 
 #version 4
+#version 5
 
 struct of_instruction_bsn_disable_vlan_counters : of_instruction_bsn {
     uint16_t type == 65535;
diff --git a/openflow_input/bsn_egr_port_group_id b/openflow_input/bsn_egr_port_group_id
index a237b49..3ba5462 100644
--- a/openflow_input/bsn_egr_port_group_id
+++ b/openflow_input/bsn_egr_port_group_id
@@ -30,6 +30,7 @@
 
 #version 3
 #version 4
+#version 5
 
 /*
  * Egress port group ID for SwitchLight
diff --git a/openflow_input/bsn_flow_checksum b/openflow_input/bsn_flow_checksum
index bfa5f3c..35b658f 100644
--- a/openflow_input/bsn_flow_checksum
+++ b/openflow_input/bsn_flow_checksum
@@ -29,6 +29,7 @@
 // governing permissions and limitations under the EPL.
 
 #version 4
+#version 5
 
 // Retrieves the checksum for every bucket in a table. The entries are ordered
 // by bucket index.
diff --git a/openflow_input/bsn_flow_idle b/openflow_input/bsn_flow_idle
index 40a95d8..e0139e2 100644
--- a/openflow_input/bsn_flow_idle
+++ b/openflow_input/bsn_flow_idle
@@ -29,6 +29,7 @@
 // governing permissions and limitations under the EPL.
 
 #version 4
+#version 5
 
 /*
  * Notification of idle flows
diff --git a/openflow_input/bsn_gentable b/openflow_input/bsn_gentable
index 6ccaac5..556ae0b 100644
--- a/openflow_input/bsn_gentable
+++ b/openflow_input/bsn_gentable
@@ -29,6 +29,7 @@
 // governing permissions and limitations under the EPL.
 
 #version 4
+#version 5
 
 // We have a number of switch agents that need to be configured by the
 // controller and report stats. Some of them will have large tables (1000+
diff --git a/openflow_input/bsn_image b/openflow_input/bsn_image
index 05a1a97..fafe8d8 100644
--- a/openflow_input/bsn_image
+++ b/openflow_input/bsn_image
@@ -29,6 +29,7 @@
 // governing permissions and limitations under the EPL.
 
 #version 4
+#version 5
 
 struct of_bsn_image_desc_stats_request : of_bsn_stats_request {
     uint8_t version;
diff --git a/openflow_input/bsn_in_ports b/openflow_input/bsn_in_ports
index b23df63..819bdde 100644
--- a/openflow_input/bsn_in_ports
+++ b/openflow_input/bsn_in_ports
@@ -30,6 +30,7 @@
 
 #version 3
 #version 4
+#version 5
 
 /*
  * Bitmap of input ports
diff --git a/openflow_input/bsn_l2_cache_hit b/openflow_input/bsn_l2_cache_hit
new file mode 100644
index 0000000..694bc65
--- /dev/null
+++ b/openflow_input/bsn_l2_cache_hit
@@ -0,0 +1,47 @@
+// Copyright 2014, Big Switch Networks, Inc.
+//
+// LoxiGen is licensed under the Eclipse Public License,
+// version 1.0 (EPL), with the following special exception:
+//
+// LOXI Exception
+//
+// As a special exception to the terms of the EPL, you may
+// distribute libraries generated by LoxiGen (LoxiGen Libraries)
+// under the terms of your choice, provided that copyright and
+// licensing notices generated by LoxiGen are not altered or removed
+// from the LoxiGen Libraries and the notice provided below is (i)
+// included in the LoxiGen Libraries, if distributed in source code
+// form and (ii) included in any documentation for the LoxiGen
+// Libraries, if distributed in binary form.
+//
+// Notice: "Copyright 2013, Big Switch Networks, Inc.
+// This library was generated by the LoxiGen Compiler."
+//
+// You may not use this file except in compliance with the EPL or
+// LOXI Exception. You may obtain a copy of the EPL at:
+//
+// http://www.eclipse.org/legal/epl-v10.html
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an "AS
+// IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+// express or implied. See the EPL for the specific language
+// governing permissions and limitations under the EPL.
+
+#version 3
+#version 4
+
+/*
+ * L2 Cache Hit
+ */
+
+struct of_oxm_bsn_l2_cache_hit : of_oxm {
+    uint32_t type_len == 0x00032401;
+    uint8_t value;
+};
+
+struct of_oxm_bsn_l2_cache_hit_masked : of_oxm {
+    uint32_t type_len == 0x00032502;
+    uint8_t value;
+    uint8_t value_mask;
+};
diff --git a/openflow_input/bsn_l3_interface_class_id b/openflow_input/bsn_l3_interface_class_id
index 80d1e37..f16d333 100644
--- a/openflow_input/bsn_l3_interface_class_id
+++ b/openflow_input/bsn_l3_interface_class_id
@@ -30,6 +30,7 @@
 
 #version 3
 #version 4
+#version 5
 
 /*
  * L3 interface class ID for SwitchLight
diff --git a/openflow_input/bsn_l3_src_class_id b/openflow_input/bsn_l3_src_class_id
index 58f60c6..7e2569e 100644
--- a/openflow_input/bsn_l3_src_class_id
+++ b/openflow_input/bsn_l3_src_class_id
@@ -30,6 +30,7 @@
 
 #version 3
 #version 4
+#version 5
 
 /*
  * L3 source class ID for SwitchLight
diff --git a/openflow_input/bsn_lacp b/openflow_input/bsn_lacp
index 2a63b17..ed36b0d 100644
--- a/openflow_input/bsn_lacp
+++ b/openflow_input/bsn_lacp
@@ -29,6 +29,7 @@
 // governing permissions and limitations under the EPL.
 
 #version 4
+#version 5
 
 // LACP Convergence Status set in of_bsn_lacp_convergence_notif message
 enum of_bsn_lacp_convergence_status(wire_type=uint8_t, complete=False) {
diff --git a/openflow_input/bsn_lag_id b/openflow_input/bsn_lag_id
index 63645a3..d428933 100644
--- a/openflow_input/bsn_lag_id
+++ b/openflow_input/bsn_lag_id
@@ -30,6 +30,7 @@
 
 #version 3
 #version 4
+#version 5
 
 /*
  * Ingress LAG ID for SwitchLight
diff --git a/openflow_input/bsn_log b/openflow_input/bsn_log
index b2a9758..e636d6e 100644
--- a/openflow_input/bsn_log
+++ b/openflow_input/bsn_log
@@ -29,6 +29,7 @@
 // the receiver's configured loglevel is lower than the message's loglevel.
 
 #version 4
+#version 5
 
 enum ofp_bsn_loglevel(wire_type=uint8_t) {
     OFP_BSN_LOGLEVEL_MSG = 0,
diff --git a/openflow_input/bsn_packet_of_death b/openflow_input/bsn_packet_of_death
index e8679f0..c1ac28d 100644
--- a/openflow_input/bsn_packet_of_death
+++ b/openflow_input/bsn_packet_of_death
@@ -30,6 +30,7 @@
 // Copyright (c) 2011, 2012 Open Networking Foundation
 
 #version 4
+#version 5
 
 struct of_instruction_bsn_packet_of_death : of_instruction_bsn {
     uint16_t type == 65535;
diff --git a/openflow_input/bsn_pktin_flag b/openflow_input/bsn_pktin_flag
index fd94a49..034ac0a 100644
--- a/openflow_input/bsn_pktin_flag
+++ b/openflow_input/bsn_pktin_flag
@@ -26,6 +26,7 @@
 // under the EPL.
 
 #version 4
+#version 5
 
 // In a realistic switch pipeline there are multiple reasons a given packet
 // should be sent to the controller. The packet-in reason field is only 8 bits,
@@ -43,4 +44,5 @@
     OFP_BSN_PKTIN_FLAG_L3_MISS = 0x100,
     OFP_BSN_PKTIN_FLAG_L3_CPU = 0x200,
     OFP_BSN_PKTIN_FLAG_INGRESS_ACL = 0x400,
+    OFP_BSN_PKTIN_FLAG_SFLOW = 0x800,
 };
diff --git a/openflow_input/bsn_port_counter b/openflow_input/bsn_port_counter
index 83cd1c8..6cf5e10 100644
--- a/openflow_input/bsn_port_counter
+++ b/openflow_input/bsn_port_counter
@@ -29,6 +29,7 @@
 // governing permissions and limitations under the EPL.
 
 #version 4
+#version 5
 
 enum ofp_bsn_port_counter(wire_type=uint8_t, complete=False, stable=True) {
   OFP_BSN_PORT_COUNTER_RX_BYTES = 0,
diff --git a/openflow_input/bsn_prioritize_pdus b/openflow_input/bsn_prioritize_pdus
index fbec0a0..7a179a9 100644
--- a/openflow_input/bsn_prioritize_pdus
+++ b/openflow_input/bsn_prioritize_pdus
@@ -30,6 +30,7 @@
 // Copyright (c) 2011, 2012 Open Networking Foundation
 
 #version 4
+#version 5
 
 struct of_instruction_bsn_prioritize_pdus : of_instruction_bsn {
     uint16_t type == 65535;
diff --git a/openflow_input/bsn_require_vlan_xlate b/openflow_input/bsn_require_vlan_xlate
index 24cf137..32fc55c 100644
--- a/openflow_input/bsn_require_vlan_xlate
+++ b/openflow_input/bsn_require_vlan_xlate
@@ -30,6 +30,7 @@
 // Copyright (c) 2011, 2012 Open Networking Foundation
 
 #version 4
+#version 5
 
 struct of_instruction_bsn_require_vlan_xlate : of_instruction_bsn {
     uint16_t type == 65535;
diff --git a/openflow_input/bsn_span_destination b/openflow_input/bsn_span_destination
index 7fd900d..fd4f677 100644
--- a/openflow_input/bsn_span_destination
+++ b/openflow_input/bsn_span_destination
@@ -30,6 +30,7 @@
 // Copyright (c) 2011, 2012 Open Networking Foundation
 
 #version 4
+#version 5
 
 struct of_instruction_bsn_span_destination : of_instruction_bsn {
     uint16_t type == 65535;
diff --git a/openflow_input/bsn_switch_pipeline b/openflow_input/bsn_switch_pipeline
index ff2213f..d42532b 100644
--- a/openflow_input/bsn_switch_pipeline
+++ b/openflow_input/bsn_switch_pipeline
@@ -29,6 +29,7 @@
 // governing permissions and limitations under the EPL.
 
 #version 4
+#version 5
 
 struct of_bsn_get_switch_pipeline_request : of_bsn_header {
     uint8_t version;
diff --git a/openflow_input/bsn_tcp_flags b/openflow_input/bsn_tcp_flags
index e8ef2e9..1a84a90 100644
--- a/openflow_input/bsn_tcp_flags
+++ b/openflow_input/bsn_tcp_flags
@@ -30,6 +30,7 @@
 
 #version 3
 #version 4
+#version 5
 
 /*
  * TCP flags
diff --git a/openflow_input/bsn_time b/openflow_input/bsn_time
index 0a955be..d69e538 100644
--- a/openflow_input/bsn_time
+++ b/openflow_input/bsn_time
@@ -33,6 +33,7 @@
 // The timestamp must be monotonic (not affected by system time updates).
 
 #version 4
+#version 5
 
 struct of_bsn_time_request : of_bsn_header {
     uint8_t version;
diff --git a/openflow_input/bsn_tlv b/openflow_input/bsn_tlv
index 8b55b03..4e12a2b 100644
--- a/openflow_input/bsn_tlv
+++ b/openflow_input/bsn_tlv
@@ -29,6 +29,7 @@
 // governing permissions and limitations under the EPL.
 
 #version 4
+#version 5
 
 struct of_bsn_tlv_port : of_bsn_tlv {
     uint16_t type == 0;
@@ -369,3 +370,21 @@
     uint16_t length;
     enum ofp_bsn_lacp_state value;
 };
+
+struct of_bsn_tlv_data : of_bsn_tlv {
+    uint16_t type == 55;
+    uint16_t length;
+    of_octets_t value;
+};
+
+struct of_bsn_tlv_mac_mask : of_bsn_tlv {
+    uint16_t type == 56;
+    uint16_t length;
+    of_mac_addr_t value;
+};
+
+struct of_bsn_tlv_priority : of_bsn_tlv {
+    uint16_t type == 57;
+    uint16_t length;
+    uint32_t value;
+};
diff --git a/openflow_input/bsn_udf b/openflow_input/bsn_udf
index f7ce9a6..12ad1cb 100644
--- a/openflow_input/bsn_udf
+++ b/openflow_input/bsn_udf
@@ -30,6 +30,7 @@
 
 #version 3
 #version 4
+#version 5
 
 /*
  * User Defined Fields
diff --git a/openflow_input/bsn_vlan_counter b/openflow_input/bsn_vlan_counter
index c5814f4..d39d35f 100644
--- a/openflow_input/bsn_vlan_counter
+++ b/openflow_input/bsn_vlan_counter
@@ -29,6 +29,7 @@
 // governing permissions and limitations under the EPL.
 
 #version 4
+#version 5
 
 enum ofp_bsn_vlan_counter_constants {
     OFP_BSN_VLAN_ALL = 0xffff,
diff --git a/openflow_input/bsn_vlan_xlate_port_group_id b/openflow_input/bsn_vlan_xlate_port_group_id
index c8e5a25..986dc0e 100644
--- a/openflow_input/bsn_vlan_xlate_port_group_id
+++ b/openflow_input/bsn_vlan_xlate_port_group_id
@@ -30,6 +30,7 @@
 
 #version 3
 #version 4
+#version 5
 
 /*
  * VLAN xlate port group ID for SwitchLight
diff --git a/openflow_input/bsn_vrf b/openflow_input/bsn_vrf
index 26959bd..c61c313 100644
--- a/openflow_input/bsn_vrf
+++ b/openflow_input/bsn_vrf
@@ -30,6 +30,7 @@
 
 #version 3
 #version 4
+#version 5
 
 /*
  * Virtual Routing/Forwarding ID for SwitchLight
diff --git a/openflow_input/bsn_vrf_counter b/openflow_input/bsn_vrf_counter
index b638ff7..012d728 100644
--- a/openflow_input/bsn_vrf_counter
+++ b/openflow_input/bsn_vrf_counter
@@ -29,6 +29,7 @@
 // governing permissions and limitations under the EPL.
 
 #version 4
+#version 5
 
 enum ofp_bsn_vrf_counter_constants(wire_type=uint32_t) {
     OFP_BSN_VRF_ALL = 0xffffffff,
diff --git a/openflow_input/oxm-1.3 b/openflow_input/oxm-1.3
index ac57589..4bb55a1 100644
--- a/openflow_input/oxm-1.3
+++ b/openflow_input/oxm-1.3
@@ -52,3 +52,16 @@
     uint8_t value;
     uint8_t value_mask;
 };
+
+/* Not supporting pbb_isid at the moment, requires a 3-byte field */
+
+struct of_oxm_ipv6_exthdr : of_oxm {
+    uint32_t type_len == 0x80004e02;
+    uint16_t value;
+};
+
+struct of_oxm_ipv6_exthdr_masked : of_oxm {
+    uint32_t type_len == 0x80004f04;
+    uint16_t value;
+    uint16_t value_mask;
+};
diff --git a/openflow_input/oxm-1.4 b/openflow_input/oxm-1.4
new file mode 100644
index 0000000..0fd96ec
--- /dev/null
+++ b/openflow_input/oxm-1.4
@@ -0,0 +1,42 @@
+// Copyright 2014, Big Switch Networks, Inc.
+//
+// LoxiGen is licensed under the Eclipse Public License,
+// version 1.0 (EPL), with the following special exception:
+//
+// LOXI Exception
+//
+// As a special exception to the terms of the EPL, you may
+// distribute libraries generated by LoxiGen (LoxiGen Libraries)
+// under the terms of your choice, provided that copyright and
+// licensing notices generated by LoxiGen are not altered or removed
+// from the LoxiGen Libraries and the notice provided below is (i)
+// included in the LoxiGen Libraries, if distributed in source code
+// form and (ii) included in any documentation for the LoxiGen
+// Libraries, if distributed in binary form.
+//
+// Notice: "Copyright 2013, Big Switch Networks, Inc.
+// This library was generated by the LoxiGen Compiler."
+//
+// You may not use this file except in compliance with the EPL or
+// LOXI Exception. You may obtain a copy of the EPL at:
+//
+// http://www.eclipse.org/legal/epl-v10.html
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an "AS
+// IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+// express or implied. See the EPL for the specific language
+// governing permissions and limitations under the EPL.
+
+#version 5
+
+struct of_oxm_pbb_uca : of_oxm {
+    uint32_t type_len == 0x80005201;
+    uint8_t value;
+};
+
+struct of_oxm_pbb_uca_masked : of_oxm {
+    uint32_t type_len == 0x80005302;
+    uint8_t value;
+    uint8_t value_mask;
+};
diff --git a/openflow_input/standard-1.3 b/openflow_input/standard-1.3
index 3a627e1..fa1a967 100644
--- a/openflow_input/standard-1.3
+++ b/openflow_input/standard-1.3
@@ -160,6 +160,7 @@
     OFPPF_AUTONEG = 0x2000,
     OFPPF_PAUSE = 0x4000,
     OFPPF_PAUSE_ASYM = 0x8000,
+    OFPPF_BSN_BREAKOUT_CAPABLE = 0x80000000,
 };
 
 enum ofp_port_reason(wire_type=uint8_t) {
diff --git a/openflow_input/standard-1.4 b/openflow_input/standard-1.4
index 23e96ed..54fce4a 100644
--- a/openflow_input/standard-1.4
+++ b/openflow_input/standard-1.4
@@ -1576,6 +1576,46 @@
     of_octets_t data;
 };
 
+struct of_bad_property_error_msg : of_error_msg {
+    uint8_t version;
+    uint8_t type == 1;
+    uint16_t length;
+    uint32_t xid;
+    uint16_t err_type == 14;
+    enum ofp_bad_property_code code;
+    of_octets_t data;
+};
+
+struct of_async_config_failed_error_msg : of_error_msg {
+    uint8_t version;
+    uint8_t type == 1;
+    uint16_t length;
+    uint32_t xid;
+    uint16_t err_type == 15;
+    enum ofp_async_config_failed_code code;
+    of_octets_t data;
+};
+
+struct of_flow_monitor_failed_error_msg : of_error_msg {
+    uint8_t version;
+    uint8_t type == 1;
+    uint16_t length;
+    uint32_t xid;
+    uint16_t err_type == 16;
+    enum ofp_flow_monitor_failed_code code;
+    of_octets_t data;
+};
+
+struct of_bundle_failed_error_msg : of_error_msg {
+    uint8_t version;
+    uint8_t type == 1;
+    uint16_t length;
+    uint32_t xid;
+    uint16_t err_type == 17;
+    enum ofp_bundle_failed_code code;
+    of_octets_t data;
+};
+
 struct of_experimenter_error_msg : of_error_msg {
     uint8_t version;
     uint8_t type == 1;