I have a plugin dissector I am working on that dissects a custom protocol with 
about a dozen main message types.  In order to manage it easier I have broken 
the code into multiple .c files.  I seems that when I do that though, the 
actual functions I call in the 2nd .c file have problems with the ett subtree 
array.

When compiled and run I see the following errors for all packets dissected in 
the 2nd .c file.

   Dissector bug, protocol BLAH:  proto.c:3640:  failed assertion "idx >=0 && 
idx < num_tree_types"

Here is the snippet of code:

dissect_keep_alive(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree 
*tree, int message_length)
{
        proto_item *ti = NULL;
        proto_tree *keepalive_tree = NULL;

        if (tree) {
            ti = proto_tree_add_text(tree, tvb, offset, message_length, 
"KeepAlive");
            ti = proto_tree_add_text(tree, tvb, offset, message_length, 
"ett_keepalive %d",ett_keepalive);
            keepalive_tree = proto_item_add_subtree(ti, ett_keepalive);
            proto_tree_add_item(keepalive_tree, hf_keepalive_timeout, tvb, 
offset, 2, FALSE); offset += 2;
            proto_tree_add_item(keepalive_tree, hf_keepalive_spare, tvb, 
offset, 2, FALSE); offset += 2;
        }
}

It appears that ett_keepalive is -1 when I run wireshark.  I have defined the 
ett_keepalive and the ett subtree in the .h file.  

static gint ett_keepalive = -1;
static gint *ett[] = {
...
    &ett_keepalive,
...
};


It all works when I have just one source file but when I moved these functions 
to the 2nd file, I started having this problem.  Do I need to define these in 
the proto_register function and explicitly pass the ett subtree array?  Is 
there an example dissector that has the dissector spread across multiple .c 
files and single .h file?  

My C skills are a bit rusty so thank you for your patience.
Jason


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

Reply via email to