loci: move per-obj function pointers to global tables
This saves 32 bytes per of_object.
diff --git a/c_gen/c_code_gen.py b/c_gen/c_code_gen.py
index 81f5a1a..e26ef93 100644
--- a/c_gen/c_code_gen.py
+++ b/c_gen/c_code_gen.py
@@ -803,6 +803,7 @@
#include <loci/of_match.h>
#include <loci/of_object.h>
#include <loci/loci_classes.h>
+#include <loci/loci_class_metadata.h>
/****************************************************************
*
@@ -1752,9 +1753,7 @@
elif m_type not in ["of_match_t", "of_octets_t"]:
out.write("""
/* @fixme Shouldn't this precede copying value's data to buffer? */
- if (%(m_name)s->wire_length_set != NULL) {
- %(m_name)s->wire_length_set((of_object_t *)%(m_name)s, %(m_name)s->length);
- }
+ of_object_wire_length_set((of_object_t *)%(m_name)s, %(m_name)s->length);
""" % dict(m_name=m_name))
out.write("""
/* Not scalar, update lengths if needed */
@@ -2058,7 +2057,6 @@
obj->length = bytes;
obj->object_id = %(enum)s;
""" % dict(cls=cls, enum=enum_name(cls)))
- gen_coerce_ops(out, cls)
out.write("""
/* Grow the wire buffer */
@@ -2117,7 +2115,7 @@
if loxi_utils.class_is_u16_len(cls) or cls == "of_packet_queue":
out.write("""
- obj->wire_length_set((of_object_t *)obj, obj->length);
+ of_object_wire_length_set((of_object_t *)obj, obj->length);
""")
if cls == "of_meter_stats":
@@ -2329,99 +2327,6 @@
****************************************************************/
""")
-#
-# @fixme Not clear that these should all be set for virtual fns
-#
-# @fixme Clean up. should have a (language specific) map from class
-# to length and type get/set functions
-#
-
-def gen_coerce_ops(out, cls):
- out.write("""
- /* Set up the object's function pointers */
-""")
-
- uclass = loxi_globals.unified.class_by_name(cls)
- if uclass and not uclass.virtual and uclass.has_type_members:
- out.write("""
- obj->wire_type_set = %(cls)s_push_wire_types;
-""" % dict(cls=cls))
-
- if loxi_utils.class_is_message(cls):
- out.write("""
- obj->wire_length_get = of_object_message_wire_length_get;
- obj->wire_length_set = of_object_message_wire_length_set;
-""")
- else:
- if loxi_utils.class_is_tlv16(cls):
- if not (cls in type_maps.inheritance_map): # Don't set for super
- out.write("""
- obj->wire_length_set = of_tlv16_wire_length_set;
-""")
- out.write("""
- obj->wire_length_get = of_tlv16_wire_length_get;
-""")
- if loxi_utils.class_is_action(cls):
- out.write("""
- obj->wire_type_get = of_action_wire_object_id_get;
-""")
- if loxi_utils.class_is_action_id(cls):
- out.write("""
- obj->wire_type_get = of_action_id_wire_object_id_get;
-""")
- if loxi_utils.class_is_instruction(cls):
- out.write("""
- obj->wire_type_get = of_instruction_wire_object_id_get;
-""")
- if loxi_utils.class_is_instruction_id(cls):
- out.write("""
- obj->wire_type_get = of_instruction_id_wire_object_id_get;
-""")
- if loxi_utils.class_is_queue_prop(cls):
- out.write("""
- obj->wire_type_get = of_queue_prop_wire_object_id_get;
-""")
- if loxi_utils.class_is_table_feature_prop(cls):
- out.write("""
- obj->wire_type_get = of_table_feature_prop_wire_object_id_get;
-""")
- if loxi_utils.class_is_meter_band(cls):
- out.write("""
- obj->wire_type_get = of_meter_band_wire_object_id_get;
-""")
- if loxi_utils.class_is_hello_elem(cls):
- out.write("""
- obj->wire_type_get = of_hello_elem_wire_object_id_get;
-""")
- if loxi_utils.class_is_bsn_tlv(cls):
- out.write("""
- obj->wire_type_get = of_bsn_tlv_wire_object_id_get;
-""")
- if loxi_utils.class_is_oxm(cls):
- out.write("""
- obj->wire_length_get = of_oxm_wire_length_get;
- obj->wire_type_get = of_oxm_wire_object_id_get;
-""")
- if loxi_utils.class_is_u16_len(cls):
- out.write("""
- obj->wire_length_get = of_u16_len_wire_length_get;
- obj->wire_length_set = of_u16_len_wire_length_set;
-""")
- if cls == "of_packet_queue":
- out.write("""
- obj->wire_length_get = of_packet_queue_wire_length_get;
- obj->wire_length_set = of_packet_queue_wire_length_set;
-""")
-# if cls == "of_list_meter_band_stats":
-# out.write("""
-# obj->wire_length_get = of_list_meter_band_stats_wire_length_get;
-#""")
- if cls == "of_meter_stats":
- out.write("""
- obj->wire_length_get = of_meter_stats_wire_length_get;
- obj->wire_length_set = of_meter_stats_wire_length_set;
-""")
-
def gen_new_function_definitions(out, cls):
"""
Generate the new operator for all classes
diff --git a/c_gen/c_test_gen.py b/c_gen/c_test_gen.py
index 01f1c5d..2ca743a 100644
--- a/c_gen/c_test_gen.py
+++ b/c_gen/c_test_gen.py
@@ -565,10 +565,10 @@
if not type_maps.class_is_virtual(cls):
out.write("""
- if (obj->wire_length_get != NULL) {
+ if (loci_class_metadata[obj->object_id].wire_length_get != NULL) {
int length;
- obj->wire_length_get((of_object_t *)obj, &length);
+ loci_class_metadata[obj->object_id].wire_length_get((of_object_t *)obj, &length);
TEST_ASSERT(length == %(length)d);
}
@@ -717,10 +717,10 @@
if inst_len >= 0:
check_template = """
TEST_ASSERT(%(inst)s->length == %(inst_len)d);
- if (%(inst)s->wire_length_get != NULL) {
+ if (loci_class_metadata[%(inst)s->object_id].wire_length_get != NULL) {
int length;
- %(inst)s->wire_length_get(
+ loci_class_metadata[%(inst)s->object_id].wire_length_get(
(of_object_t *)&elt, &length);
TEST_ASSERT(length == %(inst_len)d);
}
@@ -1552,16 +1552,16 @@
v_name=v_name, length=length, version=version))
if (not type_maps.class_is_virtual(cls)) or loxi_utils.class_is_list(cls):
out.write("""
- if (obj->wire_length_get != NULL) {
+ if (loci_class_metadata[obj->object_id].wire_length_get != NULL) {
int length;
- obj->wire_length_get((of_object_t *)obj, &length);
+ loci_class_metadata[obj->object_id].wire_length_get((of_object_t *)obj, &length);
TEST_ASSERT(length == %(length)d);
}
- if (obj->wire_type_get != NULL) {
+ if (loci_class_metadata[obj->object_id].wire_type_get != NULL) {
of_object_id_t obj_id;
- obj->wire_type_get((of_object_t *)obj, &obj_id);
+ loci_class_metadata[obj->object_id].wire_type_get((of_object_t *)obj, &obj_id);
TEST_ASSERT(obj_id == %(u_cls)s);
}
diff --git a/c_gen/codegen.py b/c_gen/codegen.py
index af4dfa4..82de380 100644
--- a/c_gen/codegen.py
+++ b/c_gen/codegen.py
@@ -180,3 +180,155 @@
with template_utils.open_output(install_dir, "loci/src/of_type_maps.c") as out:
util.render_template(out, "of_type_maps.c", legacy_code=tmp.getvalue())
+
+ClassMetadata = namedtuple('ClassMetadata',
+ ['name', 'wire_length_get', 'wire_length_set', 'wire_type_get', 'wire_type_set'])
+
+def generate_class_metadata(install_dir):
+ with template_utils.open_output(install_dir, "loci/inc/loci/loci_class_metadata.h") as out:
+ util.render_template(out, "loci_class_metadata.h")
+
+ with template_utils.open_output(install_dir, "loci/src/loci_class_metadata.c") as out:
+ class_metadata = []
+ for uclass in loxi_globals.unified.classes:
+ wire_length_get = 'NULL'
+ wire_length_set = 'NULL'
+ wire_type_get = 'NULL'
+ wire_type_set = 'NULL'
+
+ if uclass and not uclass.virtual and uclass.has_type_members:
+ wire_type_set = '%s_push_wire_types' % uclass.name
+
+ if uclass.is_message and uclass.name != "of_header":
+ wire_length_get = 'of_object_message_wire_length_get'
+ wire_length_set = 'of_object_message_wire_length_set'
+ elif uclass.is_action:
+ wire_length_set = 'of_tlv16_wire_length_set'
+ wire_length_get = 'of_tlv16_wire_length_get'
+ wire_type_get = 'of_action_wire_object_id_get'
+ elif uclass.is_action_id:
+ wire_length_set = 'of_tlv16_wire_length_set'
+ wire_length_get = 'of_tlv16_wire_length_get'
+ wire_type_get = 'of_action_id_wire_object_id_get'
+ elif uclass.is_instruction:
+ wire_length_set = 'of_tlv16_wire_length_set'
+ wire_length_get = 'of_tlv16_wire_length_get'
+ wire_type_get = 'of_instruction_wire_object_id_get'
+ elif uclass.is_instanceof('of_instruction_id'):
+ wire_length_set = 'of_tlv16_wire_length_set'
+ wire_length_get = 'of_tlv16_wire_length_get'
+ wire_type_get = 'of_instruction_id_wire_object_id_get'
+ elif uclass.is_instanceof('of_queue_prop'):
+ wire_length_set = 'of_tlv16_wire_length_set'
+ wire_length_get = 'of_tlv16_wire_length_get'
+ wire_type_get = 'of_queue_prop_wire_object_id_get'
+ elif uclass.is_instanceof('of_table_feature_prop'):
+ wire_length_set = 'of_tlv16_wire_length_set'
+ wire_length_get = 'of_tlv16_wire_length_get'
+ wire_type_get = 'of_table_feature_prop_wire_object_id_get'
+ elif uclass.is_instanceof('of_meter_band'):
+ wire_length_set = 'of_tlv16_wire_length_set'
+ wire_length_get = 'of_tlv16_wire_length_get'
+ wire_type_get = 'of_meter_band_wire_object_id_get'
+ elif uclass.is_instanceof('of_hello_elem'):
+ wire_length_set = 'of_tlv16_wire_length_set'
+ wire_length_get = 'of_tlv16_wire_length_get'
+ wire_type_get = 'of_hello_elem_wire_object_id_get'
+ elif uclass.is_instanceof('of_bsn_tlv'):
+ wire_length_set = 'of_tlv16_wire_length_set'
+ wire_length_get = 'of_tlv16_wire_length_get'
+ wire_type_get = 'of_bsn_tlv_wire_object_id_get'
+ elif uclass.is_oxm:
+ wire_length_get = 'of_oxm_wire_length_get'
+ wire_type_get = 'of_oxm_wire_object_id_get'
+ elif uclass.name == "of_packet_queue":
+ wire_length_get = 'of_packet_queue_wire_length_get'
+ wire_length_set = 'of_packet_queue_wire_length_set'
+ elif uclass.name == "of_list_meter_band_stats":
+ wire_length_get = 'of_list_meter_band_stats_wire_length_get'
+ elif uclass.name == "of_meter_stats":
+ wire_length_get = 'of_meter_stats_wire_length_get'
+ wire_length_set = 'of_meter_stats_wire_length_set'
+ elif uclass.name in ["of_group_desc_stats_entry", "of_group_stats_entry",
+ "of_flow_stats_entry", "of_bucket", "of_table_features",
+ "of_bsn_port_counter_stats_entry", "of_bsn_vlan_counter_stats_entry",
+ "of_bsn_gentable_entry_desc_stats_entry", "of_bsn_gentable_entry_stats_entry",
+ "of_bsn_gentable_desc_stats_entry"]:
+ wire_length_get = "of_u16_len_wire_length_get"
+ wire_length_set = "of_u16_len_wire_length_set"
+ elif uclass.name == 'of_match_v3':
+ wire_length_set = 'of_tlv16_wire_length_set'
+ wire_length_get = 'of_tlv16_wire_length_get'
+ wire_type_set = 'of_match_v3_push_wire_types'
+
+ class_metadata.append(ClassMetadata(
+ name=uclass.name,
+ wire_length_get=wire_length_get,
+ wire_length_set=wire_length_set,
+ wire_type_get=wire_type_get,
+ wire_type_set=wire_type_set))
+
+ class_metadata.extend([
+ ClassMetadata(
+ name="of_action_header",
+ wire_length_set='of_tlv16_wire_length_set',
+ wire_length_get='of_tlv16_wire_length_get',
+ wire_type_get='of_action_wire_object_id_get',
+ wire_type_set='NULL'),
+ ClassMetadata(
+ name="of_action_id_header",
+ wire_length_set='of_tlv16_wire_length_set',
+ wire_length_get='of_tlv16_wire_length_get',
+ wire_type_get='of_action_id_wire_object_id_get',
+ wire_type_set='NULL'),
+ ClassMetadata(
+ name="of_instruction_header",
+ wire_length_set='of_tlv16_wire_length_set',
+ wire_length_get='of_tlv16_wire_length_get',
+ wire_type_get='of_instruction_wire_object_id_get',
+ wire_type_set='NULL'),
+ ClassMetadata(
+ name="of_instruction_id_header",
+ wire_length_set='of_tlv16_wire_length_set',
+ wire_length_get='of_tlv16_wire_length_get',
+ wire_type_get='of_instruction_id_wire_object_id_get',
+ wire_type_set='NULL'),
+ ClassMetadata(
+ name="of_queue_prop_header",
+ wire_length_set='of_tlv16_wire_length_set',
+ wire_length_get='of_tlv16_wire_length_get',
+ wire_type_get='of_queue_prop_wire_object_id_get',
+ wire_type_set='NULL'),
+ ClassMetadata(
+ name="of_table_feature_prop_header",
+ wire_length_set='of_tlv16_wire_length_set',
+ wire_length_get='of_tlv16_wire_length_get',
+ wire_type_get='of_table_feature_prop_wire_object_id_get',
+ wire_type_set='NULL'),
+ ClassMetadata(
+ name="of_meter_band_header",
+ wire_length_set='of_tlv16_wire_length_set',
+ wire_length_get='of_tlv16_wire_length_get',
+ wire_type_get='of_meter_band_wire_object_id_get',
+ wire_type_set='NULL'),
+ ClassMetadata(
+ name="of_hello_elem_header",
+ wire_length_set='of_tlv16_wire_length_set',
+ wire_length_get='of_tlv16_wire_length_get',
+ wire_type_get='of_hello_elem_wire_object_id_get',
+ wire_type_set='NULL'),
+ ClassMetadata(
+ name="of_bsn_tlv_header",
+ wire_length_set='of_tlv16_wire_length_set',
+ wire_length_get='of_tlv16_wire_length_get',
+ wire_type_get='of_bsn_tlv_wire_object_id_get',
+ wire_type_set='NULL'),
+ ClassMetadata(
+ name="of_oxm_header",
+ wire_length_set='NULL',
+ wire_length_get='of_oxm_wire_length_get',
+ wire_type_get='of_oxm_wire_object_id_get',
+ wire_type_set='NULL'),
+ ])
+
+ util.render_template(out, "loci_class_metadata.c", class_metadata=class_metadata)
diff --git a/c_gen/templates/_push_wire_types.c b/c_gen/templates/_push_wire_types.c
index fd2536c..96a9111 100644
--- a/c_gen/templates/_push_wire_types.c
+++ b/c_gen/templates/_push_wire_types.c
@@ -25,7 +25,7 @@
:: # EPL for the specific language governing permissions and limitations
:: # under the EPL.
::
-static void
+void
${data.class_name}_push_wire_types(of_object_t *obj)
{
unsigned char *buf = OF_OBJECT_BUFFER_INDEX(obj, 0);
diff --git a/c_gen/templates/loci_class_metadata.c b/c_gen/templates/loci_class_metadata.c
new file mode 100644
index 0000000..1aca773
--- /dev/null
+++ b/c_gen/templates/loci_class_metadata.c
@@ -0,0 +1,51 @@
+:: # 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 2014, 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.
+::
+:: include('_copyright.c')
+:: import loxi_globals
+
+/****************************************************************
+ *
+ * loci_class_metadata.c
+ *
+ * Tables with information for each class
+ *
+ ****************************************************************/
+
+#include "loci_log.h"
+#include <loci/loci.h>
+
+struct loci_class_metadata loci_class_metadata[OF_OBJECT_COUNT] = {
+:: for data in class_metadata:
+ [${data.name.upper()}] = {
+ .wire_length_get=${data.wire_length_get},
+ .wire_length_set=${data.wire_length_set},
+ .wire_type_get=${data.wire_type_get},
+ .wire_type_set=${data.wire_type_set},
+ },
+:: #endfor
+};
diff --git a/c_gen/templates/loci_class_metadata.h b/c_gen/templates/loci_class_metadata.h
new file mode 100644
index 0000000..37962e3
--- /dev/null
+++ b/c_gen/templates/loci_class_metadata.h
@@ -0,0 +1,63 @@
+:: # 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 2014, 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.
+::
+:: include('_copyright.c')
+::
+#ifndef __LOCI_CLASS_METADATA_H__
+#define __LOCI_CLASS_METADATA_H__
+
+typedef void (*of_wire_length_get_f)(of_object_t *obj, int *bytes);
+typedef void (*of_wire_length_set_f)(of_object_t *obj, int bytes);
+typedef void (*of_wire_type_get_f)(of_object_t *obj, of_object_id_t *id);
+typedef void (*of_wire_type_set_f)(of_object_t *obj);
+
+struct loci_class_metadata {
+ of_wire_length_get_f wire_length_get;
+ of_wire_length_set_f wire_length_set;
+ of_wire_type_get_f wire_type_get;
+ of_wire_type_set_f wire_type_set;
+};
+
+extern struct loci_class_metadata loci_class_metadata[OF_OBJECT_COUNT];
+
+static inline void
+of_object_wire_length_set(of_object_t *obj, int bytes)
+{
+ if (loci_class_metadata[obj->object_id].wire_length_set) {
+ loci_class_metadata[obj->object_id].wire_length_set(obj, bytes);
+ }
+}
+
+static inline void
+of_object_wire_type_set(of_object_t *obj)
+{
+ if (loci_class_metadata[obj->object_id].wire_type_set) {
+ loci_class_metadata[obj->object_id].wire_type_set(obj);
+ }
+}
+
+#endif
diff --git a/c_gen/templates/loci_classes.h b/c_gen/templates/loci_classes.h
index 12c07d1..c5147cb 100644
--- a/c_gen/templates/loci_classes.h
+++ b/c_gen/templates/loci_classes.h
@@ -33,6 +33,7 @@
:: for uclass in loxi_globals.unified.classes:
void ${uclass.name}_wire_object_id_get(of_object_t *obj, of_object_id_t *id);
+void ${uclass.name}_push_wire_types(of_object_t *obj);
:: #endfor
${legacy_code}
diff --git a/c_gen/templates/of_object.c b/c_gen/templates/of_object.c
index 28c00cc..6f20658 100644
--- a/c_gen/templates/of_object.c
+++ b/c_gen/templates/of_object.c
@@ -410,13 +410,8 @@
child->length);
/* Update the wire length and type if needed */
- if (child->wire_length_set) {
- child->wire_length_set(child, child->length);
- }
-
- if (child->wire_type_set) {
- child->wire_type_set(child);
- }
+ of_object_wire_length_set(child, child->length);
+ of_object_wire_type_set(child);
/* Update the parent's length */
of_object_parent_length_update(parent, child->length);
@@ -568,9 +563,7 @@
while (obj != NULL) {
LOCI_ASSERT(count++ < _MAX_PARENT_ITERATIONS);
obj->length += delta;
- if (obj->wire_length_set != NULL) {
- obj->wire_length_set(obj, obj->length);
- }
+ of_object_wire_length_set(obj, obj->length);
#ifndef NDEBUG
wbuf = obj->wire_object.wbuf;
#endif
@@ -605,9 +598,9 @@
of_object_wire_init(of_object_t *obj, of_object_id_t base_object_id,
int max_len)
{
- if (obj->wire_type_get != NULL) {
+ if (loci_class_metadata[obj->object_id].wire_type_get != NULL) {
of_object_id_t id;
- obj->wire_type_get(obj, &id);
+ loci_class_metadata[obj->object_id].wire_type_get(obj, &id);
if (!of_wire_id_valid(id, base_object_id)) {
return OF_ERROR_PARSE;
}
@@ -615,9 +608,9 @@
/* Call the init function for this object type; do not push to wire */
of_object_init_map[id]((of_object_t *)(obj), obj->version, -1, 0);
}
- if (obj->wire_length_get != NULL) {
+ if (loci_class_metadata[obj->object_id].wire_length_get != NULL) {
int length;
- obj->wire_length_get(obj, &length);
+ loci_class_metadata[obj->object_id].wire_length_get(obj, &length);
if (length < 0 || (max_len > 0 && length > max_len)) {
return OF_ERROR_PARSE;
}
diff --git a/c_gen/templates/of_object.h b/c_gen/templates/of_object.h
index 72480c8..ba73a92 100644
--- a/c_gen/templates/of_object.h
+++ b/c_gen/templates/of_object.h
@@ -48,24 +48,6 @@
#include <loci/of_message.h>
#include <loci/of_wire_buf.h>
-/*
- * Generic accessors:
- *
- * Many objects have a length represented in the wire buffer
- * wire_length_get and wire_length_set access these values directly on the
- * wire.
- *
- * Many objects have a length represented in the wire buffer
- * wire_length_get and wire_length_set access these values directly on the
- * wire.
- *
- * FIXME: TBD if wire_length_set and wire_type_set are required.
- */
-typedef void (*of_wire_length_get_f)(of_object_t *obj, int *bytes);
-typedef void (*of_wire_length_set_f)(of_object_t *obj, int bytes);
-typedef void (*of_wire_type_get_f)(of_object_t *obj, of_object_id_t *id);
-typedef void (*of_wire_type_set_f)(of_object_t *obj);
-
/****************************************************************
* General list operations: first, next, append_setup, append_advance
****************************************************************/
@@ -138,15 +120,6 @@
*/
int length;
of_version_t version;
-
- /*
- * Many objects have a length and/or type represented in the wire buffer
- * These accessors get and set those value when present. Treat as private.
- */
- of_wire_length_get_f wire_length_get;
- of_wire_length_set_f wire_length_set;
- of_wire_type_get_f wire_type_get;
- of_wire_type_set_f wire_type_set;
};
struct of_object_storage_s {
diff --git a/lang_c.py b/lang_c.py
index 0a881e9..037c1d7 100644
--- a/lang_c.py
+++ b/lang_c.py
@@ -131,3 +131,4 @@
c_gen.codegen.generate_strings(install_dir)
c_gen.codegen.generate_init_map(install_dir)
c_gen.codegen.generate_type_maps(install_dir)
+ c_gen.codegen.generate_class_metadata(install_dir)