Guy Harris wrote: > On Apr 3, 2007, at 4:53 PM, Bob Doolittle wrote: > > >> Thanks. My subdissector is now being called, and is updating the List >> window >> properly. But for some odd reason the sub-protocol isn't appearing >> in the >> Details window tree, and I'm handling it identically to how I handled >> the parent >> protocol, which is drawing properly. I've verified that the proto >> has been >> registered properly. I've verified that the same tree is being >> passed into the subdissector, and that it's making the >> proto_tree_add_item call >> for the proto in the parent tree, but it's not appearing. >> > > So the "tree" argument to the subdissector is non-null? >
Yes it is. Under what circumstances is it NULL, by the way? I'm mimic'ing the appropriate tests/structure but don't understand why yet... > What's the code in the subdissector that adds the top-level entry for > the protocol? > Here's the complete top-level dissector. OFFANDSIZE is a macro that expands into two comma-separated values/args. dissect_alp_resource does most of the packet dissection. The sub-dissector looks quite similar... static int dissect_alp_dgram(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { guint16 seqno = tvb_get_ntohs(tvb, 0); guint16 offset = tvb_get_ntohs(tvb, OFFSET(newt_packet_hdr, first_cmd_offset)); guint packet_type; if (check_col(pinfo->cinfo, COL_PROTOCOL)) col_set_str(pinfo->cinfo, COL_PROTOCOL, "ALP"); // Clear out stuff in the info column if (check_col(pinfo->cinfo,COL_INFO)){ col_clear(pinfo->cinfo,COL_INFO); } if (check_col(pinfo->cinfo,COL_INFO)){ col_add_fstr(pinfo->cinfo, COL_INFO, "Seq=0x%x", seqno); } if (tree) { // we are being asked for details proto_item *ti = NULL; proto_tree *alp_dgram_tree = NULL; ti = proto_tree_add_item(tree, proto_alp_dgram, tvb, 0, sizeof(struct newt_packet_hdr)+1, FALSE); proto_item_append_text(ti, ", Seq: 0x%x", seqno); alp_dgram_tree = proto_item_add_subtree(ti, ett_alp_dgram); proto_tree_add_item(alp_dgram_tree, hf_alp_dgram_seq_num, tvb, OFFANDSIZE(newt_packet_hdr, sequence), FALSE); proto_tree_add_item(alp_dgram_tree, hf_alp_dgram_offset, tvb, OFFANDSIZE(newt_packet_hdr, first_cmd_offset), FALSE); packet_type = dissect_alp_resource(tvb, pinfo, alp_dgram_tree, ti, offset); } (void)dissector_try_port(alp_dgram_dissector_table, packet_type, tvb_new_subset(tvb, sizeof(struct newt_packet_hdr) + 1, -1, -1), pinfo, tree); return(sizeof(struct newt_packet_hdr)+1); } >> Is there something special that has to occur for a single plugin to >> add two >> separate protos to the tree? >> > > A single plugin can contain multiple dissectors; they can be in a > single source file, or multiple source files. > > The only thing that's necessary for a single source file to contain > multiple dissectors is to make sure that the registration and handoff- > registration routines in that source file (there can be more than one > such routine) register all the dissectors properly. > Yup. Similar to the docsis example. Thanks for any clues... -Bob _______________________________________________ Wireshark-dev mailing list Wireshark-dev@wireshark.org http://www.wireshark.org/mailman/listinfo/wireshark-dev