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