Hi,

  I'm currently having problems trying to implement a new plugin as a
sub-dissector to another plugin.  

  The first plugin (let's call it foo_proto) registers itself and adds
itself as a dissector that uses a given udp port as follows:

-------------------------------------------------------
void proto_register_foo_proto(void)
{
    module_t* foo_proto_module;
    if (proto_foo_proto == -1)
    {
        proto_foo_proto = proto_register_protocol("Foo Protocol ",
"foo_proto", "foo_proto");
        register_dissector("foo_proto", dissect_foo_proto,
proto_foo_proto);     
        proto_register_field_array(proto_foo_proto, hf,
array_length(hf));
        proto_register_subtree_array(ett, array_length(ett));
    }
    foo_proto_module    = prefs_register_protocol(proto_foo_proto,
proto_reg_handoff_foo_proto);
}

void proto_reg_handoff_foo_proto(void)
{
    static int Initialized = FALSE;
    if (!Initialized)
    {
        foo_proto_handle = create_dissector_handle(dissect_foo_proto,
proto_foo_proto);       
        dissector_add("udp.port", foo_proto_port, foo_proto_handle);
        Initialized = TRUE;
    }
}       
 -------------------------------------------------------

The second plugin (let's call it foo2_proto) also registers itself and
adds itself as a dissector that uses a registered field in the previous
dissector foo_proto as follows:

-------------------------------------------------------
void proto_register_foo2_proto(void)
{
    module_t* foo2_proto_module;
    if (proto_foo2_proto == -1)
    {
        proto_foo2_proto = proto_register_protocol("Foo2 Protocol ",
"foo2_proto", "foo2_proto");
        register_dissector("foo2_proto", dissect_foo2_proto,
proto_foo2_proto);     
        proto_register_field_array(proto_foo2_proto, hf,
array_length(hf));
        proto_register_subtree_array(ett, array_length(ett));
    }
    foo2_proto_module   = prefs_register_protocol(proto_foo2_proto,
proto_reg_handoff_foo2_proto);
}

void proto_reg_handoff_foo2_proto(void)
{
    static int Initialized = FALSE;
    if (!Initialized)
    {
        foo2_proto_handle = create_dissector_handle(dissect_foo2_proto,
proto_foo2_proto);      
        dissector_add("foo_proto.hf_some_field", foo2_proto_port,
foo2_proto_handle);
        Initialized = TRUE;
    }
}       
 -------------------------------------------------------

  This compiles fine, but I get the following assertion failure in
function dissector_add(...) at startup:

Err  file packet.c: line 671: assertion failed: (sub_dissectors)

   It seems that the first plugin (foo) is not registered when the
second one (foo2) calls dissector_add on it.

So, how does this work?  How can you add a plugin dissector to another
plugin dissector?  Is it at all possible?

Thx,
/Sebastien

_______________________________________________
Wireshark-dev mailing list
[email protected]
http://www.wireshark.org/mailman/listinfo/wireshark-dev

Reply via email to