Wireshark

  • Riverbed Technology
  • WinPcap
the world's foremost network protocol analyzer
  • Wireshark
    • About
    • Download
    • Blog
  • Get Help
    • Ask a Question
    • FAQs
    • Documentation
    • Mailing Lists
    • Online Tools
    • Wiki
    • Bug Tracker
  • Develop
    • Get Involved
    • Developer's Guide
    • Browse the Code
    • Latest Builds

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

Date Index Thread Index Other Months All Mailing Lists
Date Prev Date Next Thread Prev Thread Next


From: Ulf Lamping <ulf.lamping@xxxxxx>
Date: Fri, 05 Oct 2007 09:00:34 +0200

Sebastien Dubois schrieb:

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?

Wireshark will call all register functions (it knows of) before calling any of the handoff functions. So this sequence should not be your problem.

The line 671 of the assert might get a hint, but it's a bit worthless together with your code snippet ...

Regards, ULFL


  • References:
    • [Wireshark-dev] Plugin dissector registration order problem
      • From: Sebastien Dubois
  • Prev by Date: Re: [Wireshark-dev] Info column problem?
  • Next by Date: Re: [Wireshark-dev] Info column problem?
  • Previous by thread: [Wireshark-dev] Plugin dissector registration order problem
  • Next by thread: Re: [Wireshark-dev] Plugin dissector registration order problem
  • Index(es):
    • Date
    • Thread

Wireshark and the "fin" logo are registered trademarks of the Wireshark Foundation