I have a simple Wireshark dissector which throws the following bug warning when it is run against a capture:

13:04:12 Warn Dissector bug, protocol usbserial, in packet 353: /wireshark/epan/proto.c:5504: failed assertion "idx >= 0 && idx < num_tree_types" 

The protocol registration function looks like this:

static gint ett_myproto = -1; void proto_register_myproto(void) { /* Set up field array */ static hf_register_info hf[] = { { &hf_myproto_payload, {"Payload", "myproto.payload", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }}, }; /* Register protocol */ proto_myproto = proto_register_protocol("My Protocol", "myproto", "myproto"); /* Register protocol fields */ proto_register_field_array(proto_myproto, hf, array_length(hf)); /* Register the dissector */ register_dissector("myproto", dissect_myproto, proto_myproto); } 

The dissector does some general munging of data, but the core of the problem area seems to be:

static int dissect_myproto(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) { proto_item *ti; proto_tree *myproto_tree; /* Create top tree and add to the item */ ti = proto_tree_add_protocol_format(tree, proto_myproto, tvb, 0, -1, "My Protocol"); myproto_tree = proto_item_add_subtree(ti, ett_myproto); proto_tree_add_bytes_format(myproto_tree, hf_myproto_payload, tvb, 0, payload_len, NULL, "Payload"); } 

What do I need to do to get the protocol to fill the subtree correctly?

1 Answer

The problem here is a failure to register the subtree as part of a subtree array (hint from here).

This is done in the protocol registration function, and requires "packaging" the subtree variables (of which there is only one here: ett_myproto) into an array, and then registering that array using proto_register_subtree_array:

static gint ett_myproto = -1; void proto_register_myproto(void) { /* Set up field array */ static hf_register_info hf[] = { .... }; /* Register protocol */ proto_myproto = proto_register_protocol("My Protocol", "myproto", "myproto"); /* Register protocol fields */ proto_register_field_array(proto_myproto, hf, array_length(hf)); /* Setup and register all protocol subtrees */ static gint *ett[] = { &ett_myproto, }; proto_register_subtree_array(ett, array_length(ett)); /* Register the dissector */ register_dissector("myproto", dissect_myproto, proto_myproto); } 

The ett variables are indices used to refer to GUI information about the state of the subtree (e.g. expanded or not).

1

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.