Ethereal-dev: Re: [Ethereal-dev] user defined structure

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, 21 Jun 2001 11:28:18 -0700 (PDT)
> I need to add one field/structure to the frame_data structure

What is the field you want to add?

> Has ethereal provided for some function/interface for this purpose?

Not *per se*, because C isn't a sufficiently advanced programming
language that a program can change the shape of structures at run time. 
:-)

However, Ethereal *does* have a way for a protocol to attach to a frame
an arbitrary blob of data - see "p_add_proto_data()" and
"p_get_proto_data()".

"p_add_proto_data()" takes as arguments:

	a "frame_data *" (pinfo->fd, typically),

	the "proto_XXX" value for the protocol adding the data;

	a "void *" that points to the data to be added.

"p_get_proto_data()" takes as arguments:

	a "frame_data *" (pinfo->fd, typically),

	the "proto_XXX" value for a protocol;

and returns a "void *" pointing to the data that protocol added to the
field, or NULL if the protocol added no data.

NOTE: this data is persistent, meaning that

	1) if the dissector won't need this data on subsequent
	   re-dissections of the same frame, this wastes memory;

	2) a protocol that does this must use "register_init_routine()"
	   to register an "initialization routine" that's called every
	   time a new capture file is read - that routine must free up
	   all blobs of data that it attached to frames (otherwise you
	   have a memory leak).

Check out the "memory chunk" routines in GLib:

	http://developer.gnome.org/doc/API/glib/glib-memory-chunks.html

which are *very* handy if you're allocating fixed-length data
structures:

	1) they call "malloc()" to allocate blocks containing *multiple*
	   chunks, which reduces the number of calls to "malloc()",
	   speeding memory allocation up;

	2) they keep track of all blocks allocated, and offer a call to
	   free all blocks of a particular type, which is faster than
	   calling "free()" for every chunk.

See, for example, the SMTP dissector, which uses them to allocate data
structures that it attaches to frames.