aboutsummaryrefslogtreecommitdiffstats
path: root/tshark.c
diff options
context:
space:
mode:
authorGuy Harris <guy@alum.mit.edu>2017-12-07 19:31:43 -0800
committerGuy Harris <guy@alum.mit.edu>2017-12-08 03:32:25 +0000
commit797d2f6a87607b146a2ef62e1ff501031dce8212 (patch)
tree7c18adbd5b86d5f2843dd760f6fa492f7c05fef4 /tshark.c
parent0baa4458c5780b143ad4479d387202ddf4add06f (diff)
Move the frame_set stuff back into the capture_file structure.
libwireshark now expects an epan_t to be created with a pointer to a "packet provider" structure; that structure is opaque within libwireshark, and a pointer to it is passed to the callbacks that provide interface names, interface, descriptions, user comments, and packet time stamps, and that set user comments. The code that calls epan_new() is expected to provide those callbacks, and to define the structure, which can be used by the providers. If none of the callbacks need that extra information, the "packet provider" structure can be null. Have a "file" packet provider for all the programs that provide packets from a file. Change-Id: I4b5709a3dd7b098ebd7d2a7d95bcdd7b5903c1a0 Reviewed-on: https://code.wireshark.org/review/24731 Reviewed-by: Guy Harris <guy@alum.mit.edu>
Diffstat (limited to 'tshark.c')
-rw-r--r--tshark.c143
1 files changed, 71 insertions, 72 deletions
diff --git a/tshark.c b/tshark.c
index 4c82ee6423..07a828983e 100644
--- a/tshark.c
+++ b/tshark.c
@@ -2199,9 +2199,9 @@ main(int argc, char *argv[])
g_free(cf_name);
- if (cfile.frame_set_info.frames != NULL) {
- free_frame_data_sequence(cfile.frame_set_info.frames);
- cfile.frame_set_info.frames = NULL;
+ if (cfile.provider.frames != NULL) {
+ free_frame_data_sequence(cfile.provider.frames);
+ cfile.provider.frames = NULL;
}
draw_tap_listeners(TRUE);
@@ -2343,19 +2343,19 @@ pipe_input_set_handler(gint source, gpointer user_data, ws_process_id *child_pro
}
static const nstime_t *
-tshark_get_frame_ts(frame_set *fs, guint32 frame_num)
+tshark_get_frame_ts(struct packet_provider *prov, guint32 frame_num)
{
- if (fs->ref && fs->ref->num == frame_num)
- return &fs->ref->abs_ts;
+ if (prov->ref && prov->ref->num == frame_num)
+ return &prov->ref->abs_ts;
- if (fs->prev_dis && fs->prev_dis->num == frame_num)
- return &fs->prev_dis->abs_ts;
+ if (prov->prev_dis && prov->prev_dis->num == frame_num)
+ return &prov->prev_dis->abs_ts;
- if (fs->prev_cap && fs->prev_cap->num == frame_num)
- return &fs->prev_cap->abs_ts;
+ if (prov->prev_cap && prov->prev_cap->num == frame_num)
+ return &prov->prev_cap->abs_ts;
- if (fs->frames) {
- frame_data *fd = frame_data_sequence_find(fs->frames, frame_num);
+ if (prov->frames) {
+ frame_data *fd = frame_data_sequence_find(prov->frames, frame_num);
return (fd) ? &fd->abs_ts : NULL;
}
@@ -2366,12 +2366,11 @@ tshark_get_frame_ts(frame_set *fs, guint32 frame_num)
static epan_t *
tshark_epan_new(capture_file *cf)
{
- epan_t *epan = epan_new();
+ epan_t *epan = epan_new(&cf->provider);
- epan->fs = &cf->frame_set_info;
epan->get_frame_ts = tshark_get_frame_ts;
- epan->get_interface_name = frame_set_get_interface_name;
- epan->get_interface_description = frame_set_get_interface_description;
+ epan->get_interface_name = cap_file_provider_get_interface_name;
+ epan->get_interface_description = cap_file_provider_get_interface_description;
epan->get_user_comment = NULL;
return epan;
@@ -2578,9 +2577,9 @@ capture_input_new_file(capture_session *cap_session, gchar *new_file)
/* we start a new capture file, close the old one (if we had one before) */
if (cf->state != FILE_CLOSED) {
- if (cf->frame_set_info.wth != NULL) {
- wtap_close(cf->frame_set_info.wth);
- cf->frame_set_info.wth = NULL;
+ if (cf->provider.wth != NULL) {
+ wtap_close(cf->provider.wth);
+ cf->provider.wth = NULL;
}
cf->state = FILE_CLOSED;
}
@@ -2683,19 +2682,19 @@ capture_input_new_packets(capture_session *cap_session, int to_read)
("packet_details" is true). */
edt = epan_dissect_new(cf->epan, create_proto_tree, print_packet_info && print_details);
- while (to_read-- && cf->frame_set_info.wth) {
- wtap_cleareof(cf->frame_set_info.wth);
- ret = wtap_read(cf->frame_set_info.wth, &err, &err_info, &data_offset);
+ while (to_read-- && cf->provider.wth) {
+ wtap_cleareof(cf->provider.wth);
+ ret = wtap_read(cf->provider.wth, &err, &err_info, &data_offset);
reset_epan_mem(cf, edt, create_proto_tree, print_packet_info && print_details);
if (ret == FALSE) {
/* read from file failed, tell the capture child to stop */
sync_pipe_stop(cap_session);
- wtap_close(cf->frame_set_info.wth);
- cf->frame_set_info.wth = NULL;
+ wtap_close(cf->provider.wth);
+ cf->provider.wth = NULL;
} else {
ret = process_packet_single_pass(cf, edt, data_offset,
- wtap_phdr(cf->frame_set_info.wth),
- wtap_buf_ptr(cf->frame_set_info.wth), tap_flags);
+ wtap_phdr(cf->provider.wth),
+ wtap_buf_ptr(cf->provider.wth), tap_flags);
}
if (ret != FALSE) {
/* packet successfully read and gone through the "Read Filter" */
@@ -2799,8 +2798,8 @@ capture_input_closed(capture_session *cap_session, gchar *msg)
report_counts();
- if (cf != NULL && cf->frame_set_info.wth != NULL) {
- wtap_close(cf->frame_set_info.wth);
+ if (cf != NULL && cf->provider.wth != NULL) {
+ wtap_close(cf->provider.wth);
if (cf->is_tempfile) {
ws_unlink(cf->filename);
}
@@ -2908,10 +2907,10 @@ process_packet_first_pass(capture_file *cf, epan_dissect_t *edt,
prime_epan_dissect_with_postdissector_wanted_hfids(edt);
frame_data_set_before_dissect(&fdlocal, &cf->elapsed_time,
- &cf->frame_set_info.ref, cf->frame_set_info.prev_dis);
- if (cf->frame_set_info.ref == &fdlocal) {
+ &cf->provider.ref, cf->provider.prev_dis);
+ if (cf->provider.ref == &fdlocal) {
ref_frame = fdlocal;
- cf->frame_set_info.ref = &ref_frame;
+ cf->provider.ref = &ref_frame;
}
epan_dissect_run(edt, cf->cd_t, whdr, frame_tvbuff_new(&fdlocal, pd), &fdlocal, NULL);
@@ -2923,7 +2922,7 @@ process_packet_first_pass(capture_file *cf, epan_dissect_t *edt,
if (passed) {
frame_data_set_after_dissect(&fdlocal, &cum_bytes);
- cf->frame_set_info.prev_cap = cf->frame_set_info.prev_dis = frame_data_sequence_add(cf->frame_set_info.frames, &fdlocal);
+ cf->provider.prev_cap = cf->provider.prev_dis = frame_data_sequence_add(cf->provider.frames, &fdlocal);
/* If we're not doing dissection then there won't be any dependent frames.
* More importantly, edt.pi.dependent_frames won't be initialized because
@@ -2933,7 +2932,7 @@ process_packet_first_pass(capture_file *cf, epan_dissect_t *edt,
*/
if (edt && cf->dfcode) {
if (dfilter_apply_edt(cf->dfcode, edt)) {
- g_slist_foreach(edt->pi.dependent_frames, find_and_mark_frame_depended_upon, cf->frame_set_info.frames);
+ g_slist_foreach(edt->pi.dependent_frames, find_and_mark_frame_depended_upon, cf->provider.frames);
}
}
@@ -2993,10 +2992,10 @@ process_packet_second_pass(capture_file *cf, epan_dissect_t *edt,
cinfo = NULL;
frame_data_set_before_dissect(fdata, &cf->elapsed_time,
- &cf->frame_set_info.ref, cf->frame_set_info.prev_dis);
- if (cf->frame_set_info.ref == fdata) {
+ &cf->provider.ref, cf->provider.prev_dis);
+ if (cf->provider.ref == fdata) {
ref_frame = *fdata;
- cf->frame_set_info.ref = &ref_frame;
+ cf->provider.ref = &ref_frame;
}
if (dissect_color) {
@@ -3030,9 +3029,9 @@ process_packet_second_pass(capture_file *cf, epan_dissect_t *edt,
exit(2);
}
}
- cf->frame_set_info.prev_dis = fdata;
+ cf->provider.prev_dis = fdata;
}
- cf->frame_set_info.prev_cap = fdata;
+ cf->provider.prev_cap = fdata;
if (edt) {
epan_dissect_reset(edt);
@@ -3064,27 +3063,27 @@ process_cap_file(capture_file *cf, char *save_file, int out_file_type,
wtap_phdr_init(&phdr);
- idb_inf = wtap_file_get_idb_info(cf->frame_set_info.wth);
+ idb_inf = wtap_file_get_idb_info(cf->provider.wth);
#ifdef PCAP_NG_DEFAULT
if (idb_inf->interface_data->len > 1) {
linktype = WTAP_ENCAP_PER_PACKET;
} else {
- linktype = wtap_file_encap(cf->frame_set_info.wth);
+ linktype = wtap_file_encap(cf->provider.wth);
}
#else
- linktype = wtap_file_encap(cf->frame_set_info.wth);
+ linktype = wtap_file_encap(cf->provider.wth);
#endif
if (save_file != NULL) {
/* Set up to write to the capture file. */
- snapshot_length = wtap_snapshot_length(cf->frame_set_info.wth);
+ snapshot_length = wtap_snapshot_length(cf->provider.wth);
if (snapshot_length == 0) {
/* Snapshot length of input file not known. */
snapshot_length = WTAP_MAX_PACKET_SIZE_STANDARD;
}
tshark_debug("tshark: snapshot_length = %d", snapshot_length);
- shb_hdrs = wtap_file_get_shb_for_new_file(cf->frame_set_info.wth);
- nrb_hdrs = wtap_file_get_nrb_for_new_file(cf->frame_set_info.wth);
+ shb_hdrs = wtap_file_get_shb_for_new_file(cf->provider.wth);
+ nrb_hdrs = wtap_file_get_nrb_for_new_file(cf->provider.wth);
/* If we don't have an application name add Tshark */
if (wtap_block_get_string_option_value(g_array_index(shb_hdrs, wtap_block_t, 0), OPT_SHB_USERAPPL, &shb_user_appl) != WTAP_OPTTYPE_SUCCESS) {
@@ -3151,7 +3150,7 @@ process_cap_file(capture_file *cf, char *save_file, int out_file_type,
tshark_debug("tshark: perform_two_pass_analysis, do_dissection=%s", do_dissection ? "TRUE" : "FALSE");
/* Allocate a frame_data_sequence for all the frames. */
- cf->frame_set_info.frames = new_frame_data_sequence();
+ cf->provider.frames = new_frame_data_sequence();
if (do_dissection) {
gboolean create_proto_tree;
@@ -3178,9 +3177,9 @@ process_cap_file(capture_file *cf, char *save_file, int out_file_type,
}
tshark_debug("tshark: reading records for first pass");
- while (wtap_read(cf->frame_set_info.wth, &err, &err_info, &data_offset)) {
- if (process_packet_first_pass(cf, edt, data_offset, wtap_phdr(cf->frame_set_info.wth),
- wtap_buf_ptr(cf->frame_set_info.wth))) {
+ while (wtap_read(cf->provider.wth, &err, &err_info, &data_offset)) {
+ if (process_packet_first_pass(cf, edt, data_offset, wtap_phdr(cf->provider.wth),
+ wtap_buf_ptr(cf->provider.wth))) {
/* Stop reading if we have the maximum number of packets;
* When the -c option has not been used, max_packet_count
* starts at 0, which practically means, never stop reading.
@@ -3215,14 +3214,14 @@ process_cap_file(capture_file *cf, char *save_file, int out_file_type,
}
/* Close the sequential I/O side, to free up memory it requires. */
- wtap_sequential_close(cf->frame_set_info.wth);
+ wtap_sequential_close(cf->provider.wth);
/* Allow the protocol dissectors to free up memory that they
* don't need after the sequential run-through of the packets. */
postseq_cleanup_all_protocols();
- cf->frame_set_info.prev_dis = NULL;
- cf->frame_set_info.prev_cap = NULL;
+ cf->provider.prev_dis = NULL;
+ cf->provider.prev_cap = NULL;
ws_buffer_init(&buf, 1500);
tshark_debug("tshark: done with first pass");
@@ -3257,8 +3256,8 @@ process_cap_file(capture_file *cf, char *save_file, int out_file_type,
}
for (framenum = 1; err == 0 && framenum <= cf->count; framenum++) {
- fdata = frame_data_sequence_find(cf->frame_set_info.frames, framenum);
- if (wtap_seek_read(cf->frame_set_info.wth, fdata->file_off, &phdr, &buf, &err,
+ fdata = frame_data_sequence_find(cf->provider.frames, framenum);
+ if (wtap_seek_read(cf->provider.wth, fdata->file_off, &phdr, &buf, &err,
&err_info)) {
tshark_debug("tshark: invoking process_packet_second_pass() for frame #%d", framenum);
if (process_packet_second_pass(cf, edt, fdata, &phdr, &buf,
@@ -3338,21 +3337,21 @@ process_cap_file(capture_file *cf, char *save_file, int out_file_type,
edt = epan_dissect_new(cf->epan, create_proto_tree, print_packet_info && print_details);
}
- while (wtap_read(cf->frame_set_info.wth, &err, &err_info, &data_offset)) {
+ while (wtap_read(cf->provider.wth, &err, &err_info, &data_offset)) {
framenum++;
tshark_debug("tshark: processing packet #%d", framenum);
reset_epan_mem(cf, edt, create_proto_tree, print_packet_info && print_details);
- if (process_packet_single_pass(cf, edt, data_offset, wtap_phdr(cf->frame_set_info.wth),
- wtap_buf_ptr(cf->frame_set_info.wth), tap_flags)) {
+ if (process_packet_single_pass(cf, edt, data_offset, wtap_phdr(cf->provider.wth),
+ wtap_buf_ptr(cf->provider.wth), tap_flags)) {
/* Either there's no read filtering or this packet passed the
filter, so, if we're writing to a capture file, write
this packet out. */
if (pdh != NULL) {
tshark_debug("tshark: writing packet #%d to outfile", framenum);
- if (!wtap_dump(pdh, wtap_phdr(cf->frame_set_info.wth), wtap_buf_ptr(cf->frame_set_info.wth), &err, &err_info)) {
+ if (!wtap_dump(pdh, wtap_phdr(cf->provider.wth), wtap_buf_ptr(cf->provider.wth), &err, &err_info)) {
/* Error writing to a capture file */
tshark_debug("tshark: error writing to a capture file (%d)", err);
cfile_write_failure_message("TShark", cf->filename, save_file,
@@ -3445,8 +3444,8 @@ process_cap_file(capture_file *cf, char *save_file, int out_file_type,
}
out:
- wtap_close(cf->frame_set_info.wth);
- cf->frame_set_info.wth = NULL;
+ wtap_close(cf->provider.wth);
+ cf->provider.wth = NULL;
wtap_block_array_free(shb_hdrs);
wtap_block_array_free(nrb_hdrs);
@@ -3508,10 +3507,10 @@ process_packet_single_pass(capture_file *cf, epan_dissect_t *edt, gint64 offset,
cinfo = NULL;
frame_data_set_before_dissect(&fdata, &cf->elapsed_time,
- &cf->frame_set_info.ref, cf->frame_set_info.prev_dis);
- if (cf->frame_set_info.ref == &fdata) {
+ &cf->provider.ref, cf->provider.prev_dis);
+ if (cf->provider.ref == &fdata) {
ref_frame = fdata;
- cf->frame_set_info.ref = &ref_frame;
+ cf->provider.ref = &ref_frame;
}
if (dissect_color) {
@@ -3550,11 +3549,11 @@ process_packet_single_pass(capture_file *cf, epan_dissect_t *edt, gint64 offset,
/* this must be set after print_packet() [bug #8160] */
prev_dis_frame = fdata;
- cf->frame_set_info.prev_dis = &prev_dis_frame;
+ cf->provider.prev_dis = &prev_dis_frame;
}
prev_cap_frame = fdata;
- cf->frame_set_info.prev_cap = &prev_cap_frame;
+ cf->provider.prev_cap = &prev_cap_frame;
if (edt) {
epan_dissect_reset(edt);
@@ -4031,7 +4030,7 @@ cf_open(capture_file *cf, const char *fname, unsigned int type, gboolean is_temp
epan_free(cf->epan);
cf->epan = tshark_epan_new(cf);
- cf->frame_set_info.wth = wth;
+ cf->provider.wth = wth;
cf->f_datalen = 0; /* not used, but set it anyway */
/* Set the file name because we need it to set the follow stream filter.
@@ -4045,21 +4044,21 @@ cf_open(capture_file *cf, const char *fname, unsigned int type, gboolean is_temp
/* No user changes yet. */
cf->unsaved_changes = FALSE;
- cf->cd_t = wtap_file_type_subtype(cf->frame_set_info.wth);
+ cf->cd_t = wtap_file_type_subtype(cf->provider.wth);
cf->open_type = type;
cf->count = 0;
cf->drops_known = FALSE;
cf->drops = 0;
- cf->snap = wtap_snapshot_length(cf->frame_set_info.wth);
+ cf->snap = wtap_snapshot_length(cf->provider.wth);
nstime_set_zero(&cf->elapsed_time);
- cf->frame_set_info.ref = NULL;
- cf->frame_set_info.prev_dis = NULL;
- cf->frame_set_info.prev_cap = NULL;
+ cf->provider.ref = NULL;
+ cf->provider.prev_dis = NULL;
+ cf->provider.prev_cap = NULL;
cf->state = FILE_READ_IN_PROGRESS;
- wtap_set_cb_new_ipv4(cf->frame_set_info.wth, add_ipv4_name);
- wtap_set_cb_new_ipv6(cf->frame_set_info.wth, (wtap_new_ipv6_callback_t) add_ipv6_name);
+ wtap_set_cb_new_ipv4(cf->provider.wth, add_ipv4_name);
+ wtap_set_cb_new_ipv6(cf->provider.wth, (wtap_new_ipv6_callback_t) add_ipv6_name);
return CF_OK;