Ethereal-dev: Re: [Ethereal-dev] [Patch] revised: tap-tcp_close

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

From: Jason House <jhouse@xxxxxxxxx>
Date: Wed, 04 Dec 2002 10:22:17 -0500
Ronnie Sahlberg wrote:
> 
> The reason the tap system works the way it does with the queue and push
> functions are because I
> wanted the taps only to be called when the dissectors were called when the
> packets were first read.
> This was a design mistake.

  As guy points out, that functionality is still useful... certain taps
rely on a complete edt/proto_tree structure...  but the ones that are
most like the originally envisioned functionally would benefit from
getting called immediately.
  Also, I believe one of the concepts with the tap listener system was
to allow tap listeners calls to occur in a lower priority thread than
physical packet capture...  Some care might still be needed if this is
still a design goal.

> Since there are valid reasons to have tap listeners to be called whenever a
> dissector is called and not
> only when the pacekt is read the first time, I think the tap system should
> be changed slightly.
> 
> Instead of waiting until all dissectors have returned until the tap
> listeners are called
> I think the tap listeners should be called immediately from the dissectors.
> That would remove the need to do the rotating struct trick in dissect_tcp().
> This would also get rid of the list handling in tap.c since the list would
> become obsolete.

Iostat (and friends) are almost a different breed of tap listener.  They
don't *really* rely on a specific protocol... they listen to frame just
to guarantee that they get called... but called *after* full
dissection.  In fact, I think that they also require that a non-NULL
tree is passed into protocol dissectors.  The other taps that rely on
tap_specific_data don't need this (although some future ones might)

  Would it be wise to make a different registration call for taps such
as iostat?
  Also, I think that tap listeners might benefit from registering
whether or not they need proto_tree to be used... ie. taps that find
extra fields or taps that write to the proto_tree directly.

> It would also allow tap listeners to be called everytime a dissector is
> called. Thus allowing all of
> TCP seq/ack analysis to become a tap listener. Cleaning up packet-tcp.c a
> bit.

Overall, I like that approach and it will benefit most taps.  It would
be interesting to get the sequence analysis out of packet-tcp for a
couple of reasons... 
1) cleaning up packet-tcp as you said.
2) creating a tap for sequence analysis that might eventually get
generalized for more protocols than just tcp
3) the first tap to write to proto_tree... 
  3a) Listeners that make one-line packet summaries might benefit from
      incorporating flexibility as to where the *user* wants to see 
      the information... in the proto_tree, in COL_INFO, or printed as 
      a summary later on.
  3b) Adding items to proto_tree can become filterable, even tappable.
      Behavior like protocols might stir up even more tap discussion.    

> See the current flaw as a design bug.
> 
> I think the tap system should be changed so that
> register_tap_listener()
> takes an extra parameter that describes when the _packet() callback should
> be called.
> 
> TAP_READ_FIRST   would mean the current behaviour

"current behaviour" or the proposed modified form of calling immediately
following a protocol dissector?  There still some logic
needed for figuring out which form will be done.  Immediately
following a protocol dissector, unfortunately doesn't work for all
taps.

> TAP_READ_NOT_FIRST would mean every time the dissector is invoked EXCEPT the
> one above.

When a listener can potentially modify how a display filter works, it
might be better to have something such as PROTO_TREE_VIEWED...
implying when a filter using that tap's output occurs, or when a
packet is clicked on for viewing, or when tethereal dissects + displays
a packet the first time it is read.

> TAP_READ_ALWAYS  would mean that the callback would be called every single
> time that dissector
> is invoked.
> 
> I will do this change as soon as the next release is out. I dont want to
> change it soo close to the new release.

Guy Harris wrote:
> Passing the epan_dissect_t might not be useful except for tap listeners
> not tapping off of a dissector, as the protocol tree wouldn't be
> complete; those listeners might be called after the entire dissection is
> complete.

In fact, if a tap listener is called after incomplete dissection and
performs a search by using epan_dissect_t, couldn't that make later
searches for the same item have incorrect results?  I believe that edt
caches the results of searches and only performs new searches...