aboutsummaryrefslogtreecommitdiffstats
path: root/mergecap.c
diff options
context:
space:
mode:
authorPascal Quantin <pascal.quantin@gmail.com>2015-06-25 10:59:46 -0700
committerAnders Broman <a.broman58@gmail.com>2015-06-25 20:28:13 +0000
commit5bc38611fdb9b497be2dae23b1b16bbf44097717 (patch)
treed1ee1137a6e98f2c164f69fdb2a784a79ef5b084 /mergecap.c
parentb0584aec1b0c18ed3a8919718a374e963ad1736a (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.c41
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,