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?