Ethereal-dev: Re: [Ethereal-dev] how to get tree info?

Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.

From: Guy Harris <guy@xxxxxxxxxx>
Date: Thu, 18 Jul 2002 17:47:02 -0700
On Thu, Jul 18, 2002 at 10:11:17AM +0200, Miha Jemec wrote:
> The routine now loops between nodes: Frame->Ethernet->Internet Protocol->and 
> upper layer protocols. How can I get the items or list of one node, let's say 
> rtp?

The "process_node()" in "proto_hier_stats.c" only scans the top-level
nodes.

It's also recursive, which I don't think it needs to be.

What you might want to do would be to get the ID value for the "rtp"
protocol:

	hfinfo = proto_registrar_get_byname("rtp");
	if (hfinfo == NULL)
		give up, somehow "rtp" didn't get registered;
	proto_rtp = hfinfo->id;

and the hfinfo value for "rtp.ssrc":

	hfinfo_ssrc = proto_registrar_get_byname("rtp.ssrc");
	if (hfinfo_ssrc == NULL)
		give up, somehow "rtp.ssrc" didn't get registered;

and then have your equivalent to "process_tree()" just have a loop
something like:

	for (ptree_node = g_node_first_child(protocol_tree);
	    ptree_node != NULL;
	    ptree_node = g_node_next_sibling(ptree_node)) {
		/*
		 * Is this a subtree for RTP?
		 */
		finfo = PITEM_FINFO(ptree_node);
		if (finfo->hfinfo->parent == proto_rtp) {
			/*
			 * Yes.
			 * Now scan all the nodes in it until you
			 * find an "ssrc" node, and return its value.
			 */
			finfo = find_node(ptree_node, hfinfo_ssrc);
			if (finfo != NULL) {
				/*
				 * We found it.
				 */
				get the value from "finfo";
			}
		}
	}

with "find_node()" being something that recursively walks the tree
specified by its first argument looking for a node whose "finfo->hfinfo"
equals its second argument.