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).