diff options
author | Guy Harris <guy@alum.mit.edu> | 2017-04-11 19:53:48 -0700 |
---|---|---|
committer | Guy Harris <guy@alum.mit.edu> | 2017-04-12 04:31:19 +0000 |
commit | c0792555392f234ab96917e784d365b5de053836 (patch) | |
tree | 02c053696f2fbd0a6b05ae239b5460d1c551a64f /sharkd.c | |
parent | aa9a0b3bf831395dc1cfbaea7f467faed952dbf9 (diff) | |
download | wireshark-c0792555392f234ab96917e784d365b5de053836.tar.gz |
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 <guy@alum.mit.edu>
Diffstat (limited to 'sharkd.c')
-rw-r--r-- | sharkd.c | 40 |
1 files changed, 29 insertions, 11 deletions
@@ -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(); |