Add support for getting nanosecond time stamp resolution when capturing.
authorGuy Harris <guy@alum.mit.edu>
Sun, 28 Sep 2014 23:28:36 +0000 (16:28 -0700)
committerGuy Harris <guy@alum.mit.edu>
Sun, 28 Sep 2014 23:29:05 +0000 (23:29 +0000)
If we have pcap_set_tstamp_precision(), use it to request nanosecond
time stamp resolution *if* we're writing a pcap-ng file; any code that
reads those files and can't handle nanosecond time stamp resolution is
broken and needs to be fixed.

If we're writing a pcap file, don't ask for nanosecond resolution time
stamps, as that requires a different magic number for pcap files, and
not all code that reads pcap files can handle that.  (Unlike pcap-ng,
where the ability to have non-microsecond time stamp resolution was
present from Day One, it's a relatively recent addition to pcap.)  We
could add a command-line option/GUI option for that, like the option
recent versions of tcpdump have, if it matters.

Change-Id: I8fa464eb929feecb9a70be70712502c9f0cc5270
Reviewed-on: https://code.wireshark.org/review/4355
Reviewed-by: Guy Harris <guy@alum.mit.edu>
acinclude.m4
cmake/modules/FindPCAP.cmake
cmakeconfig.h.in
dumpcap.c

index fec5fc8a456290a74e222198a2b68e2adfb66103..4b89b35dd3db880aec176a1b91201eb30ec44d02 100644 (file)
@@ -627,7 +627,7 @@ install a newer version of the header file.])
          AC_CHECK_FUNCS(pcap_datalink_val_to_description)
          AC_CHECK_FUNCS(pcap_list_datalinks pcap_set_datalink pcap_lib_version)
          AC_CHECK_FUNCS(pcap_get_selectable_fd pcap_free_datalinks)
-         AC_CHECK_FUNCS(pcap_create bpf_image)
+         AC_CHECK_FUNCS(pcap_create bpf_image pcap_set_tstamp_precision)
        fi
        LIBS="$ac_save_LIBS"
 ])
index 268b3e1a22b6983280dcd5469b8a7bd5da5795b3..9e29881618c2d93e1bd4ba47ef2b61b404794592 100644 (file)
@@ -77,6 +77,7 @@ check_function_exists( "pcap_list_datalinks" HAVE_PCAP_LIST_DATALINKS )
 check_function_exists( "pcap_set_datalink" HAVE_PCAP_SET_DATALINK )
 check_function_exists( "bpf_image" HAVE_BPF_IMAGE )
 check_function_exists( "pcap_setsampling" HAVE_PCAP_SETSAMPLING )
+check_function_exists( "pcap_set_tstamp_precision" HAVE_PCAP_SET_TSTAMP_PRECISION )
 # Remote pcap checks
 check_function_exists( "pcap_open" HAVE_PCAP_OPEN )
 check_function_exists( "pcap_findalldevs_ex" H_FINDALLDEVS_EX )
index 5265de4ca2405f3f7b5eace3216f39f83af9d426..fe7b916be10bab920728bdcf07bbfb5645408a44 100644 (file)
 /* Define to 1 if you have the `pcap_set_datalink' function. */
 #cmakedefine HAVE_PCAP_SET_DATALINK 1
 
-/* Define to 1 if you have the `pcap_setsampling" function. */
+/* Define to 1 if you have the `pcap_setsampling' function. */
 #cmakedefine HAVE_PCAP_SETSAMPLING 1
 
+/* Define to 1 if you have the `pcap_set_tstamp_precision' function. */
+#cmakedefine HAVE_PCAP_SET_TSTAMP_PRECISION 1
+
 /* Define to 1 if you have the <portaudio.h> header file. */
 #cmakedefine HAVE_PORTAUDIO_H 1
 
index 0ae6bac38f26e2106a8674e5051e4828ad1e0cb6..809ce6cf0211ef8df9d593d02bf26fe9df486d94 100644 (file)
--- a/dumpcap.c
+++ b/dumpcap.c
@@ -714,6 +714,31 @@ open_capture_device(interface_options *interface_opts,
             pcap_set_promisc(pcap_h, interface_opts->promisc_mode);
             pcap_set_timeout(pcap_h, CAP_READ_TIMEOUT);
 
+#ifdef HAVE_PCAP_SET_TSTAMP_PRECISION
+            /*
+             * If we're writing pcap-ng files, try to enable
+             * nanosecond-resolution capture; any code that
+             * can read pcap-ng files must be able to handle
+             * nanosecond-resolution time stamps.
+             *
+             * If we're writing pcap files, don't try to enable
+             * nanosecond-resolution capture, as not all code
+             * that reads pcap files recognizes the nanosecond-
+             * resolution pcap file magic number.
+             */
+            if (capture_opts->use_pcapng) {
+                /*
+                 * The only errors this is documenting as returning
+                 * are PCAP_ERROR_TSTAMP_PRECISION_NOTSUP, which just
+                 * means we can't do nanosecond precision on this adapter,
+                 * in which case we just live with whatever resolution
+                 * we get by default, and PCAP_ERROR_ACTIVATED, which
+                 * can't happen as we haven't activated the pcap_t yet.
+                 */
+                pcap_set_tstamp_precision(pcap_h, PCAP_TSTAMP_PRECISION_NANO);
+            }
+#endif
+
             g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_DEBUG,
                   "buffersize %d.", interface_opts->buffer_size);
             if (interface_opts->buffer_size != 0) {
@@ -2638,6 +2663,12 @@ capture_loop_open_input(capture_options *capture_opts, loop_data *ld,
 
         if (pcap_opts->pcap_h != NULL) {
             /* we've opened "iface" as a network device */
+
+#ifdef HAVE_PCAP_SET_TSTAMP_PRECISION
+            /* Find out if we're getting nanosecond-precision time stamps */
+            pcap_opts->ts_nsec = pcap_get_tstamp_precision(pcap_opts->pcap_h) == PCAP_TSTAMP_PRECISION_NANO;
+#endif
+
 #ifdef _WIN32
             /* try to set the capture buffer size */
             if (interface_opts.buffer_size > 1 &&