diff options
author | Pascal Quantin <pascal.quantin@gmail.com> | 2015-06-25 10:59:46 -0700 |
---|---|---|
committer | Anders Broman <a.broman58@gmail.com> | 2015-06-25 20:28:13 +0000 |
commit | 5bc38611fdb9b497be2dae23b1b16bbf44097717 (patch) | |
tree | d1ee1137a6e98f2c164f69fdb2a784a79ef5b084 /mergecap.c | |
parent | b0584aec1b0c18ed3a8919718a374e963ad1736a (diff) |
mergecap: check input files time precision before exporting to pcapng format
Bug: 11202
Change-Id: I0891235e9fd41687a12eb8c7e05048e25de3d8b9
Reviewed-on: https://code.wireshark.org/review/9137
Reviewed-by: Pascal Quantin <pascal.quantin@gmail.com>
Petri-Dish: Pascal Quantin <pascal.quantin@gmail.com>
Reviewed-by: Evan Huus <eapache@gmail.com>
Reviewed-by: Peter Wu <peter@lekensteyn.nl>
Reviewed-by: Anders Broman <a.broman58@gmail.com>
Diffstat (limited to 'mergecap.c')
-rw-r--r-- | mergecap.c | 41 |
1 files changed, 39 insertions, 2 deletions
diff --git a/mergecap.c b/mergecap.c index 0eb9bebca2..2af10dea19 100644 --- a/mergecap.c +++ b/mergecap.c @@ -58,6 +58,7 @@ #include <wsutil/ws_version_info.h> #include <wiretap/merge.h> +#include <wiretap/pcap-encap.h> #ifdef HAVE_FCNTL_H #include <fcntl.h> @@ -457,7 +458,7 @@ DIAG_ON(cast-qual) for (i = 0; i < in_file_count; i++) { idb_inf_merge_file = wtap_file_get_idb_info(in_files[i].wth); for (itf_count = 0; itf_count < idb_inf_merge_file->interface_data->len; itf_count++) { - /* read the interface data from the in file to our combined interface data */ + /* read the interface data from the in file to our combined interface data */ file_int_data = &g_array_index (idb_inf_merge_file->interface_data, wtapng_if_descr_t, itf_count); int_data.wtap_encap = file_int_data->wtap_encap; int_data.time_units_per_second = file_int_data->time_units_per_second; @@ -467,7 +468,7 @@ DIAG_ON(cast-qual) int_data.opt_comment = NULL; int_data.if_description = NULL; int_data.if_speed = 0; - int_data.if_tsresol = 6; + int_data.if_tsresol = file_int_data->if_tsresol; int_data.if_filter_str = NULL; int_data.bpf_filter_len = 0; int_data.if_filter_bpf_bytes = NULL; @@ -484,6 +485,42 @@ DIAG_ON(cast-qual) in_files[i].interface_id = itf_id; itf_id += itf_count; } + } else { + guint8 if_tsresol = 6; + guint64 time_units_per_second = 1000000; + for (i = 0; i < in_file_count; i++) { + idb_inf_merge_file = wtap_file_get_idb_info(in_files[i].wth); + for (itf_count = 0; itf_count < idb_inf_merge_file->interface_data->len; itf_count++) { + file_int_data = &g_array_index (idb_inf_merge_file->interface_data, wtapng_if_descr_t, itf_count); + if (file_int_data->time_units_per_second > time_units_per_second) { + time_units_per_second = file_int_data->time_units_per_second; + if_tsresol = file_int_data->if_tsresol; + } + } + g_free(idb_inf_merge_file); + } + if (time_units_per_second > 1000000) { + /* We are using a better than microsecond precision; let's create a fake IDB */ + idb_inf = g_new(wtapng_iface_descriptions_t,1); + idb_inf->interface_data = g_array_new(FALSE, FALSE, sizeof(wtapng_if_descr_t)); + int_data.wtap_encap = frame_type; + int_data.time_units_per_second = time_units_per_second; + int_data.link_type = wtap_wtap_encap_to_pcap_encap(frame_type); + int_data.snap_len = snaplen; + int_data.if_name = g_strdup("Unknown/not available in original file format(libpcap)"); + int_data.opt_comment = NULL; + int_data.if_description = NULL; + int_data.if_speed = 0; + int_data.if_tsresol = if_tsresol; + int_data.if_filter_str = NULL; + int_data.bpf_filter_len = 0; + int_data.if_filter_bpf_bytes = NULL; + int_data.if_os = NULL; + int_data.if_fcslen = -1; + int_data.num_stat_entries = 0; /* Number of ISB:s */ + int_data.interface_statistics = NULL; + g_array_append_val(idb_inf->interface_data, int_data); + } } pdh = wtap_dump_fdopen_ng(out_fd, file_type, frame_type, snaplen, |