aboutsummaryrefslogtreecommitdiffstats
path: root/file.c
diff options
context:
space:
mode:
authorJakub Zawadzki <darkjames-ws@darkjames.pl>2012-10-20 16:44:55 +0000
committerJakub Zawadzki <darkjames-ws@darkjames.pl>2012-10-20 16:44:55 +0000
commit6dc977b7d2b0f807d21ef2978fc81e10c7bb00be (patch)
tree0c6da35ae86bed058518c5e735584125f4324ffa /file.c
parentef72e0eed38a07340f7242bdaf6c9b7e53ef6428 (diff)
- Allow reseting edt with new function epan_dissect_reset(),
- initialize edt once in few places, and later reset it after dissecting (add_packet_to_packet_list), - revert r45667, probably no longer needed. svn path=/trunk/; revision=45669
Diffstat (limited to 'file.c')
-rw-r--r--file.c85
1 files changed, 52 insertions, 33 deletions
diff --git a/file.c b/file.c
index 1869f6a444..554fa5f85f 100644
--- a/file.c
+++ b/file.c
@@ -89,7 +89,7 @@ static gulong computed_elapsed;
static void cf_reset_state(capture_file *cf);
static int read_packet(capture_file *cf, dfilter_t *dfcode,
- gboolean create_proto_tree, column_info *cinfo, gint64 offset);
+ epan_dissect_t *edt, column_info *cinfo, gint64 offset);
static void rescan_packets(capture_file *cf, const char *action, const char *action_item, gboolean redissect);
@@ -495,6 +495,13 @@ calc_progbar_val(capture_file *cf, gint64 size, gint64 file_pos, gchar *status_s
return progbar_val;
}
+static void
+epan_dissect_finish(epan_dissect_t *edt)
+{
+ if (edt->tree)
+ proto_tree_free(edt->tree);
+}
+
cf_read_status_t
cf_read(capture_file *cf, gboolean reloading)
{
@@ -513,7 +520,8 @@ cf_read(capture_file *cf, gboolean reloading)
volatile gint64 progbar_quantum;
dfilter_t *dfcode;
column_info *cinfo;
- volatile gboolean create_proto_tree;
+ epan_dissect_t edt;
+ gboolean create_proto_tree;
guint tap_flags;
volatile int count = 0;
#ifdef HAVE_LIBPCAP
@@ -533,6 +541,9 @@ cf_read(capture_file *cf, gboolean reloading)
cinfo = (tap_flags & TL_REQUIRES_COLUMNS) ? &cf->cinfo : NULL;
create_proto_tree =
(dfcode != NULL || have_filtering_tap_listeners() || (tap_flags & TL_REQUIRES_PROTO_TREE));
+ epan_dissect_init(&edt, create_proto_tree, FALSE);
+ if (dfcode != NULL)
+ epan_dissect_prime_dfilter(&edt, dfcode);
reset_tap_listeners();
@@ -620,7 +631,7 @@ cf_read(capture_file *cf, gboolean reloading)
break;
}
TRY {
- read_packet(cf, dfcode, create_proto_tree, cinfo, data_offset);
+ read_packet(cf, dfcode, &edt, cinfo, data_offset);
}
CATCH(OutOfMemoryError) {
simple_message_box(ESD_TYPE_ERROR, NULL,
@@ -637,6 +648,7 @@ cf_read(capture_file *cf, gboolean reloading)
}
ENDTRY;
}
+ epan_dissect_finish(&edt);
/* Free the display name */
g_free(name_ptr);
@@ -764,14 +776,15 @@ cf_start_tail(capture_file *cf, const char *fname, gboolean is_tempfile, int *er
cf_read_status_t
cf_continue_tail(capture_file *cf, volatile int to_read, int *err)
{
- gint64 data_offset = 0;
- gchar *err_info;
- volatile int newly_displayed_packets = 0;
- dfilter_t *dfcode;
- column_info *cinfo;
- volatile gboolean create_proto_tree;
- guint tap_flags;
- gboolean compiled;
+ gint64 data_offset = 0;
+ gchar *err_info;
+ volatile int newly_displayed_packets = 0;
+ dfilter_t *dfcode;
+ column_info *cinfo;
+ epan_dissect_t edt;
+ gboolean create_proto_tree;
+ guint tap_flags;
+ gboolean compiled;
/* Compile the current display filter.
* We assume this will not fail since cf->dfilter is only set in
@@ -785,6 +798,9 @@ cf_continue_tail(capture_file *cf, volatile int to_read, int *err)
cinfo = (tap_flags & TL_REQUIRES_COLUMNS) ? &cf->cinfo : NULL;
create_proto_tree =
(dfcode != NULL || have_filtering_tap_listeners() || (tap_flags & TL_REQUIRES_PROTO_TREE));
+ epan_dissect_init(&edt, create_proto_tree, FALSE);
+ if (dfcode != NULL)
+ epan_dissect_prime_dfilter(&edt, dfcode);
*err = 0;
@@ -806,7 +822,7 @@ cf_continue_tail(capture_file *cf, volatile int to_read, int *err)
break;
}
TRY{
- if (read_packet(cf, dfcode, create_proto_tree, cinfo,
+ if (read_packet(cf, dfcode, &edt, cinfo,
data_offset) != -1) {
newly_displayed_packets++;
}
@@ -827,6 +843,7 @@ cf_continue_tail(capture_file *cf, volatile int to_read, int *err)
ENDTRY;
to_read--;
}
+ epan_dissect_finish(&edt);
/* Update the file encapsulation; it might have changed based on the
packets we've read. */
@@ -885,6 +902,7 @@ cf_finish_tail(capture_file *cf, int *err)
dfilter_t *dfcode;
column_info *cinfo;
gboolean create_proto_tree;
+ epan_dissect_t edt;
guint tap_flags;
gboolean compiled;
@@ -900,6 +918,9 @@ cf_finish_tail(capture_file *cf, int *err)
cinfo = (tap_flags & TL_REQUIRES_COLUMNS) ? &cf->cinfo : NULL;
create_proto_tree =
(dfcode != NULL || have_filtering_tap_listeners() || (tap_flags & TL_REQUIRES_PROTO_TREE));
+ epan_dissect_init(&edt, create_proto_tree, FALSE);
+ if (dfcode != NULL)
+ epan_dissect_prime_dfilter(&edt, dfcode);
if (cf->wth == NULL) {
cf_close(cf);
@@ -917,8 +938,9 @@ cf_finish_tail(capture_file *cf, int *err)
aren't any packets left to read) exit. */
break;
}
- read_packet(cf, dfcode, create_proto_tree, cinfo, data_offset);
+ read_packet(cf, dfcode, &edt, cinfo, data_offset);
}
+ epan_dissect_finish(&edt);
/* Cleanup and release all dfilter resources */
if (dfcode != NULL) {
@@ -1089,38 +1111,30 @@ find_and_mark_frame_depended_upon(gpointer data, gpointer user_data)
static int
add_packet_to_packet_list(frame_data *fdata, capture_file *cf,
- dfilter_t *dfcode, gboolean create_proto_tree, column_info *cinfo,
+ dfilter_t *dfcode, epan_dissect_t *edt, column_info *cinfo,
struct wtap_pkthdr *phdr, const guchar *buf,
gboolean add_to_packet_list)
{
- epan_dissect_t edt;
- gint row = -1;
+ gint row = -1;
frame_data_set_before_dissect(fdata, &cf->elapsed_time,
&first_ts, prev_dis, prev_cap);
prev_cap = fdata;
- /* Dissect the frame. */
- epan_dissect_init(&edt, create_proto_tree, FALSE);
-
- if (dfcode != NULL) {
- epan_dissect_prime_dfilter(&edt, dfcode);
- }
-
- tap_queue_init(&edt);
- epan_dissect_run(&edt, phdr, buf, fdata, cinfo);
- tap_push_tapped_queue(&edt);
+ tap_queue_init(edt);
+ epan_dissect_run(edt, phdr, buf, fdata, cinfo);
+ tap_push_tapped_queue(edt);
/* If we don't have a display filter, set "passed_dfilter" to 1. */
if (dfcode != NULL) {
- fdata->flags.passed_dfilter = dfilter_apply_edt(dfcode, &edt) ? 1 : 0;
+ fdata->flags.passed_dfilter = dfilter_apply_edt(dfcode, edt) ? 1 : 0;
if (fdata->flags.passed_dfilter) {
/* This frame passed the display filter but it may depend on other
* (potentially not displayed) frames. Find those frames and mark them
* as depended upon.
*/
- g_slist_foreach(edt.pi.dependent_frames, find_and_mark_frame_depended_upon, cf);
+ g_slist_foreach(edt->pi.dependent_frames, find_and_mark_frame_depended_upon, cf);
}
} else
fdata->flags.passed_dfilter = 1;
@@ -1130,7 +1144,7 @@ add_packet_to_packet_list(frame_data *fdata, capture_file *cf,
if (add_to_packet_list) {
/* We fill the needed columns from new_packet_list */
- row = packet_list_append(cinfo, fdata, &edt.pi);
+ row = packet_list_append(cinfo, fdata, &edt->pi);
}
if (fdata->flags.passed_dfilter || fdata->flags.ref_time)
@@ -1158,7 +1172,7 @@ add_packet_to_packet_list(frame_data *fdata, capture_file *cf,
cf->last_displayed = fdata->num;
}
- epan_dissect_cleanup(&edt);
+ epan_dissect_reset(edt);
return row;
}
@@ -1166,7 +1180,7 @@ add_packet_to_packet_list(frame_data *fdata, capture_file *cf,
/* returns the row of the new packet in the packet list or -1 if not displayed */
static int
read_packet(capture_file *cf, dfilter_t *dfcode,
- gboolean create_proto_tree, column_info *cinfo, gint64 offset)
+ epan_dissect_t *edt, column_info *cinfo, gint64 offset)
{
struct wtap_pkthdr *phdr = wtap_phdr(cf->wth);
const guchar *buf = wtap_buf_ptr(cf->wth);
@@ -1211,7 +1225,7 @@ read_packet(capture_file *cf, dfilter_t *dfcode,
if (!cf->redissecting) {
row = add_packet_to_packet_list(fdata, cf, dfcode,
- create_proto_tree, cinfo,
+ edt, cinfo,
phdr, buf, TRUE);
}
}
@@ -1752,6 +1766,7 @@ rescan_packets(capture_file *cf, const char *action, const char *action_item, gb
int progbar_quantum;
dfilter_t *dfcode;
column_info *cinfo;
+ epan_dissect_t edt;
gboolean create_proto_tree;
guint tap_flags;
gboolean add_to_packet_list = FALSE;
@@ -1770,6 +1785,9 @@ rescan_packets(capture_file *cf, const char *action, const char *action_item, gb
cinfo = (tap_flags & TL_REQUIRES_COLUMNS) ? &cf->cinfo : NULL;
create_proto_tree =
(dfcode != NULL || have_filtering_tap_listeners() || (tap_flags & TL_REQUIRES_PROTO_TREE));
+ epan_dissect_init(&edt, create_proto_tree, FALSE);
+ if (dfcode != NULL)
+ epan_dissect_prime_dfilter(&edt, dfcode);
reset_tap_listeners();
/* Which frame, if any, is the currently selected frame?
@@ -1921,7 +1939,7 @@ rescan_packets(capture_file *cf, const char *action, const char *action_item, gb
preceding_frame_num = prev_frame_num;
preceding_frame = prev_frame;
}
- add_packet_to_packet_list(fdata, cf, dfcode, create_proto_tree,
+ add_packet_to_packet_list(fdata, cf, dfcode, &edt,
cinfo, &cf->phdr, cf->pd,
add_to_packet_list);
@@ -1944,6 +1962,7 @@ rescan_packets(capture_file *cf, const char *action, const char *action_item, gb
prev_frame_num = fdata->num;
prev_frame = fdata;
}
+ epan_dissect_finish(&edt);
/* We are done redissecting the packet list. */
cf->redissecting = FALSE;