From c0792555392f234ab96917e784d365b5de053836 Mon Sep 17 00:00:00 2001 From: Guy Harris Date: Tue, 11 Apr 2017 19:53:48 -0700 Subject: Add an API to let a postdissector specify fields whose values it needs. Currently, this is only used to determine whether a protocol tree needs to be built on the first pass or not - if there are postdissectors that need fields, it does - but eventually we should be able to use it to prime the dissection to deliver those fields in cases where we don't need the *entire* protocol tree (rather than using a hack such as cooking up a fake tap with a fake filter to do that). Update MATE and TRANSUM to use it. Clean up code to check whether we need a protocol tree, and add comments before that code indicating, in each case, what the criteria are. The array of postdissectors includes a length, so we don't need to separately keep track of the number of postdissectors. Clean up indentation while we're at it. Change-Id: I71d4025848206d144bc54cc82941089a50e80ab7 Reviewed-on: https://code.wireshark.org/review/21029 Reviewed-by: Guy Harris --- sharkd.c | 40 +++++++++++++++++++++++++++++----------- 1 file changed, 29 insertions(+), 11 deletions(-) (limited to 'sharkd.c') diff --git a/sharkd.c b/sharkd.c index 712e73117d..666e46a652 100644 --- a/sharkd.c +++ b/sharkd.c @@ -364,12 +364,20 @@ load_cap_file(capture_file *cf, int max_packet_count, gint64 max_byte_count) cf->frames = new_frame_data_sequence(); { - gboolean create_proto_tree = FALSE; - - /* If we're going to be applying a filter, we'll need to - create a protocol tree against which to apply the filter. */ - if (cf->rfcode || cf->dfcode) - create_proto_tree = TRUE; + gboolean create_proto_tree; + + /* + * Determine whether we need to create a protocol tree. + * We do if: + * + * we're going to apply a read filter; + * + * we're going to apply a display filter; + * + * a postdissector wants field values on the first pass. + */ + create_proto_tree = + (cf->rfcode != NULL || cf->dfcode != NULL || postdissectors_want_fields()); /* We're not going to display the protocol tree on this pass, so it's not going to be "visible". */ @@ -809,21 +817,31 @@ sharkd_retap(void) int err; char *err_info = NULL; - gboolean filtering_tap_listeners; guint tap_flags; - gboolean construct_protocol_tree; + gboolean create_proto_tree; epan_dissect_t edt; column_info *cinfo; - filtering_tap_listeners = have_filtering_tap_listeners(); + /* Get the union of the flags for all tap listeners. */ tap_flags = union_of_tap_listener_flags(); - construct_protocol_tree = filtering_tap_listeners || (tap_flags & TL_REQUIRES_PROTO_TREE); + /* If any tap listeners require the columns, construct them. */ cinfo = (tap_flags & TL_REQUIRES_COLUMNS) ? &cfile.cinfo : NULL; + /* + * Determine whether we need to create a protocol tree. + * We do if: + * + * one of the tap listeners is going to apply a filter; + * + * one of the tap listeners requires a protocol tree. + */ + create_proto_tree = + (have_filtering_tap_listeners() || (tap_flags & TL_REQUIRES_PROTO_TREE)); + wtap_phdr_init(&phdr); ws_buffer_init(&buf, 1500); - epan_dissect_init(&edt, cfile.epan, construct_protocol_tree, FALSE); + epan_dissect_init(&edt, cfile.epan, create_proto_tree, FALSE); reset_tap_listeners(); -- cgit v1.2.1