Huge thanks to our Platinum Members Endace and LiveAction,
and our Silver Member Veeam, for supporting the Wireshark Foundation and project.

Wireshark-dev: [Wireshark-dev] Plugin dissector registration order problem

From: "Sebastien Dubois" <sebastien.dubois@xxxxxxxxxxxx>
Date: Thu, 4 Oct 2007 17:22:20 -0400
Title: Plugin dissector registration order problem

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