Guy Harris wrote:
>
> On Mon, Dec 02, 2002 at 09:23:56AM -0500, Jason House wrote:
> > Per Ronnie's suggestions, I have updated packet-tcp.c and tap-tcp_close
> It's a bit ugly to have "td" be static; I suppose it's not a problem in
> most cases, but one could imagine TCP-over-IP-over-X.25-over-TCP
> captures in which there's more than one TCP header per packet.
>
> Unfortunately, as a pointer to it is passed to "tap_queue_packet()", it
> can't be local to "dissect_tcp()".
Proposed solution:
* In Tapping Core:
convert register_tap to:
int register_tap(char *name, void (deallocate)(void*))
Have dissect_tcp allocate a new copy of "td" each time it is run
Have tap_queue_packet call deallocate if data won't be used.
And have tap_push_tapped_queue call deallocate after data is used
* In tap-tcp_close.h: (actually it should be relocated to packet-tcp.h)
* In currently existing taps
add extra parameter "NULL" to register_tap
* Packet-tcp and future protocols requiring dynamic tap_specific_data:
make td a pointer
create a deallocate function (discussed below)
pass function pointer to deallocate in with register_tap
* Proposed Memory management in packet-tcp.[ch]
add the field "gboolean inuse" to tcp_tap_data_t
add "GList *td_list = NULL;" to top of packet-tcp
in dissect_tcp:
set td to point to a tcp_tap_data_t with inuse==0
(if none exist, allocate a new one)
td->inuse = 1;
(do normal dissection/tap preperation)
in deallocate
((tcp_tap_data_t*)(void_pointer))->inuse = 0;
99.999% of the time, dissect_tcp will allocate one copy of td.
In rare cases that Guy mentioned, 2 copies will be allocated and so,
occasionally dissect_tcp will have to look for a second element in the
list.
This approach avoids allocation/deallocation and uses up a minimal
amount of memory. Memory optimization is left up to the dissector.
How does this approach sound? Any better approaches? Comments? etc...