]> The Tcpdump Group git mirrors - libpcap/blobdiff - pcap.c
Merge branch 'timestamps' of https://github.com/msekletar/libpcap
[libpcap] / pcap.c
diff --git a/pcap.c b/pcap.c
index 6feb729a27f0b74f181e820305d9f459aba38f9f..bb975ea88d00ba6f9e4518accb020df8747d6cd3 100644 (file)
--- a/pcap.c
+++ b/pcap.c
@@ -557,6 +557,7 @@ pcap_create_common(const char *source, char *ebuf, size_t size)
        p->opt.rfmon = 0;
        p->opt.immediate = 0;
        p->opt.tstamp_type = -1;        /* default to not setting time stamp type */
+       p->opt.tstamp_precision = PCAP_TSTAMP_PRECISION_MICRO;
        return (p);
 }
 
@@ -660,6 +661,38 @@ pcap_set_buffer_size(pcap_t *p, int buffer_size)
        return (0);
 }
 
+int
+pcap_set_tstamp_precision(pcap_t *p, int precision)
+{
+       if (pcap_check_activated(p))
+               return PCAP_ERROR_ACTIVATED;
+
+       if (precision == PCAP_TSTAMP_PRECISION_NANO) {
+#ifdef HAVE_LINUX_TSTAMP_NANO
+               /* We should be able to get timestamp with nanosecond precision */
+               p->opt.tstamp_precision = PCAP_TSTAMP_PRECISION_NANO;
+#else
+               /* TODO: We don't know anything about other platforms yet */
+               snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "nanosecond timestamps are not supported");
+               return PCAP_WARNING_TSTAMP_PRECISION_NOTSUP;
+#endif
+       } else if (precision == PCAP_TSTAMP_PRECISION_MICRO) {
+               p->opt.tstamp_precision = PCAP_TSTAMP_PRECISION_MICRO;
+       } else {
+               /* unknown precision requested */
+               snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "nanosecond timestamps are not supported");
+               return PCAP_WARNING_TSTAMP_PRECISION_NOTSUP;
+       }
+
+       return 0;
+}
+
+int
+pcap_get_tstamp_precision(pcap_t *p)
+{
+        return p->opt.tstamp_precision;
+}
+
 int
 pcap_activate(pcap_t *p)
 {
@@ -756,6 +789,7 @@ pcap_open_offline_common(char *ebuf, size_t size)
        if (p == NULL)
                return (NULL);
 
+       p->opt.tstamp_precision = PCAP_TSTAMP_PRECISION_MICRO;
        p->opt.source = strdup("(savefile)");
        if (p->opt.source == NULL) {
                snprintf(ebuf, PCAP_ERRBUF_SIZE, "malloc: %s",
@@ -1707,6 +1741,19 @@ pcap_cleanup_dead(pcap_t *p _U_)
        /* Nothing to do. */
 }
 
+static void
+pcap_open_dead_set_common_properties(pcap_t *p)
+{
+       p->stats_op = pcap_stats_dead;
+#ifdef WIN32
+       p->setbuff_op = pcap_setbuff_dead;
+       p->setmode_op = pcap_setmode_dead;
+       p->setmintocopy_op = pcap_setmintocopy_dead;
+#endif
+       p->cleanup_op = pcap_cleanup_dead;
+       p->activated = 1;
+}
+
 pcap_t *
 pcap_open_dead(int linktype, int snaplen)
 {
@@ -1716,19 +1763,35 @@ pcap_open_dead(int linktype, int snaplen)
        if (p == NULL)
                return NULL;
        memset (p, 0, sizeof(*p));
+
        p->snapshot = snaplen;
        p->linktype = linktype;
-       p->stats_op = pcap_stats_dead;
-#ifdef WIN32
-       p->setbuff_op = pcap_setbuff_dead;
-       p->setmode_op = pcap_setmode_dead;
-       p->setmintocopy_op = pcap_setmintocopy_dead;
-#endif
-       p->cleanup_op = pcap_cleanup_dead;
-       p->activated = 1;
+
+       pcap_open_dead_set_common_properties(p);
+
        return (p);
 }
 
+pcap_t *
+pcap_open_dead_nsectime(int linktype, int snaplen)
+{
+       pcap_t *p;
+
+       p = malloc(sizeof(*p));
+       if (!p)
+               return NULL;
+       memset(p, 0, sizeof(*p));
+
+       p->snapshot = snaplen;
+       p->linktype = linktype;
+
+       pcap_open_dead_set_common_properties(p);
+
+       p->opt.tstamp_precision = PCAP_TSTAMP_PRECISION_NANO;
+
+       return p;
+}
+
 /*
  * API compatible with WinPcap's "send a packet" routine - returns -1
  * on error, 0 otherwise.