diff options
author | Jakub Zawadzki <darkjames-ws@darkjames.pl> | 2012-10-20 16:44:55 +0000 |
---|---|---|
committer | Jakub Zawadzki <darkjames-ws@darkjames.pl> | 2012-10-20 16:44:55 +0000 |
commit | 6dc977b7d2b0f807d21ef2978fc81e10c7bb00be (patch) | |
tree | 0c6da35ae86bed058518c5e735584125f4324ffa /file.c | |
parent | ef72e0eed38a07340f7242bdaf6c9b7e53ef6428 (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.c | 85 |
1 files changed, 52 insertions, 33 deletions
@@ -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; |