ws_type override the type (BOOLEAN -> FT_BOOLEAN). ws_base override the base (DEC -> BASE_HEX). ws_desc override the description. ws allow to specify description and name for wireshark. Name is important as allows filters. Having a single attribute with 2 values allows to quickly specify the main attributes. Signed-off-by: Frediano Ziglio <fziglio@xxxxxxxxxx> --- codegen/dissector_test.c | 2 ++ codegen/out_base1.txt | 14 +++++++------- codegen/test.proto | 8 ++++---- python_modules/dissector.py | 45 ++++++++++++++++++++++++++++++++++----------- 4 files changed, 47 insertions(+), 22 deletions(-) diff --git a/codegen/dissector_test.c b/codegen/dissector_test.c index 79f8592..dcc0134 100644 --- a/codegen/dissector_test.c +++ b/codegen/dissector_test.c @@ -206,6 +206,8 @@ lookup_values(char *label, value_string *vals, guint64 value) return false; } +const true_false_string tfs_set_notset = { "Set", "Not set" }; + WS_DLL_PUBLIC void proto_register_field_array(const int parent, hf_register_info *hf, const int num_records) { diff --git a/codegen/out_base1.txt b/codegen/out_base1.txt index 49a7426..7921afd 100644 --- a/codegen/out_base1.txt +++ b/codegen/out_base1.txt @@ -1,10 +1,10 @@ --- tree --- item - Text: 130 (0x82) + Text: Not set Name: u8 Abbrev: spice2.auto.msg_base_Base1_u8 - Type: FT_UINT8 - Base: BASE_DEC + Type: FT_BOOLEAN + Base: 0 --- item Text: -127 (0xffffffffffffff81) Name: i8 @@ -16,17 +16,17 @@ Name: u16 Abbrev: spice2.auto.msg_base_Base1_u16 Type: FT_UINT16 - Base: BASE_DEC + Base: BASE_DEC_HEX --- item Text: -31743 (0xffffffffffff8401) - Name: i16 + Name: Signed 16 Abbrev: spice2.auto.msg_base_Base1_i16 Type: FT_INT16 Base: BASE_DEC --- item Text: 2231566849 (0x85030201) - Name: u32 - Abbrev: spice2.auto.msg_base_Base1_u32 + Name: Unsigned 32 + Abbrev: spice2.uint.test Type: FT_UINT32 Base: BASE_DEC --- item diff --git a/codegen/test.proto b/codegen/test.proto index 2fd930b..b28520c 100644 --- a/codegen/test.proto +++ b/codegen/test.proto @@ -49,11 +49,11 @@ message ArrayStruct { channel BaseChannel { server: message { - uint8 u8; + uint8 u8 @ws_type(BOOLEAN); int8 i8; - uint16 u16; - int16 i16; - uint32 u32; + uint16 u16 @ws_base(DEC_HEX); + int16 i16 @ws_desc("Signed 16"); + uint32 u32 @ws("Unsigned 32", uint.test); int32 i32; uint64 u64; int64 i64; diff --git a/python_modules/dissector.py b/python_modules/dissector.py index 827f7f0..2df4723 100644 --- a/python_modules/dissector.py +++ b/python_modules/dissector.py @@ -252,12 +252,10 @@ def get_primitive_ft_type(t): return "FT_%sINT%d" % (unsigned, size * 8) # write a field -def write_wireshark_field(writer, container, member, t, tree, size, encoding='ENC_LITTLE_ENDIAN', prefix=''): +def write_wireshark_field(writer, container, member, t, ws, tree, size, encoding='ENC_LITTLE_ENDIAN', prefix=''): assert(member and container) - hf_name = member_hf_name(container, member) - # compute proper type f_type = 'FT_NONE' base = 'BASE_NONE' @@ -276,8 +274,30 @@ def write_wireshark_field(writer, container, member, t, tree, size, encoding='EN assert(t.has_name()) vals = 'VALS(%s_vs)' % codegen.prefix_underscore_lower(t.name) - desc = member.name - ws_name = 'auto.' + hf_name[3:] + # override type + if ws.type: + f_type = 'FT_%s' % ws.type + base = 'BASE_NONE' + vals = 'NULL' + if f_type == 'FT_BOOLEAN': + vals = 'TFS(&tfs_set_notset)' + + # override base + if ws.base: + base = 'BASE_%s' % ws.base + + # read description + desc = ws.desc + if desc is None: + desc = member.name + + # read name + ws_name = ws.name + if not ws_name: + hf_name = member_hf_name(container, member) + ws_name = 'auto.' + hf_name[3:] + else: + hf_name = 'hf_%s' % ws_name.replace('.', '_') writer.statement("%sproto_tree_add_item(%s, %s, glb->tvb, offset, %s, %s)" % (prefix, tree, hf_name, size, encoding)) @@ -365,7 +385,7 @@ def write_switch(writer, container, switch, dest, scope): elif t.is_struct(): write_struct(writer, m, t, '-1', dest2, scope) elif t.is_primitive(): - write_member_primitive(writer, container, m, t, dest2, scope) + write_member_primitive(writer, container, m, t, WSAttributes(t, m.attributes), dest2, scope) elif t.is_array(): nelements = read_array_len(writer, m.name, t, dest, block, False) write_array(writer, container, m, nelements, t, dest2, block) @@ -382,16 +402,18 @@ def write_switch(writer, container, switch, dest, scope): def write_array(writer, container, member, nelements, array, dest, scope): assert(container and member) + ws = WSAttributes(array, member.attributes) + element_type = array.element_type if element_type == ptypes.uint8 or element_type == ptypes.int8: - write_wireshark_field(writer, container, member, array, dest.level.tree, nelements, 'ENC_NA') + write_wireshark_field(writer, container, member, array, ws, dest.level.tree, nelements, 'ENC_NA') writer.increment("offset", nelements) return with writer.index() as index, writer.for_loop(index, nelements) as array_scope: if element_type.is_primitive(): - write_member_primitive(writer, container, member, element_type, dest, scope) + write_member_primitive(writer, container, member, element_type, WSAttributes(element_type, array.item_attrs), dest, scope) else: assert(element_type.is_struct()) write_struct(writer, member, element_type, index, dest, scope) @@ -475,12 +497,13 @@ def write_struct(writer, member, t, index, dest, scope): write_struct_func(writer, t, func_name, index) writer.assign('offset', '%s(glb, %s, offset, %s)' % (func_name, dest.level.tree, index)) -def write_member_primitive(writer, container, member, t, dest, scope): +def write_member_primitive(writer, container, member, t, ws, dest, scope): assert(t.is_primitive()) if member.has_attr("bytes_count"): raise NotImplementedError("bytes_count not implemented") - write_wireshark_field(writer, container, member, t, dest.level.tree, t.get_fixed_nw_size()) + + write_wireshark_field(writer, container, member, t, ws, dest.level.tree, t.get_fixed_nw_size()) if member.has_attr("bytes_count"): dest_var = member.attributes["bytes_count"][0] else: @@ -513,7 +536,7 @@ def write_member(writer, container, member, dest, scope): if not member.has_attr("nocopy"): write_pointer(writer, container, member, t, dest, scope) elif t.is_primitive(): - write_member_primitive(writer, container, member, t, dest, scope) + write_member_primitive(writer, container, member, t, WSAttributes(t, member.attributes), dest, scope) elif t.is_array(): nelements = read_array_len(writer, member.name, t, dest, scope, False) write_array(writer, container, member, nelements, t, dest, scope) -- 2.1.0 _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/spice-devel